Что такое CORS и preflight-запрос?
DNS, WebSocket и другие протоколы
CORS — механизм, с которым браузер спрашивает у сервера разрешение отдать ответ другому origin; для «непростых» запросов перед основным уходит служебный preflight-запрос OPTIONS.
Origin и простые запросы
- Origin — это тройка «схема + хост + порт». Запрос с
https://app.devнаhttps://api.devуже кросс-origin. - Простые запросы (GET и POST с ограниченным набором заголовков) уходят сразу, но ответ код получит, только если сервер прислал
Access-Control-Allow-Origin.
Preflight
- Триггеры: методы PUT и DELETE, кастомные заголовки вроде
Authorization,Content-Type: application/json. - Браузер шлёт
OPTIONSсAccess-Control-Request-MethodиAccess-Control-Request-Headers; сервер отвечает разрешёнными методами и заголовками,Access-Control-Max-Ageкеширует результат.
Нюансы
- CORS ограничивает чтение ответа в браузере, а не сам запрос: curl и связка сервер-сервер его игнорируют.
Access-Control-Allow-Origin: *несовместим со включёнными credentials — нужен конкретный origin.
Коротко для собеседования
CORS — защита на стороне браузера: сервер заголовками разрешает конкретным origin читать свои ответы, а для запросов с JSON или Authorization браузер сначала шлёт OPTIONS. При отладке смотрите заголовки ответа на preflight и помните, что * не работает с credentials.