Обзор
CORS (Cross-Origin Resource Sharing) — это механизм безопасности, который используется для контроля доступа к ресурсам из другого источника. В Object Storage CORS необходим для обеспечения безопасного доступа к объектам данных из веб-приложений, размещенных на других доменах.
Принцип работы
Обычно браузеры блокируют запросы, инициированные к ресурсам на других доменах. Такое ограничение называется Same-Origin Policy (политика одного источника). Согласно этой политике, веб-страница может свободно взаимодействовать только с ресурсами с аналогичным доменом, портом и протоколом. Например, страница на https://example.comможет запрашивать данные только с https://example.com. Если эта страница запросит данные с другого домена (например, https://api.anotherdomain.com), браузер заблокирует такой запрос.
Механизм CORS позволяет явно указать, какие внешние домены имеют право запрашивать ресурсы. Для этого используются специальные HTTP-заголовки. Перед тем, как выполнить кросс-доменный запрос, браузер отправляет на сервер предварительный (preflight) запрос с информацией о домене источника, используемом HTTP-методе и заголовках будущего запроса. Если данные, переданные в preflight-запросе, соответствуют правилам CORS, сервер разрешает кросс-доменный запрос.
Структура конфигурации CORS
Конфигурация CORS устанавливается на уровне бакета. Она представляет собой набор правил в формате XML или JSON. Готовый файл с правилами можно загрузить с помощью утилиты AWS CLI.
В правилах указываются:
- разрешенные источники;
- разрешенные HTTP-методы (
GET,POSTи др.); - разрешенные HTTP-заголовки.
Пример конфигурации в формате XML
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>https://www.example.com</AllowedOrigin>
<AllowedOrigin>https://app.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedHeader>Authorization</AllowedHeader>
<AllowedHeader>Content-Type</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
<MaxAgeSeconds>3600</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>Пример конфигурации в формате XML
{
"CORSRules": [
{
"AllowedOrigins": [
"https://www.example.com",
"https://app.example.com"
],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE"],
"AllowedHeaders": ["Authorization", "Content-Type"],
"ExposeHeaders": ["ETag"],
"MaxAgeSeconds": 3600
}
]
}В состав конфигурации могут входить следующие элементы:
| Элемент | Описание | Пример |
|---|---|---|
AllowedOrigins | Разрешенные источники | "AllowedOrigins": ["https://www.example.com"] |
AllowedMethods | Разрешенные HTTP-методы | "AllowedMethods": ["GET", "PUT", "POST", "DELETE"] |
AllowedHeaders | Разрешенные HTTP-заголовки | "AllowedHeaders": ["Authorization", "Content-Type"] |
ExposeHeaders | Заголовки, доступные клиенту | ExposeHeaders": ["ETag"] |
MaxAgeSeconds | Время кэширования preflight-ответов | "MaxAgeSeconds": 3600 //1 час |
Особенности и ограничения
- Конфигурация CORS должна включать не более 100 правил.
- Размер файла конфигурации не должен превышать 64КБ.
Проверка запросов
Object Storage проверяет каждый запрос из браузера на соответствие настройкам CORS. Запрос признается соответствующим, если одновременно выполняются условия:
- значение заголовка
Originсовпадает с одним из источников, указанных в параметреAllowedOrigins; - используется один из методов, перечисленных в параметре
AllowedMethods; - значение заголовка
Access-Control-Request-Headersсовпадает со значением параметраAllowedHeaders.