Совместное использование ресурсов между разными источниками (CORS)

Технология совместного использования ресурсов между разными источниками (CORS, Cross-Origin Resource Sharing) определяет способ взаимодействия клиентских веб-приложений, загружаемых в один домен, с ресурсами другого домена. Поддержка технологии CORS сервисом позволяет собирать многофункциональные веб-приложения на стороне клиента и выборочно предоставлять доступ Cross-origin к вашим ресурсам сервиса.

В данном разделе предоставлена информация о технологии совместного использования ресурсов между разными источниками (CORS).


Совместное использование ресурсов между разными источниками: варианты использования технологии

Ниже перечислены варианты использования технологии CORS.

  • Сценарий №1. Например, вы размещаете на своих ресурсах веб-сайт в бакете с названием website. Ваши пользователи загружают URL-адрес конечной точки сайта. Теперь вы хотите использовать JavaScript на веб-страницах, хранимых в этом бакете, чтобы отправлять аутентифицированные запросы GET и PUT для того же бакета с помощью конечной точки API сервиса для бакета. Обычно браузер предотвращает выполнение кода JavaScript, разрешающего такие запросы, но используя технологию CORS, вы можете настроить бакет так, чтобы запросы Cross-origin были разрешены с веб-сайта.
  • Сценарий №2. Например, вам необходимо разместить на своих ресурсах веб-шрифт из бакета сервиса. Браузеры обязательно проводят проверку CORS (так называемую «предполетную» проверку) для загрузки веб-шрифтов, так что вам необходимо настроить бакет, размещающий на своих ресурсах веб-шрифт, на разрешение создания запросов из любого источника.

Как настроить конфигурацию CORS на бакете

Для настройки бакета на разрешение запросов Cross-origin вам необходимо создать конфигурацию CORS, т. е. XML-документ с правилами, устанавливающими источники, которым вы даете доступ к вашему бакету, операции (методы HTTP), поддерживаемые каждым источником, и прочую информацию об операциях.

В конфигурацию можно добавить до 100 правил. Вам необходимо добавить XML-документ в качестве подресурса cors в бакет программным путем. 

Вместо получения доступа к веб-сайту при помощи конечной точки веб-сайта сервиса, вы можете использовать собственный домен, такой как example1.com для предоставления вашего контента. В приведенном ниже примере в конфигурации cors установлены три правила, указанные в качестве элементов CORSRule.

  • Первое правило разрешает Cross-origin-запросы PUT, POST и DELETE из источника https://www.example1.com. Данное правило также разрешает использовать все заголовки в предполетном запросе OPTIONS через заголовок Access-Control-Request-Headers. В качестве ответа на любой предполетный запрос OPTIONS, сервис возвращает любой запрошенный заголовок.
  • Второе правило разрешает использовать те же запросы Cross-origin, что и первое правило, но при этом применяется к другому источнику — https://www.example2.com.
  • Третье правило разрешает использовать Cross-origin-запросы GET со всех источников. Подстановочный знак «*» указывает на возможность использования любого источника.
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>http://www.example1.com</AllowedOrigin>

<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>

<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>http://www.example2.com</AllowedOrigin>

<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>

<AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
</CORSRule>
</CORSConfiguration>

Конфигурация CORS также разрешает использовать дополнительные конфигурационные параметры, как это показано на приведенном ниже примере конфигурации CORS. В данном примере конфигурация CORS разрешает использовать Cross-origin-запросы PUT, POST и DELETE из источника http://www.example.com.


<CORSConfiguration> 
<CORSRule
<AllowedOrigin>http://www.example.com</AllowedOrigin> 
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>*</AllowedHeader
<MaxAgeSeconds>3000</MaxAgeSeconds
</CORSRule></CORSConfiguration>

Элемент CORSRule в вышеуказанной конфигурации включает следующие дополнительные элементы:

  • MaxAgeSeconds — этот элемент указывает время в секундах (в этом примере — 3000 секунд), на которое браузер может кешировать ответ сервиса на предполетный запрос OPTIONS для указанного ресурса. Кеширование ответа позволяет браузеру не посылать предполетные запросы в сервис, если оригинальный запрос необходимо создать повторно.

Элемент AllowedMethod

В конфигурации CORS вы можете указать следующие значения для элемента AllowedMethod:

  • GET
  • PUT
  • POST
  • DELETE
  • HEAD

Элемент AllowedOrigin

В элементе AllowedOrigin вы указываете источники, из которых вы хотите разрешить междоменные запросы, например http://www.example.com. Строка с источником может содержать максимум один подстановочный знак «*», например http://*.example.com. По желанию вы можете указать «*» в качестве источника для того, чтобы разрешить всем источникам отсылать запросы Cross-origin. Вы также можете указать https для того, чтобы разрешить использовать только защищенные источники.

Элемент AllowedHeader

Элемент AllowedHeader указывает, какие заголовки разрешено использовать в предполетном запросе через заголовок Access-Control-Request-Headers. Каждое имя заголовка в заголовке Access-Control-Request-Headers должно совпадать с соответствующей записью в правиле. Сервис будет отправлять в ответе только разрешенные запрошенные заголовки. Список заголовков, которые можно использовать в запросах сервису, находится в разделе «Типовые заголовки запросов».

Каждая строка AllowedHeader в правиле может содержать максимум один подстановочный знак «*». Например, <AllowedHeader>x-amz-*</AllowedHeader> разрешит использовать все заголовки сервиса.

Элемент ExposeHeader

Каждый элемент ExposeHeader указывает заголовок в ответе, к которому пользователи смогут получить доступ из приложений (например, из объекта JavaScript XMLHttpRequest). Список типичных заголовков сервиса находится в разделе «Типовые заголовки запросов».

Элемент MaxAgeSeconds

Элемент MaxAgeSeconds указывает время в секундах, на которое браузер может кешировать ответ для предполетного запроса, что определяется ресурсом, методом HTTP и источником.

Как сервис осуществляет оценку конфигурации CORS на бакете

Когда сервис получает предполетный запрос от браузера, он осуществляет оценку конфигурации CORS для бакета и использует первое правило CORSRule, которое совпадает с получаемым запросом браузера на разрешение запроса Cross-origin. Для того, чтобы правило совпадало с получаемым запросом, должны выполняться нижеследующие условия.

  • Заголовок Origin запроса должен совпадать с элементом AllowedOrigin.
  • Метод запроса (например, GET или PUT) или заголовок Access-Control-Request-Method в случае предполетного запроса OPTIONS должен быть одним из элементов AllowedMethod.
  • Каждый заголовок, указанный в заголовке Access-Control-Request-Headers в предполетном запросе, должен совпадать с элементом AllowedHeader.


Политики и списки управления доступом ACL применимы при разрешении технологии CORS на бакете.