Открыть сервис

CORS

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

История и предпосылки появления

До появления CORS веб-браузеры строго придерживались политики одного источника. Эта политика запрещала веб-странице, загруженной с одного домена, отправлять запросы на другой домен. Это было сделано для предотвращения атак типа межсайтовой подделки запросов (CSRF) и кражи данных. Однако с развитием веб-приложений, особенно с ростом популярности AJAX (асинхронных запросов к серверу) и одностраничных приложений (SPA), возникла необходимость во взаимодействии с ресурсами, расположенными на других доменах (например, для получения данных от сторонних API, загрузки шрифтов с CDN или использования внешних сервисов аутентификации).

Первая спецификация CORS была опубликована Консорциумом Всемирной паутины (W3C) в 2004 году. В 2014 году она была рекомендована к использованию как стандарт. С тех пор CORS стал основным и наиболее распространённым способом организации кросс-доменного взаимодействия в веб-браузерах.

Принцип работы

CORS работает на основе HTTP-заголовков. Когда браузер отправляет запрос на другой источник, он добавляет в запрос специальный заголовок Origin, который указывает, с какого домена инициирован запрос. Сервер, получив такой запрос, может решить, разрешить ли его, и, если да, то какие заголовки и методы запроса допустимы. Ответ сервера содержит один или несколько заголовков CORS, которые сообщают браузеру, разрешён ли запрос.

Типы запросов

Различают два основных типа кросс-доменных запросов:

  • Простые запросы (Simple requests): Запросы, которые не требуют предварительной проверки. К ним относятся запросы, использующие методы GET, HEAD или POST, а также с определённым набором разрешённых HTTP-заголовков (например, Accept, Accept-Language, Content-Language, Content-Type со значениями application/x-www-form-urlencoded, multipart/form-data или text/plain). Браузер отправляет такой запрос напрямую, и сервер отвечает заголовками CORS.
  • Предварительные запросы (Preflight requests): Запросы, которые могут изменить данные на сервере (например, методы PUT, DELETE, PATCH) или используют нестандартные заголовки. Перед основным запросом браузер отправляет предварительный запрос методом OPTIONS. Этот запрос содержит заголовки Access-Control-Request-Method (указывает метод основного запроса) и Access-Control-Request-Headers (указывает нестандартные заголовки). Сервер должен ответить на этот запрос, указав, разрешён ли основной запрос. Если сервер отвечает с соответствующими заголовками CORS, браузер отправляет основной запрос.

Основные HTTP-заголовки CORS

Сервер использует следующие заголовки для управления кросс-доменными запросами:

  • Access-Control-Allow-Origin: Указывает, какие источники имеют право доступа к ресурсу. Может содержать конкретный домен (например, https://example.com) или символ (звёздочка), который разрешает доступ с любого источника. Использование ` не допускается при использовании учётных данных (cookies, HTTP-аутентификация).
  • Access-Control-Allow-Methods: Перечисляет HTTP-методы, которые разрешены при обращении к ресурсу (например, GET, POST, PUT, DELETE).
  • Access-Control-Allow-Headers: Перечисляет HTTP-заголовки, которые могут быть использованы в запросе (например, Content-Type, Authorization).
  • Access-Control-Allow-Credentials: Указывает, следует ли включать в запрос учётные данные (cookies, заголовки авторизации). Значение true разрешает их передачу.
  • Access-Control-Max-Age: Указывает время в секундах, в течение которого результаты предварительного запроса могут быть кэшированы без повторной отправки.
  • Access-Control-Expose-Headers: Указывает, какие заголовки ответа сервера могут быть доступны клиентскому скрипту (например, JavaScript). По умолчанию доступны только стандартные заголовки (например, Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma).

Примеры использования

CORS широко применяется в современных веб-приложениях:

  • Взаимодействие с API: Одностраничные приложения (SPA), работающие на одном домене, часто обращаются к API, расположенному на другом домене (например, https://api.example.com`). Без CORS такой запрос был бы заблокирован.
  • Загрузка шрифтов: Веб-шрифты, расположенные на сторонних CDN (Content Delivery Network), требуют CORS, чтобы быть загруженными и применёнными на странице.
  • Использование сторонних сервисов: Сервисы аутентификации (например, OAuth), аналитики (Google Analytics), карт (Яндекс.Карты) и другие часто используют CORS для обмена данными.
  • Веб-сокеты: Хотя WebSocket-соединения не используют CORS в классическом смысле, браузеры проверяют заголовки CORS при установлении соединения.

Ограничения и безопасность

CORS — это механизм, управляемый браузером. Он не защищает сервер от злонамеренных запросов, отправленных не из браузера (например, с помощью curl, Postman или серверных скриптов). Сервер должен самостоятельно проверять подлинность и авторизацию запросов.

Неправильная настройка CORS может привести к уязвимостям:

  • **Использование Access-Control-Allow-Origin: ***: Разрешает доступ с любого источника, что может быть нежелательно для конфиденциальных данных.
  • Разрешение всех методов и заголовков: Может позволить злоумышленнику выполнять нежелательные операции.
  • Отсутствие проверки учётных данных: Если сервер использует Access-Control-Allow-Credentials: true, он должен быть уверен, что Access-Control-Allow-Origin не содержит * и указывает на доверенный источник.

Реализация на стороне сервера

Настройка CORS обычно выполняется на уровне веб-сервера (например, Nginx, Apache) или в коде серверного приложения (например, на Node.js, Python, Java, PHP). Для этого добавляются соответствующие HTTP-заголовки в ответ сервера. Многие фреймворки и библиотеки предоставляют встроенную поддержку CORS, упрощая его настройку.

Источники

  • Спецификация W3C: «Cross-Origin Resource Sharing» (CORS)
  • MDN Web Docs: «Cross-Origin Resource Sharing (CORS)»
  • RFC 6454: «The Web Origin Concept»
  • Статья «Same-Origin Policy» на MDN Web Docs

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →