Как работает preflight-запрос в CORS и когда он отправляется?
Заголовки и политики браузера
Preflight — предварительный запрос методом OPTIONS, которым браузер спрашивает сервер, разрешён ли основной межсайтовый запрос.
Когда он нужен
Браузер отправляет preflight, если запрос «непростой»:
- метод не
GET,HEADилиPOST, напримерPUT,DELETE,PATCH; - есть нестандартные заголовки:
Authorization,X-Custom; Content-Typeнеtext/plain,multipart/form-dataилиapplication/x-www-form-urlencoded, напримерapplication/json.
Как это работает
OPTIONS /api/items
Origin: https://app.example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: authorization, content-type
← 204
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Headers: authorization, content-type
Access-Control-Max-Age: 600Если сервер разрешил, браузер отправляет настоящий запрос. Max-Age позволяет кешировать ответ и не повторять preflight.
Частые ошибки
- Ответ на
OPTIONSприходит с401или404: preflight не проходит авторизацию. - С
credentials: 'include'нельзя использоватьAccess-Control-Allow-Origin: *, нужен конкретный origin.
Коротко для собеседования
Preflight — «разведка» через OPTIONS перед непростыми запросами. Сервер отвечает списком разрешённых методов и заголовков.