Что такое CORS в веб-разработке?
Что проверяют
Понимаете ли вы, что это защита браузера, а не сервера, и знаете ли про предварительный запрос.
Как отвечать
По умолчанию браузер запрещает скрипту читать ответ с другого источника (протокол, домен или порт отличаются). CORS это механизм, которым сервер разрешает такое чтение своими заголовками.
Ключевые заголовки ответа: Access-Control-Allow-Origin (кому можно), Allow-Methods, Allow-Headers, Allow-Credentials (можно ли слать cookie), Max-Age (сколько кэшировать разрешение).
Запросы делятся на два вида. Простые (GET, HEAD, POST с обычными типами содержимого) уходят сразу, браузер лишь проверяет заголовки в ответе. Всё остальное требует предварительного запроса: браузер шлёт OPTIONS с описанием того, что собирается сделать, и только получив разрешение, отправляет настоящий запрос.
Важные детали, которые обычно и спрашивают:
- при
credentials: "include"нельзя отвечать*, нужен конкретный источник иAllow-Credentials: true; - запрос всё равно уходит на сервер и выполняется, браузер лишь не отдаёт ответ скрипту. Поэтому CORS не заменяет авторизацию;
- на сервер к серверу это не распространяется вовсе, ограничение живёт только в браузере.
Где спотыкаются
Считают CORS защитой сервера от чужих запросов.
Ставят * вместе с cookie и не понимают, почему браузер всё равно отказывает.
Забывают обработать OPTIONS, из-за чего падает только часть запросов, а простые проходят.
Пытаются починить CORS на клиенте, хотя разрешение выдаёт исключительно сервер.