CORS и принцип одинакового источника
Описание термина
CORS (Cross-Origin Resource Sharing, англ. «совместное использование ресурсов разных источников») — это стандарт, позволяющий предоставлять веб-страницам доступ к объектам сторонних интернет-ресурсов.
Сторонним считается любой интернет-ресурс, который отличается от запрашиваемого протоколом, доменом или портом.
Доступ предоставляется по специализированным запросам. Интернет-ресурс, принимающий запрос, содержит список доверенных источников, которым разрешен доступ к объектам. Страница-источник запроса получает доступ, если входит в список доверенных источников. Для предоставления доступа всем сторонним интернет-страницам используется маска «*».
Как появился стандарт
Первоначально для защиты информации была разработана «Политика одинакового источника» (Same-Origin Policy, SOP). Поддерживающий политику SOP веб-браузер сверяет комбинации сетевого протокола (например, https), точное имя домена и номер порта, чтобы разрешить доступ к ресурсам веб-страницы по запросам с другой страницы. Политика SOP не обязательна к применению, однако все современные веб-браузеры ее поддерживают.
Если веб-ресурсы интернет-источника соответствуют SOP, для доступа к ним из другого источника браузер должен поддерживать технологию Cross-Origin Resource Sharing. В 2006 году рабочая группа Консорциума Всемирной паутины (World Wide Web Consortium, W3C – организация, разрабатывающая интернет-стандарты) представила первый рабочий проект этой технологии. В 2014 году CORS был принят в качестве Рекомендации W3C.
Структура Cross-Origin Resource Sharing
Методы CORS предназначены для управления доступом к дескрипторам (тегам) на веб-страницах в сети. Управляемые типы доступа подразделяются на три основных категории по работе с информацией сторонних ресурсов:
-
Доступ на запись — это доступ к ссылкам, заполнению веб-форм и переадресации на сторонние веб-страницы, т.е. на передачу информации в сторонний источник (веб-ресурс).
-
Доступ на вставку относится к категории доступа на считывание информации из стороннего источника. К этому типу принадлежат вставки в код дескрипторов
audio
,video
,img
,embed
,object
,link
,script
,iframe
и другие элементы оформления веб-страниц. Структура подобных дескрипторов подразумевает самостоятельную инициацию перекрестных (cross-origin) запросов из сторонних источников. Все дескрипторы этой категории представляют низкий уровень угрозы безопасности, поэтому разрешены в веб-браузере по умолчанию. -
Доступ на считывание — это дескрипторы, загружаемые с использованием фоновых методов вызова, таких как
fetch()
, технологии обмена данными Ajax и пр. Поскольку подобные дескрипторы могут содержать в теле любые участки кода (в том числе вредоносного), они запрещены в веб-браузерах по умолчанию.
При настройке веб-сайта механизм CORS позволяет выборочно блокировать различные категории доступа пользователя к ресурсам (запись, вставку или считывание).
Принцип работы CORS
При создании перекрестного HTTP-запроса браузер клиента добавляет в него объявление домена веб-страницы, инициирующей запрос. Домен объявляется в разделе Origin.
Например, страница https://client-1.ru/page.html запрашивает данные со страницы https://server-site.ru/info.
Пример запроса от браузера клиента, использующего методы CORS, приведен ниже:
GET /info HTTP/1.1
Host: server-site.ru
Origin: client-1.ru
В случае, если сервер по адресу www.server-site.ru разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится строка Access-Control-Allow-Origin
с именем объявленного домена:
Access-Control-Allow-Origin: https://client-1.ru
Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла info вернет код ошибки.
Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска «*».
Access-Control-Allow-Origin: *
Если на сервере разрешен доступ не всем, а нескольким сторонним клиентам, ответ сервера содержит имена всех этих доменов, выведенных отдельными строками или разделенных пробелами:
Access-Control-Allow-Origin: https://client-1.ru https://client-2.ru https://client-3.ru
Сферы применения
Механизм CORS используется как более защищенная альтернатива технологии JSONP, так как позволяет использовать все преимущества xml-запросов через http, и является неуязвимым для внедрения в запрос стороннего кода (SQL-инъекций).
Все современные браузеры поддерживают эту технологию (Yandex Browser, Google Chrome, Mozilla Firefox и др.)
Важно понимать, что технологию CORS должен поддерживать как приемник данных (веб-браузер), так и источник (веб-ресурс).
Например, Yandex Object Storage (универсальный облачный сервис для хранения данных) поддерживает кросс-доменные запросы к ресурсам в каждом бакете.
Подписчикам сервиса доступны удобные механизмы управления CORS, такие как консоль управления Yandex Cloud или HTTP API, совместимый с Amazon S3.
Конфигурация CORS — это XML-файл с правилами доступа. Конфигурация содержит не больше 100 правил, размер файла не превышает 64КБ. Готовый файл конфигурации можно загрузить в бакет с помощью AWS CLI (режима командной строки Amazon), либо создать с помощью встроенной консоли управления.