← Назад к вопросам

Что такое CORS (Cross-Origin Resource Sharing)?

1.8 Middle🔥 253 комментариев
#API и веб-протоколы#Безопасность

Комментарии (3)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое CORS (Cross-Origin Resource Sharing)?

CORS (Cross-Origin Resource Sharing) — это механизм безопасности, реализованный в современных браузерах, который позволяет веб-страницам, загруженным из одного источника (origin), безопасно запрашивать ресурсы с другого источника. Без CORS такие запросы были бы запрещены политикой Same-Origin Policy (SOP), которая является фундаментальным ограничением в веб-безопасности. CORS работает путём добавления специальных HTTP-заголовков, которые дают серверу возможность явно разрешить или запретить кросс-доменные запросы.

Как работает механизм CORS?

Процесс состоит из нескольких этапов, ключевым из которых часто является preflight-запрос (предзапрос):

  1. Определение "происхождения" (origin): Origin включает три компонента: протокол (HTTP/HTTPS), домен (например, example.com) и порт (например, 80). Если хотя бы один из этих параметров отличается, браузер считает это кросс-доменным запросом.

  2. 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
    
  3. Фактический запрос: Если 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"}
    
  4. Учёт учётных данных (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 — это не атака или уязвимость, а защитный механизм, который разработчики должны правильно настраивать для безопасного взаимодействия между разными доменами. Понимание его работы критически важно для создания современных распределённых веб-приложений.

Что такое CORS (Cross-Origin Resource Sharing)? | PrepBro