Объектное хранилище S3: как устроено и чем отличается от файлового и блочного
Автор: Кирилл Бодров, технический аккаунт-менеджер EdgeCenter.
Объектное хранилище — это способ хранения данных, при котором каждый файл сохраняется как самостоятельный объект: данные, метаданные и уникальный ключ, без иерархии каталогов. Доступ к объектам выполняется по HTTP через API. Стандартом де-факто для такого API стал S3 API — интерфейс сервиса Amazon S3, запущенного в марте 2006 года. Хранилища, которые реализуют этот интерфейс, называют S3-совместимыми.
Ниже — сравнение блочного, файлового и объектного хранения, устройство объекта и бакета, почему в S3 нет папок, основные операции S3 API, модель консистентности, задачи, для которых S3 подходит и не подходит, переносимость между провайдерами и экономика связки S3 и CDN.
Коротко:
- Объект в S3 состоит из данных, метаданных и ключа. Ключ уникален в пределах бакета, пользовательские метаданные ограничены 2 КБ.
- В объектном хранилище нет настоящих папок. Пространство имён бакета плоское. «Папки» в интерфейсах — это префиксы ключей, которые группируются по разделителю /.
- Объект нельзя изменить частично. Чтобы изменить один байт, объект перезаписывают целиком, поэтому S3 не заменяет диск для базы данных и файловую шару.
- Одной операцией PUT в S3 загружается до 5 ГБ. Большие объекты загружаются через multipart upload — до 10 000 частей от 5 МиБ до 5 ГиБ. Максимальный размер объекта — 50 ТБ.
- S3 API — стандарт де-факто. Код, SDK и утилиты, написанные для S3, работают с S3-совместимыми хранилищами после смены адреса (endpoint) и ключей доступа.
- Публичная раздача из S3 выгоднее через CDN: узлы CDN кешируют объекты, и хранилище отдаёт трафик, только если данные не были кешированы.
Что такое объектное хранилище и S3
Объектное хранилище (object storage) — архитектура хранения данных, которая управляет данными как набором объектов, а не как файлами в дереве каталогов или блоками на диске. SNIA, международная ассоциация индустрии систем хранения, описывает объектное хранилище как метод сохранения и последующего получения наборов данных, где каждый объект обрабатывается как единое целое со своим уникальным идентификатором и где нет структуры, соответствующей иерархии каталогов файловой системы.
Amazon S3 (Amazon Simple Storage Service) — облачный сервис объектного хранения компании Amazon Web Services, запущенный в марте 2006 года. Документация AWS определяет Amazon S3 как сервис, который хранит данные как объекты внутри бакетов: объект — это файл и описывающие его метаданные, бакет — контейнер для объектов.
S3 API — HTTP-интерфейс сервиса Amazon S3: набор операций для создания бакетов, загрузки, чтения, перечисления и удаления объектов, подписанных ключами доступа. S3 API не является формальным стандартом ISO или IETF: спецификацию определяет и развивает AWS. Тем не менее S3 API реализуют многие системы хранения и облачные провайдеры, включая открытые решения MinIO и Ceph.
Три сущности часто путают. Объектное хранилище — класс систем. Amazon S3 — конкретный сервис AWS. S3-совместимое хранилище — любое объектное хранилище, которое принимает запросы S3 API. Выражение «S3-хранилище» в русскоязычной практике означает именно S3-совместимое объектное хранилище.
Блочное, файловое и объектное хранилище: в чём разница
Блочное, файловое и объектное хранилища различаются единицей данных и способом доступа: блочное отдаёт диск, файловое — дерево файлов по сети, объектное — объекты по HTTP.
Блочное хранилище (block storage) — хранилище, которое предоставляет клиенту виртуальный диск, разбитый на блоки фиксированного размера. Операционная система клиента размечает такой диск и создаёт на нём свою файловую систему. Доступ к блочным устройствам по сети выполняется по протоколам iSCSI, Fibre Channel, NVMe over Fabrics. Блочное хранилище позволяет изменить любой блок на месте, поэтому подходит для баз данных и дисков виртуальных машин. Блочный том обычно подключён к одному серверу одновременно.
Файловое хранилище (file storage) — хранилище, которое предоставляет иерархию каталогов и файлов по сетевому протоколу NFS (Network File System) или SMB (Server Message Block). Файловое хранилище поддерживает блокировки, права доступа и частичное изменение файлов, и к одной файловой системе могут одновременно подключаться многие клиенты. Типичная реализация — сетевое хранилище NAS. Граница: иерархия каталогов и блокировки ограничивают масштабирование на миллиарды файлов.
Объектное хранилище хранит объекты в плоском пространстве имён и отдаёт их по HTTP(S) через REST API. Объект записывается и читается целиком или диапазоном байтов, но не изменяется на месте. Взамен объектное хранилище масштабируется практически без ограничений по числу объектов и объёму и не требует монтирования к серверу.
|
Параметр |
Блочное |
Файловое |
Объектное |
|
Единица данных |
Блок фиксированного размера |
Файл в каталоге |
Объект: данные, метаданные, ключ |
|
Структура |
Нет, её создаёт ОС клиента |
Иерархия каталогов |
Плоское пространство, префиксы |
|
Протокол доступа |
iSCSI, Fibre Channel, NVMe-oF |
NFS, SMB |
HTTP(S), S3 API |
|
Изменение данных |
Любой блок на месте |
Частичная запись в файл |
Только перезапись объекта |
|
Масштабирование |
Объём тома, один сервер |
Ограничено файловой системой |
Практически без ограничений |
|
Задержка (ориентир) |
Доли миллисекунды и единицы мс |
Единицы миллисекунд |
Десятки миллисекунд до первого байта |
|
Стоимость хранения |
Высокая |
Средняя |
Низкая |
|
Типичный сценарий |
Базы данных, диски ВМ |
Общие папки, домашние каталоги |
Медиа, бэкапы, статика, датасеты |
Значения задержки — инженерные ориентиры, а не гарантии: фактические цифры зависят от оборудования, сети и нагрузки. Соотношение стоимости отражает типичную структуру тарифов, а не цены конкретного провайдера.
Блочное и файловое хранилища не конкурируют с объектным, а дополняют его. Типовая архитектура веб-проекта: база данных — на блочном томе, общие конфигурации — на файловом хранилище, пользовательские загрузки, медиа и резервные копии — в объектном хранилище.
Анатомия объекта: данные, метаданные, ключ
Объект — основная единица объектного хранилища, состоящая из данных, метаданных и ключа.
Данные (value) — содержимое объекта, любая последовательность байтов: изображение, видеосегмент, архив, файл журнала. Хранилище не интерпретирует данные объекта.
Ключ объекта (object key) — уникальный идентификатор объекта внутри бакета. У каждого объекта ровно один ключ. Сочетание бакета, ключа и, при включённом версионировании, идентификатора версии однозначно определяет объект. Пример ключа: photos/2026/11/product-1842.webp.
Метаданные (metadata) — набор пар «имя — значение», описывающих объект. Метаданные делятся на два типа:
- системные — их задаёт хранилище или клиент через стандартные заголовки: размер, дата изменения, ETag, Content-Type, Cache-Control, класс хранения;
- пользовательские — произвольные пары, которые клиент передаёт в заголовках с префиксом x-amz-meta-, например x-amz-meta-author: editorial. В Amazon S3 пользовательские метаданные ограничены 2 КБ на объект.
Пользовательские метаданные нельзя изменить после загрузки. Поэтому метаданные, которые часто меняются, лучше хранить во внешней базе данных, а в объекте — только неизменные атрибуты.
Объект не изменяется на месте. Базовый S3 API не предусматривает дописывания в середину объекта: чтобы изменить один байт, объект загружают заново целиком. Чтение части объекта возможно — операция GET с заголовком Range возвращает указанный диапазон байтов. На этом свойстве построена потоковая раздача видео и докачка больших файлов.
Почему в S3 нет папок: префиксы и разделитель
Пространство имён бакета плоское: объект photos/2026/cat.jpg — это один объект с ключом из 20 символов, а не файл cat.jpg в папке 2026. Префиксы можно использовать для организации данных по аналогии с каталогами, но префиксы не являются каталогами.
Префикс (prefix) — строка в начале ключа объекта. Разделитель (delimiter) — символ, по которому операция перечисления группирует ключи с общим префиксом. Чаще всего разделителем служит символ /, хотя S3 API допускает любой символ.
Как работает группировка. Пусть в бакете лежат объекты:
| sample.jpg photos/2006/January/sample.jpg photos/2006/February/sample2.jpg photos/2006/February/sample3.jpg |
Запрос списка объектов с разделителем / вернёт объект sample.jpg и один элемент CommonPrefixes со значением photos/. Запрос с префиксом photos/2006/ и тем же разделителем вернёт общие префиксы photos/2006/January/ и photos/2006/February/. Именно так файловые менеджеры и веб-консоли рисуют «дерево папок».
Что следует из плоского пространства имён:
- Переименование «папки» — это копирование и удаление каждого объекта с этим префиксом. Для префикса с миллионом объектов это миллион операций копирования и миллион удалений.
- Пустая «папка» существует, только если создан объект нулевого размера с ключом, оканчивающимся на /. Так её создают веб-консоли.
- Перечисление возвращает ключи постранично. Операция ListObjectsV2 в Amazon S3 возвращает до 1000 объектов за запрос в лексикографическом порядке ключей; следующая страница запрашивается с маркером продолжения (continuation token).
- Поиск по маске не поддерживается. S3 API фильтрует только по префиксу; поиск по части имени или по метаданным требует внешнего индекса.
| aws s3api list-objects-v2 --bucket media --prefix photos/2006/ --delimiter / \ --endpoint-url https://s3.example.ru |
Параметр --endpoint-url направляет запрос AWS CLI в S3-совместимое хранилище вместо Amazon S3.
Бакет: что это и как правильно задать ему имя
Бакет (bucket) — контейнер верхнего уровня для объектов в объектном хранилище. Каждый объект принадлежит ровно одному бакету. На уровне бакета задаются политика доступа, версионирование, правила жизненного цикла, регион размещения, а ещё обычно ведётся учёт использования.
Правила именования бакетов общего назначения в Amazon S3:
- Длина имени — от 3 до 63 символов.
- Допускаются только строчные латинские буквы, цифры, точки и дефисы.
- Имя начинается и заканчивается буквой или цифрой.
- В имени нет двух точек подряд
- Имя не может иметь вид IP-адреса, например 168.5.4.
- Запрещены зарезервированные префиксы xn--, sthree- и ряд служебных суффиксов.
У S3-совместимых провайдеров правила уникальности и допустимые символы могут отличаться — уточняйте их в документации.
Точки в имени бакета лучше не использовать. При адресации виртуального хоста по HTTPS имя бакета становится частью доменного имени, и wildcard-сертификат хранилища не покрывает имена с точками.
Существует два стиля адресации бакета. При адресации виртуального хоста (virtual-hosted style) имя бакета — поддомен: https://media.s3.example.ru/photos/cat.jpg. При адресации по пути (path style) имя бакета — первый сегмент пути: https://s3.example.ru/media/photos/cat.jpg. Какой стиль поддерживается, указывается в документации хранилища и в настройках SDK.
Основные операции S3 API
S3 API — это набор HTTP-запросов к бакету и объектам, подписанных ключом доступа. Шесть групп операций закрывают большинство задач.
|
Операция |
HTTP-запрос |
Что делает |
|
PutObject |
PUT /ключ |
Загружает объект целиком или перезаписывает существующий |
|
GetObject |
GET /ключ |
Возвращает данные и метаданные; с Range — диапазон байтов |
|
HeadObject |
HEAD /ключ |
Возвращает только метаданные: размер, ETag, дату, Content-Type |
|
DeleteObject |
DELETE /ключ |
Удаляет объект, при версионировании ставит маркер удаления |
|
ListObjectsV2 |
GET /?list-type=2 |
Перечисляет ключи по префиксу и разделителю, постранично |
|
CopyObject |
PUT /ключ с x-amz-copy-source |
Копирует объект на стороне хранилища, без скачивания |
HeadObject — самая недооценённая операция. HeadObject проверяет существование объекта и читает его размер и ETag без передачи данных, поэтому используется для проверок перед загрузкой и для синхронизации.
Multipart upload: загрузка больших объектов
Multipart upload — механизм S3 API, который загружает объект частями: части передаются независимо, параллельно и в любом порядке, а хранилище собирает из них один объект. Последовательность операций:
- CreateMultipartUpload — открывает загрузку и возвращает идентификатор UploadId.
- UploadPart — загружает часть с номером от 1 до 10 000; хранилище возвращает ETag части.
- CompleteMultipartUpload — передаёт список номеров частей и их ETag; хранилище собирает объект.
- AbortMultipartUpload — отменяет загрузку и удаляет загруженные части.
Перед загрузкой многотерабайтных объектов проверьте документацию провайдера.
Незавершённые загрузки занимают место. Части прерванной загрузки, которую не завершили и не отменили, остаются в хранилище. Для бакетов с массовыми загрузками стоит настроить правило жизненного цикла, удаляющее незавершённые загрузки.
Модель консистентности: когда запись видна при чтении
Модель консистентности определяет, увидит ли клиент результат записи при следующем чтении. Если хранилище обеспечивает сильную консистентность, как правило это означает вот что:
- Новый объект сразу появляется в результатах перечисления ключей.
- После перезаписи объекта чтение сразу возвращает новые данные.
- После удаления объекта чтение сразу не возвращает данных, а перечисление не показывает удалённый ключ.
- Обновление одного ключа атомарно: параллельный читатель получит либо старые, либо новые данные, но не смесь.
При одновременной записи в один ключ побеждает запрос с последней меткой времени (last-writer-wins), атомарных изменений нескольких ключей нет, а изменения конфигурации бакета — например, включение версионирования — распространяются с задержкой.
Гарантии S3-совместимого хранилища зависят от его архитектуры и уточняются в документации провайдера. Если приложение читает объект сразу после записи с другого узла или полагается на мгновенное появление ключа в списке, проверьте это поведение на тестовом бакете.
Версионирование, классы хранения и жизненный цикл
Версионирование, классы хранения и правила жизненного цикла — три механизма бакета, которые управляют историей объектов и стоимостью хранения.
Версионирование (versioning) — режим бакета, при котором каждая перезапись создаёт новую версию объекта с собственным идентификатором, а удаление ставит маркер удаления вместо уничтожения данных. Версионирование защищает от случайной перезаписи и удаления, но увеличивает занимаемый объём: каждая версия хранится и оплачивается отдельно.
Класс хранения (storage class) — уровень хранения с собственным соотношением цены хранения, цены доступа и скорости доступа. Часто используемые данные хранятся в стандартном классе, редко используемые — в «холодных» классах с низкой ценой хранения и платным или медленным чтением. Набор классов и их названия у каждого провайдера свои.
Жизненный цикл (lifecycle) — правила, которые автоматически переводят объекты в другой класс хранения или удаляют их по возрасту, префиксу или тегу. Типовые правила: удалять журналы старше 90 дней, переводить резервные копии в холодный класс через 30 дней, удалять старые версии и незавершённые multipart-загрузки.
Доступ: ключи, политики бакета, presigned URL
Доступ к объектному хранилищу S3 управляется ключами доступа, политиками и временными подписанными ссылками.
Ключи доступа — пара из идентификатора (access key) и секретного ключа (secret key). Секретный ключ не передаётся по сети: клиент подписывает им каждый запрос по алгоритму Signature Version 4, а хранилище проверяет подпись. Ключи выдаются пользователю или сервисному аккаунту и должны иметь минимально необходимые права.
Политика бакета (bucket policy) — JSON-документ, привязанный к бакету и описывающий, кто и какие операции может выполнять с объектами, с возможными условиями по IP-адресу или префиксу. Политика бакета — основной способ открыть публичное чтение статики или ограничить доступ сервисному аккаунту одним префиксом.
Presigned URL — временная ссылка на конкретный объект с подписью в параметрах запроса, которая позволяет скачать или загрузить объект без ключей доступа. По документации Amazon S3 подписанная ссылка — это токен на предъявителя: ею может воспользоваться любой, у кого она есть, до истечения срока; при подписи ключами пользователя через SDK максимальный срок — 7 дней. Presigned URL — стандартный способ дать пользователю загрузить файл прямо в хранилище, минуя сервер приложения.
Модели прав, публичный доступ и типичные ошибки конфигурации — в материале о правах доступа в S3, примеры работы с presigned URL из кода — в материале о работе с S3 из кода.
Когда использовать объектное хранилище, а когда нет
Объектное хранилище подходит для данных, которые записываются целиком, читаются часто или хранятся долго и которые нужно отдавать по HTTP. Объектное хранилище не подходит для данных, которые изменяются частями, требуют блокировок или минимальной задержки.
|
Задача |
Подходит ли S3 |
Почему (и что выбрать, если нет) |
|
Статика сайта: JS, CSS, шрифты, изображения |
Да |
Раздача по HTTP, в связке с CDN |
|
Медиабиблиотека, пользовательские загрузки |
Да |
Неограниченный объём, presigned URL для загрузки |
|
Резервные копии |
Да |
Дешёвое хранение, версионирование, жизненный цикл |
|
Датасеты для машинного обучения |
Да |
Параллельное чтение многими узлами |
|
Журналы и аналитические выгрузки |
Да |
Запись целыми файлами, удаление по возрасту |
|
Видеоархив, VOD-сегменты |
Да |
Чтение диапазонами, раздача через CDN |
|
Файловая шара для сотрудников |
Нет |
Нет блокировок и частичной записи, использовать NAS по SMB или NFS |
|
База данных |
Нет |
Нужна запись блоков на месте, использовать блочный том |
|
Системный диск виртуальной машины |
Нет |
Нужен блочный диск |
|
Мелкие файлы, меняющиеся каждую секунду |
Нет |
Каждое изменение — перезапись и платная операция |
Отдельный случай — монтирование бакета как файловой системы через FUSE-утилиты вроде s3fs или rclone mount. Такой режим удобен для разовых операций, но не превращает объектное хранилище в файловое: изменение файла по-прежнему означает перезапись объекта, переименование каталога — копирование всех объектов, а блокировки не работают. Для рабочих нагрузок приложения лучше обращаться к хранилищу через S3 API напрямую.
S3-совместимость: что даёт стандарт де-факто
S3-совместимость означает, что хранилище принимает запросы S3 API и отвечает на них так же, как Amazon S3, поэтому инструменты и код, написанные для S3, работают с ним без переписывания.
Что даёт S3-совместимость:
- Готовые SDK для всех распространённых языков — AWS SDK, boto3 для Python, библиотеки для Go, Java, Node.js, PHP.
- Готовые утилиты — AWS CLI, s3cmd, rclone, графические клиенты, плагины резервного копирования и CMS.
- Интеграции из коробки — системы резервного копирования, CMS, платформы аналитики и машинного обучения, которые умеют писать в S
- Смену провайдера без переписывания кода — в приложении меняются адрес хранилища (endpoint), регион и ключи доступа.
S3-совместимость — главный инструмент против привязки к провайдеру (vendor lock-in). Смена провайдера сводится к трём шагам: создать бакеты у нового провайдера, перенести объекты утилитой синхронизации и переключить конфигурацию приложения.
rclone sync old-s3:media new-s3:media --checksum --transfers 32
Совместимость не бывает полной. S3-совместимые хранилища реализуют базовые операции (PUT, GET, HEAD, DELETE, LIST, multipart upload) практически одинаково, но расходятся в расширенных возможностях: классах хранения, правилах жизненного цикла, блокировке объектов, уведомлениях о событиях, ACL, лимитах размеров. Перед миграцией сверьте список операций, которые использует приложение, с таблицей совместимости провайдера.
S3 и CDN: экономика исходящего трафика
Публичные объекты из S3 выгоднее и быстрее раздавать через CDN: узлы CDN кешируют объекты рядом с пользователями, и хранилище отдаёт данные, только если их нет в кеше.
Счёт за объектное хранилище обычно складывается из трёх составляющих: объём хранения (гигабайт в месяц), число операций (запросы PUT, GET, LIST тарифицируются отдельно или входят в пакет) и исходящий трафик в интернет. Для сайта или видеосервиса с большой аудиторией исходящий трафик и операции чтения часто становятся главной статьёй.
Раздача напрямую из S3. Каждый запрос пользователя — это операция GET и исходящий трафик из хранилища. Все пользователи, где бы они ни находились, обращаются к одному региону хранения, и задержка растёт с расстоянием.
Раздача через CDN. Хранилище становится источником (origin) для CDN — принцип работы сети доставки контента разобран в материале «Что такое CDN». Первый запрос объекта узел CDN забирает из хранилища, последующие обслуживает из кеша. Нагрузка на хранилище и исходящий трафик из него пропорциональны объёму некешируемых данных, а не числу пользователей. При доле попаданий в кеш 95% хранилище отдаёт примерно двадцатую часть запросов.
Связка S3 и CDN одного провайдера упрощает настройку и может менять экономику: трафик между хранилищем и CDN внутри одной инфраструктуры у ряда провайдеров тарифицируется иначе, чем исходящий трафик в интернет. Так ли это у конкретного провайдера, нужно проверять по его тарифам. В EdgeCenter объектное хранилище интегрируется с EdgeCDN, а трафик к CDN не тарифицируется.
Чтобы CDN кешировал объекты эффективно, задайте объектам системные метаданные Cache-Control при загрузке: версионированной статике — длинный срок, изображениям без версии в имени — умеренный. Правила выбора TTL — в материале о Cache-Control, TTL и Vary.
EdgeStorage: S3-совместимое хранилище
EdgeStorage — объектное хранилище, совместимое с протоколом S3. Хранилище работает с инструментами и библиотеками, поддерживающими S3, — AWS CLI, s3cmd, AWS SDK для JavaScript, S3fs, — а также управляется через Terraform.
Хранилище можно использовать как источник для раздачи статики и медиа через EdgeCDN, для хранения видеоархивов и VOD-контента, резервных копий и выгрузок. Подробнее — на странице сервиса.
Часто задаваемые вопросы
Что такое S3-хранилище? Это объектное хранилище, совместимое с S3 API, интерфейсом сервиса Amazon S3. Файлы хранятся в нём как объекты в бакетах, каждый объект состоит из данных, метаданных и уникального ключа. Доступ к объектам выполняется по HTTP через API, утилиты или SDK, без монтирования диска к серверу.
Чем объектное хранилище отличается от файлового? Файловое хранилище предоставляет иерархию каталогов по протоколам NFS или SMB, поддерживает блокировки и частичное изменение файлов. Объектное хранилище хранит объекты в плоском пространстве имён, отдаёт их по HTTP через S3 API и не позволяет изменить часть объекта — только перезаписать его целиком. Взамен объектное хранилище масштабируется практически без ограничений.
Чем объектное хранилище отличается от блочного? Блочное хранилище предоставляет серверу виртуальный диск, на котором ОС создаёт файловую систему, и позволяет изменять любой блок на месте с минимальной задержкой. Объектное хранилище отдаёт объекты целиком по HTTP. Блочное подходит для баз данных и дисков виртуальных машин, объектное — для медиа, бэкапов и статики.
Что такое бакет в S3? Это контейнер верхнего уровня для объектов в S3-хранилище. Каждый объект принадлежит одному бакету, а на уровне бакета задаются политика доступа, версионирование и правила жизненного цикла.
Есть ли в S3 папки? Нет. Пространство имён бакета плоское, а «папки» — это префиксы в ключах объектов, например photos/2026/. Веб-консоли и файловые менеджеры группируют ключи по разделителю / и показывают их как дерево каталогов. Переименование такой «папки» означает копирование и удаление каждого объекта с этим префиксом.
Что такое S3-совместимое хранилище? S3-совместимое хранилище — объектное хранилище любого провайдера или открытого ПО, которое принимает запросы S3 API. С ним работают те же SDK, утилиты и интеграции, что и с Amazon S3. Для подключения меняются только адрес хранилища и ключи доступа. Расширенные функции, например классы хранения и блокировка объектов, поддерживаются не везде.
Можно ли хранить базу данных в S3? Рабочую базу данных — нет: СУБД изменяет данные блоками на месте и требует минимальной задержки, а объект в S3 можно только перезаписать целиком. Для базы данных нужен блочный том. В объектном хранилище хранят резервные копии и выгрузки базы данных.
Что такое presigned URL? Это временная ссылка на объект в S3 с подписью в параметрах, которая позволяет скачать или загрузить объект без ключей доступа. Ссылка работает для любого, у кого она есть, до истечения срока — в Amazon S3 до 7 дней при подписи ключами пользователя. Так дают пользователям загружать файлы прямо в хранилище.
Зачем подключать CDN к S3-хранилищу? CDN кеширует объекты из хранилища на узлах рядом с пользователями. Пользователи получают файлы быстрее, а хранилище обрабатывает только запросы при промахах кеша, поэтому снижаются нагрузка, число платных операций и исходящий трафик из хранилища. Для эффективного кеширования объектам задают метаданные Cache-Control.