Когда возникает ошибка CORS
Что проверяют
Понимаете ли вы, что это поведение браузера, и знаете ли конкретные условия срабатывания.
Как отвечать
Ошибка возникает, когда код страницы пытается прочитать ответ на запрос к другому источнику, а сервер не разрешил это заголовками.
Источник это тройка из схемы, домена и порта. Различие хотя бы в одном делает запрос кросс-доменным. Отсюда самые частые ситуации:
- страница на одном порту локального сервера, а API на другом. Формально это разные источники, хотя домен один;
- фронтенд на основном домене, API на поддомене;
- переход с незащищённого протокола на защищённый;
- обращение к чужому API из браузера.
Конкретные условия, при которых появляется ошибка:
- сервер не вернул заголовок разрешения источника либо вернул другой источник;
- не обработан предварительный запрос. Всё, что выходит за рамки простого запроса (метод, отличный от базовых, свой заголовок вроде токена, нестандартный тип содержимого), сначала вызывает отдельный запрос на проверку. Не ответили на него правильно, и основной запрос не уйдёт вовсе;
- передаются учётные данные вместе с разрешением для любого источника. Такое сочетание браузер отвергает, нужен точный источник и отдельный заголовок разрешения;
- коду нужен заголовок ответа, который не объявлен как доступный.
Когда ошибки не будет: запрос не из браузера (консольная утилита, серверный код, инструмент тестирования), тот же источник, загрузка изображения или скрипта через теги без чтения содержимого.
И главное для понимания: запрос обычно доходит до сервера и выполняется. Браузер блокирует чтение ответа. Поэтому неудачный запрос на изменение данных мог их изменить.
Где спотыкаются
Считают, что запрос не дошёл до сервера.
Пытаются починить ошибку в коде фронтенда.
Не обрабатывают предварительный запрос.
Ставят разрешение для любого источника вместе с куками.