CORS при работе с S3 нужен, чтобы браузер разрешал вашему фронтенду с одного origin обращаться напрямую к бакету S3 на другом origin. Для этого S3 добавляет в ответы специальные заголовки `Access-Control-Allow-*`, описывающие, какие домены, методы и заголовки разрешены. Без корректной CORS‑конфигурации браузер просто заблокирует доступ JavaScript к ответу, даже если запрос до S3 успешно дошёл.
Подробный ответ
CORS (Cross-Origin Resource Sharing) — это механизм безопасности браузера, который регулирует, можно ли выполнять запросы из одного происхождения (origin: комбинация домен/протокол/порт) к ресурсам на другом происхождении. По умолчанию браузер ограничивает такие «кросс-доменные» запросы, чтобы защитить пользователя от несанкционированного доступа к его данным.Когда фронтенд-приложение, например SPA на `https://app.example.com`, напрямую обращается к бакету S3 по адресу вида `https://my-bucket.s3.amazonaws.com`, браузер видит, что origin различаются. Даже если S3 возвращает корректный ответ, JavaScript-код не получит к нему доступ, если в ответе нет подходящих CORS-заголовков (`Access-Control-Allow-Origin`, `Access-Control-Allow-Methods` и т.д.).Чтобы браузер пропускал такие запросы, в настройках бакета S3 задают CORS-конфигурацию. Она определяет, какие заголовки S3 должен добавить в ответ, чтобы браузер считал запрос безопасным и разрешённым. Через эту конфигурацию обычно настраивают один или несколько политик, в которых указывают:
какие origin (домены) имеют право обращаться к бакету (например, только `https://app.example.com`, а не `*`);
какие кастомные заголовки клиент может отправлять (`Access-Control-Allow-Headers`) и какие заголовки сервер может «подсветить» в ответе (`Access-Control-Expose-Headers`);
как долго браузер может кэшировать результат preflight-запроса `OPTIONS` через заголовок `Access-Control-Max-Age`, чтобы не дергать S3 лишний раз.
Важно понимать, что CORS — это ограничение именно на стороне браузера. Запросы с бэкенда (сервер-сайд код, фоновые работы, CLI-инструменты, SDK на сервере) не подчиняются CORS: для них достаточно настроить IAM‑пользователей, роли и политики доступа. CORS нужен тогда, когда JavaScript в браузере стучится напрямую в S3: загрузка файлов по заранее подписанному URL, чтение статики, отображение изображений и т.п.Без корректной CORS-настройки происходит следующее: браузер отправляет запрос к S3, S3 может даже успешно его обработать и вернуть ответ с кодом `200`, но браузер заблокирует доступ к этому ответу для JavaScript и покажет ошибку CORS в консоли. Поэтому при организации прямого доступа к S3 из фронтенда настройка CORS — обязательный шаг.После настройки CORS браузер сможет выполнять запросы к бакету S3 с указанного домена. Например, фронтенд может загружать файлы напрямую в S3 по подписанному URL — это снижает нагрузку на бэкенд, потому что файлы идут не через ваш сервер, а сразу в хранилище.Типичные сценарии, где CORS для S3 необходим: хостинг статического фронтенда в S3 при обращении к файлам с другого домена; загрузка и чтение файлов напрямую из браузера по подписанным URL; использование S3 как хранилища медиафайлов для веб-приложения. Во всех этих случаях правильно настроенный CORS — ключ к тому, чтобы фронтенд стабильно работал без неожиданных блокировок со стороны браузера. Нашли ошибку? Выделите ее