База знаний

Как настроить политики CORS для доступа к бакету S3

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

Политики CORS

Политики CORS задаются для отдельных бакетов хранилища S3.

По умолчанию CORS просто запрещает все коммуникации между разными доменами. Чтобы разрешить доменам обмениваться информацией, необходимо создать политику, описывающую весь список разрешений для CORS. Не упомянутые в политике коммуникации останутся автоматически запрещёнными.

Политика CORS создаётся и редактируется в виде XML-файла, содержащих набор правил CORS для обмена данными между доменами. Описанные правила для CORS добавляются в HTTP-заголовки, используемые при обмене данными между хранилищем S3 и внешним источником.

Примечание. Для подключения политики CORS бакет должен быть доступен (т.е. все другие права и политики доступа не должны блокировать обмен с данными хранилища S3). Если бакет недоступен (заблокирован), то даже при правильно настроенных политиках CORS запрос к хранилищу будет возвращать ошибку 403. О том, как настроить политики доступа для бакета, написано в отдельной статье.

Файловое хранилище S3 поддерживает создание правил для работы с наиболее распространёнными методами доступа к данным:

  • GET — простое получение данных
  • POST — простая запись данных
  • PUT — замена (перезапись) существующих данных
  • DELETE — удаление существующих данных
  • HEAD — получение пустого (без данных) заголовка
  • OPTIONS — отправка предварительного (prefetch) запроса

Поддерживается работа с основными правилами доступа к хранилищу, например:

  • AllowedMethod — разрешает методы доступа к содержимому бакета
  • AllowedOrigin — задаёт имя домена, на которое распространяется правило
  • AllowedHeader — определяет, какие дополнительные заголовки может отправлять запрос к объектам в бакете

С какими запросами работает CORS

Политики CORS применяются к следующим запросам:

  • вызовы fetch() или XMLHttpRequest
  • использование веб-шрифтов с других доменов
  • текстуры WebGL
  • изображения и видео, полученные через вызов drawImage()
  • создание фигур (Shapes) из изображений

Политики CORS не применяются к следующим типам запросов:

  • внешние ресурсы через теги img, iframe, script, video, script, link rel=”stylesheet”
  • запросы от расширений браузера, мобильных приложений
  • HTTP-запросы между серверами (например, запросы backend → backend)

Как настроить политики CORS

Чтобы настроить междоменную коммуникацию, создайте XML файл с описанием политики CORS.

<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule> <!-- Описание правил для определённого ниже домена -->
    <AllowedMethod>GET</AllowedMethod><!-- Разрешает чтение данных с указанного домена -->
    <AllowedMethod>POST</AllowedMethod><!-- Разрешает передачу данных на указанный домен -->
    <AllowedOrigin>https://[наш_домен.имя]</AllowedOrigin><!-- Имя домена, для которого устанавливается правило -->
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
  <CORSRule><!-- Следующее правило -->
    <AllowedMethod>GET</AllowedMethod>
    <AllowedOrigin>*</AllowedOrigin><!-- Звёздочка “*” распространяет правило на все домены -->
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

Внимание! При настройке доменов для CORS не забывайте указывать правильный протокол (HTTP или HTTPS)! Иначе CORS будет возвращать ошибку, даже если политики настроены верно.

Подключение политики CORS к бакету

Для подключения можно применить клиент S3 или воспользоваться консолью.

Консольный клиент s3cmd позволяет добавить политику CORS при помощи следующей команды:

s3cmd setcors cors.xml s3://[имя_бакета]

Графический клиент S3 Browser позволяет задать политики CORS через специальный инструмент: Buckets → CORS Configuration. В открывшемся окне можно ввести описание необходимой политики CORS для бакета.

Устранение проблем с CORS

Большинство проблем с использованием политик CORS связаны с неправильной настройкой прав доступа к самому бакету S3, либо с ошибками при описании политик CORS (не хватает правил для заголовков и т.д.).

Чтобы проверить настройку политик CORS для определённого домена:

  • откройте в браузере страницу нужного домена
  • перейдите в консоль
  • выполните запрос к какому-нибудь файлу, находящемуся в бакете S3

fetch("https://storage.clo.ru/[имя_бакета]/тестовый.файл")

Запрос будет успешным, если политики CORS настроены правильно.

Примечание. Прежде чем начать исправлять ошибки, выдаваемые CORS, попробуйте очистить кэш браузера и повторить выполнение запроса к хранилищу. Есть вероятность, что данные просто не были вовремя обновлены.

6 лет с вами!
Дарим кешбэк при пополнении баланса
Подробнее