Управление доступом посредством CORS
Совместное использование ресурсов между разными источниками (Cross-Origin Resource Sharing) — стандарт, используемый в браузерах, который позволяет веб-серверам определять какие сторонние веб-сервисы (веб-страницы) могут делать запросы к ресурсам этого сервера. В данном случае сторонний веб-сервис — это любой, отличающийся от запрашиваемого протоколом, доменом или портом. Доступ предоставляется по специализированным запросам. Принимающий запрос интернет-ресурс содержит список доверенных источников, которым разрешен доступ к объектам. Доступ получают те страницы-источники запроса, которые входят в список доверенных источников. Для предоставления доступа всем сторонним интернет-страницам используется маска *
.
Принцип работы CORS
Стандарт Cross-Origin Resource Sharing работает следующим образом:
- Браузер делает предварительный запрос с помощью метода
OPTIONS
. Предварительный запрос — это проверка возможности запроса к объекту. - На основе ответа на предварительный запрос выполняется основной запрос.
Предварительный запрос
Ответ сервера на предварительный запрос должен сообщать какие запросы из разных источников сервер готов принять с URL-адреса клиента. Заголовки ответа сервера должны содержать Access-Control-Allow-Origin
, Access-Control-Allow-Methods
, Access-Control-Allow-Headers
. Например, используя метод OPTIONS
, клиент перед отправкой основного запроса запрашивает у сервера, разрешен ли ему метод DELETE
:
OPTIONS /resource/foo
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: Origin, X-Requested-With
Origin: https://www.example-example.ru
Если сервер позволяет это, он ответит на предварительный запрос заголовком Access-Control-Allow-Methods
ответа, где присутствует DELETE
:
HTTP/1.1 204 No Content
Connection: keep-alive
Access-Control-Allow-Origin: https://www.example-example.ru
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Allow-Headers: Origin, X-Requested-With
Основной запрос
Создавая перекрестный HTTP-запрос, браузер клиента объявляет в разделе запроса Origin
домен веб-страницы, инициирующей запрос.
В примере, использующем методы CORS, страница https://website.ru/page.html
запрашивает данные со страницы https://server.ru/info
.
GET /info HTTP/1.1
Host: server.ru
Origin: website.ru
Если сервер разрешает странице-источнику запроса доступ к данным с домена, в его ответе на запрос появится строка
Access-Control-Allow-Origin
с именем объявленного домена:Access-Control-Allow-Origin: https://website.ru
Если на сервере разрешен доступ только нескольким сторонним клиентам, ответ сервера будет содержать имена всех этих доменов:
Access-Control-Allow-Origin: https://website.ru https://website2.ru https://website3.ru
Если на сервере разрешен доступ к ресурсу страницам любого стороннего домена, в ответе будет указана маска
*
.Access-Control-Allow-Origin: *
Если сервер, на который запрошен доступ, не добавит в ответ указанную строку, браузер клиента вместо данных файла
info
вернет код ошибки.
Настройка CORS-конфигурации бакета
Для каждого бакета создается отдельная CORS-конфигурация, состоящая из правил. Управление CORS-конфигурациями осуществляется посредством консоли управления CloudMTS или S3 API.