CORS: простой запрос vs preflight
CORS (Cross-Origin Resource Sharing) — это механизм, который позволяет браузерам ограничивать доступ к ресурсам, находящимся на других доменах. Он играет важную роль в безопасности веб-приложений, предотвращая потенциальные атаки на данные.
Простые запросы
Простой запрос — это HTTP-запрос, который удовлетворяет определённым условиям и не требует предварительной проверки (preflight). К простым запросам относятся:
- Метод: GET, POST, HEAD
- Заголовки: только стандартные заголовки, такие как Accept, Content-Type (с ограничениями на значения), и другие.
Пример простого запроса:
GET /resource HTTP/1.1
Host: example.com
Origin: http://yourdomain.com
В этом примере браузер отправляет запрос на ресурс с сервера example.com, указывая, что он пришёл с http://yourdomain.com. Если сервер разрешает доступ, он должен вернуть заголовок Access-Control-Allow-Origin, содержащий значение http://yourdomain.com или * (все источники).
Preflight запросы
Preflight запрос — это предварительный запрос, который отправляется браузером перед основным запросом для проверки разрешений на доступ к ресурсу. Он используется для запросов, которые не являются простыми.
Условия для preflight:
- Метод: любой, кроме простых (например, PUT, DELETE)
- Заголовки: если используются нестандартные заголовки или заголовки, не входящие в список стандартных.
Пример preflight запроса:
OPTIONS /resource HTTP/1.1
Host: example.com
Origin: http://yourdomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header
В этом запросе браузер отправляет OPTIONS запрос, чтобы узнать, разрешает ли сервер выполнение POST-запросов с нестандартным заголовком X-Custom-Header. Если сервер поддерживает указанные методы и заголовки, он отвечает с соответствующими заголовками:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://yourdomain.com
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: X-Custom-Header
Распространённые ошибки
- Отсутствие заголовков CORS на сервере: Если сервер не возвращает необходимые заголовки, браузер заблокирует доступ к ресурсу.
- Неверный метод или заголовок в preflight: Если в preflight-запросе указаны методы или заголовки, которые не поддерживает сервер, это также вызовет ошибку.
- Использование wildcard (
*) с Credentials: ВозвращениеAccess-Control-Allow-Origin: *вместе сAccess-Control-Allow-Credentials: trueприведёт к ошибке, так как это противоречит правилам CORS.
Практические советы
- Убедитесь, что сервер правильно настроен для обработки CORS-заголовков.
- При необходимости используйте инструменты для тестирования API, такие как Postman, чтобы проверить CORS-ответы.
- Изучите логи сервера для отладки проблем с CORS, чтобы увидеть, какие заголовки возвращаются и какие запросы приходят.
- Не забывайте об безопасности: не открывайте доступ ко всем источникам, если это не требуется, и применяйте строгие правила для разрешённых доменов.
Понимание различий между простыми запросами и preflight-запросами является ключевым для успешной работы с CORS и безопасным взаимодействием между клиентами и серверами.