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 →