Что такое CORS (Cross-Origin Resource Sharing)?
Комментарии (3)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое CORS (Cross-Origin Resource Sharing)?
CORS (Cross-Origin Resource Sharing) — это механизм безопасности, реализованный в современных браузерах, который позволяет веб-страницам, загруженным из одного источника (origin), безопасно запрашивать ресурсы с другого источника. Без CORS такие запросы были бы запрещены политикой Same-Origin Policy (SOP), которая является фундаментальным ограничением в веб-безопасности. CORS работает путём добавления специальных HTTP-заголовков, которые дают серверу возможность явно разрешить или запретить кросс-доменные запросы.
Как работает механизм CORS?
Процесс состоит из нескольких этапов, ключевым из которых часто является preflight-запрос (предзапрос):
-
Определение "происхождения" (origin): Origin включает три компонента: протокол (HTTP/HTTPS), домен (например,
example.com) и порт (например,80). Если хотя бы один из этих параметров отличается, браузер считает это кросс-доменным запросом. -
Preflight-запрос: Для определённых типов запросов (например, с нестандартными заголовками или методами, отличными от GET/POST/HEAD) браузер автоматически отправляет предварительный запрос методом OPTIONS, чтобы проверить, разрешён ли фактический запрос. Пример preflight-запроса и ответа:
// Запрос OPTIONS OPTIONS /api/data HTTP/1.1 Origin: https://frontend-app.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: Content-Type, Authorization // Ответ сервера с разрешениями HTTP/1.1 204 No Content Access-Control-Allow-Origin: https://frontend-app.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: Content-Type, Authorization Access-Control-Max-Age: 86400 -
Фактический запрос: Если preflight прошёл успешно, браузер отправляет основной запрос. Сервер должен включить в ответ заголовок
Access-Control-Allow-Origin, указывающий разрешённые origin. Например:HTTP/1.1 200 OK Access-Control-Allow-Origin: https://frontend-app.com Content-Type: application/json {"data": "some value"} -
Учёт учётных данных (credentials): Если запрос включает куки или авторизационные данные, сервер должен ответить с
Access-Control-Allow-Credentials: true, а вAccess-Control-Allow-Originуказать конкретный origin (не символ*). На стороне клиента в fetch/XHR нужно установитьcredentials: 'include'.
Основные HTTP-заголовки CORS
Ключевые заголовки, которые управляют CORS:
-
Заголовки запроса:
Origin: Автоматически добавляется браузером, указывает источник запроса.Access-Control-Request-Method: Используется в preflight для указания метода основного запроса.Access-Control-Request-Headers: Используется в preflight для перечисления нестандартных заголовков.
-
Заголовки ответа:
Access-Control-Allow-Origin: Указывает разрешённые origins (может быть*для публичных API или конкретный домен).Access-Control-Allow-Methods: Список разрешённых HTTP-методов (например,GET, POST, PUT).Access-Control-Allow-Headers: Список разрешённых заголовков в запросе.Access-Control-Allow-Credentials: Разрешает отправку учётных данных.Access-Control-Max-Age: Определяет время кэширования preflight-ответа (в секундах).
Пример настройки CORS в PHP
В PHP можно настроить CORS, добавляя заголовки вручную или используя библиотеки. Простой пример для разрешения запросов с определённого домена:
<?php
header("Access-Control-Allow-Origin: https://frontend-app.com");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
// Для обработки preflight-запроса
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
// Основная логика API
echo json_encode(["message" => "CORS разрешён"]);
?>
Зачем нужен CORS?
Основная цель — баланс между безопасностью и функциональностью. Same-Origin Policy защищает пользователей от атак, таких как CSRF (Cross-Site Request Forgery) и утечки данных, но ограничивает легитимные сценарии (например, когда фронтенд на app.com обращается к API на api.com). CORS решает эту проблему, предоставляя серверу контроль над тем, кто может получать доступ к его ресурсам.
Практические рекомендации
- Не используйте
Access-Control-Allow-Origin: *, если API требует авторизации или обрабатывает конфиденциальные данные. - Всегда валидируйте значение
Originна сервере, чтобы избежать подделки заголовков. - Используйте middleware или библиотеки для централизованной настройки CORS (например, в Laravel есть пакет
fruitcake/laravel-cors). - Учитывайте кэширование preflight-запросов с помощью
Access-Control-Max-Ageдля улучшения производительности.
В итоге, CORS — это не атака или уязвимость, а защитный механизм, который разработчики должны правильно настраивать для безопасного взаимодействия между разными доменами. Понимание его работы критически важно для создания современных распределённых веб-приложений.