Що таке preflight request?
1. Навіщо він потрібен
CORS (Cross-Origin Resource Sharing) - механізм безпеки. Браузер не дозволяє JavaScript-коду робити небезпечні чи нестандартні запити до іншого домену, якщо сервер явно не підтвердив, що це безпечно.
Щоб перевірити, чи можна виконати запит, браузер робить preflight - запит-розвідку з методом OPTIONS.
2. Коли браузер робить preflight
Preflight не виконується завжди. Він потрібен лише, якщо запит не є "простим" (simple request).
Прості запити:
- Метод -
GET,HEADчиPOST - Заголовки - лише "базові" (
Accept,Content-Type=text/plain,application/x-www-form-urlencoded,multipart/form-data) - Немає користувацьких заголовків (
Authorization,X-*тощо) - Немає credentials (cookies, токенів) без явного дозволу
Усе інше - "нестандартний" запит ⇒ спершу робиться preflight.
3. Як виглядає preflight-запит
Це OPTIONS-запит, який браузер робить автоматично:
OPTIONS /api/data HTTP/1.1
Origin: https://frontend.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type, AuthorizationВін не містить даних (тіла), лише заголовки. Його мета - запитати в сервера:
"Чи можна потім зробити POST-запит із такими заголовками?"
4. Що має відповісти сервер
Якщо сервер згоден, він повертає дозвільні CORS-заголовки:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://frontend.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 600Ключові заголовки:
Access-Control-Allow-Origin- кому можнаAccess-Control-Allow-Methods- які методи дозволеніAccess-Control-Allow-Headers- які заголовки допустиміAccess-Control-Max-Age- скільки секунд можна кешувати результат preflight (щоб не повторювати його щоразу)
Після цього браузер виконує реальний запит (POST /api/data).
5. Якщо сервер не відповість правильно
Браузер не надішле основний запит - він просто заблокує його і покаже помилку в консолі:
"CORS policy: Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response"
Тобто preflight - це захист від несанкціонованих запитів.
6. Приклад у Node.js
Ось як правильно обробити preflight-запит на сервері:
import http from 'node:http';
const server = http.createServer((req, res) => {
// Загальні CORS-заголовки
res.setHeader('Access-Control-Allow-Origin', 'https://frontend.com');
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization');
if (req.method === 'OPTIONS') {
// Це preflight - відповідаємо без тіла
res.writeHead(204);
res.end();
return;
}
// Решта запитів - звичайна логіка
res.end('OK');
});
server.listen(3000);7. Коротко і просто
Preflight request - це автоматичний запит
OPTIONS, який браузер робить перед "небезпечним" CORS-запитом, щоб переконатися, що сервер дозволяє:
- потрібний метод (
POST,PUT,DELETEтощо),- потрібні заголовки (
Authorization,Content-Typeтощо),- і сам origin (домен).
8. Аналогія
Уяви, що браузер перевозить вантаж через кордон (домен). Спершу він надсилає інспектора (preflight), щоб запитати: "Чи можна ввозити ці товари і з такими документами?"
Якщо митниця (сервер) відповідає "Так", браузер пропускає основний запит. Якщо ні - запит не перетинає кордон.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.