Поиск по сайту
Ctrl + K
Вопросы по Веб-разработке

Что такое preflight-запрос и когда он отправляется?

Предварительные (preflight) запросы являются важной частью механизма безопасности, связанного с CORS (Cross-Origin Resource Sharing) в веб-разработке.

Что такое CORS?

CORS — это стандарт, который позволяет ограничить доступ к ресурсам на одном домене с другого домена. Это важно для безопасности, так как без таких ограничений, злоумышленники могли бы отправлять запросы от вашего имени, используя ваши данные.

Какие бывают запросы?

Когда вы отправляете запрос с вашего фронтенда на сервер (например, с http://example.com на http://api.example.com), браузер должен удостовериться, что это безопасно. В зависимости от типа запроса, браузер может отправить preflight-запрос перед тем, как выполнить основной запрос.

Когда отправляется preflight-запрос?

Preflight-запрос отправляется для "непростых" (non-simple) запросов. Простые запросы — это те, которые используют только методы GET, POST и HEAD и определенные заголовки. Однако, если вы используете, например, метод PUT, DELETE или добавляете нестандартные заголовки, браузер выполнит preflight-запрос.

Как выглядит preflight-запрос?

Preflight-запрос — это HTTP-запрос типа OPTIONS. Он отправляется на сервер с информацией о том, какой метод, заголовки и другие параметры будут использоваться в последующем запросе. Вот простой пример такого запроса:

OPTIONS /api/resource HTTP/1.1
Host: api.example.com
Origin: http://example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header

В ответ на этот запрос сервер должен вернуть заголовки, подтверждающие, что он разрешает такие запросы:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-Custom-Header

Как обрабатывать preflight-запросы на сервере?

На сервере вы можете обрабатывать preflight-запросы, добавляя необходимые заголовки. Например, если вы используете Node.js с Express, это можно сделать так:

const express = require('express');
const app = express();

app.use((req, res, next) => {
    res.header("Access-Control-Allow-Origin", "http://example.com");
    res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    res.header("Access-Control-Allow-Headers", "X-Custom-Header");
    if (req.method === 'OPTIONS') {
        return res.sendStatus(200);
    }
    next();
});

app.post('/api/resource', (req, res) => {
    res.send('Resource created');
});

app.listen(3000, () => {
    console.log('Server running on http://localhost:3000');
});

Заключение

Чтобы избежать проблем с CORS, всегда учитывайте необходимость в preflight-запросах при проектировании API. Если вы будете использовать простые запросы и следовать правилам CORS, то сможете обеспечить безопасное взаимодействие вашего фронтенда с бэкендом.