30 сентября 2026 г. · 5 мин чтения

Как поделиться приватными файлами S3 и R2 через presigned URL

Не каждому файлу место в публичном бакете. Договоры, счета или неопубликованные сборки могут оставаться приватными, и ими все равно можно поделиться по ссылке, которая работает ограниченное время.

Как работают presigned URL

URL содержит все, что нужно S3 для проверки запроса: ключ, которым он подписан, время подписи, срок действия и саму подпись. Выглядит это так:

https://your-bucket.s3.eu-central-1.amazonaws.com/contract.pdf
  ?X-Amz-Algorithm=AWS4-HMAC-SHA256
  &X-Amz-Credential=AKIA…/20260930/eu-central-1/s3/aws4_request
  &X-Amz-Date=20260930T120000Z
  &X-Amz-Expires=3600
  &X-Amz-SignedHeaders=host
  &X-Amz-Signature=…

Подпись создается на вашем компьютере. Провайдеру ничего не отправляется, пока кто-нибудь не откроет ссылку, а изменение любой ее части делает подпись недействительной.

Создание через AWS CLI

aws s3 presign s3://your-bucket/contract.pdf --expires-in 86400

Такая ссылка работает 24 часа. Для Cloudflare R2 или другого S3-совместимого сервиса укажите CLI его эндпоинт:

aws s3 presign s3://your-bucket/contract.pdf --expires-in 86400 \
  --endpoint-url https://<ACCOUNT_ID>.r2.cloudflarestorage.com

Ограничения, о которых стоит знать

  • Не больше 7 дней. Signature Version 4 допускает до 604 800 секунд, и в S3, и в R2.
  • Временные учетные данные истекают раньше. URL, подписанный в сессии STS или SSO, перестает работать, когда истекает сессия, даже если вы запросили больший срок.
  • Для R2 нужен домен API. Presigned URL в R2 работают с <ACCOUNT_ID>.r2.cloudflarestorage.com, а не с собственным доменом.
  • Воспользоваться ссылкой может любой, у кого она есть. Относитесь к ней как к паролю, пока не истечет срок.
  • Отозвать отдельную ссылку нельзя. Чтобы досрочно отключить ссылку, удалите или переименуйте объект либо деактивируйте ключ доступа, которым она подписана.

Presigned URL или публичный бакет?

Используйте публичный бакет для файлов, которые предназначены для показа и должны работать долго: скриншоты в документации, изображения в README. Используйте presigned URL для всего конфиденциального или краткосрочного. Многие держат по одному бакету каждого типа и выбирают для каждого файла.

Частые вопросы

Может ли presigned URL действовать дольше 7 дней?

Нет, если используется Signature Version 4, как в S3 и R2. Для более долгого доступа сделайте файл публичным или создавайте новую ссылку, когда старая истечет.

Почему мой presigned URL возвращает SignatureDoesNotMatch?

Обычно URL изменили после подписи, например почтовый клиент или замена хоста на собственный домен. Настройки региона и эндпоинта тоже должны соответствовать бакету.

Работают ли presigned URL с Backblaze B2 и MinIO?

Да. Оба поддерживают presigned URL с Signature Version 4 через свои S3-совместимые API.