Открыть сервис

Подписанный URL

Подписанный URL (англ. signed URL) — это унифицированный указатель ресурса (URL), содержащий криптографическую подпись, которая подтверждает подлинность запроса и временные права доступа к определённому ресурсу, обычно хранящемуся в облачном хранилище или на защищённом сервере. Подпись генерируется с использованием секретного ключа и включает в себя информацию о сроке действия, разрешённых операциях (например, чтение, запись) и, возможно, об IP-адресе отправителя. Подписанные URL широко применяются для предоставления временного, контролируемого доступа к файлам без необходимости раскрытия постоянных учётных данных или аутентификации каждого пользователя.

Принцип работы

Подписанный URL создаётся сервером или сервисом облачного хранения (например, Amazon S3, Google Cloud Storage, Yandex Object Storage) на основе секретного ключа доступа. Процесс включает следующие шаги:

  1. Формирование политики доступа: Определяется, к какому ресурсу (объекту) предоставляется доступ, какие действия разрешены (GET, PUT, DELETE), срок действия (время жизни подписи) и, опционально, ограничения по IP-адресу, диапазону байтов или хешу содержимого.
  2. Вычисление подписи: Политика сериализуется в строку, к которой добавляется секретный ключ. Затем с помощью криптографической хеш-функции (например, HMAC-SHA256) вычисляется подпись.
  3. Добавление подписи к URL: Подпись и параметры политики (например, Signature, Expires, Key-Pair-Id для Amazon CloudFront) включаются в URL в качестве query-параметров.
  4. Проверка на стороне сервера: При получении запроса сервер извлекает подпись и параметры, восстанавливает политику, повторно вычисляет подпись с использованием того же секретного ключа и сравнивает с переданной. Если подпись совпадает, срок действия не истёк и все ограничения соблюдены, запрос выполняется.

Классификация

Подписанные URL можно разделить по нескольким признакам:

По типу доступа

По сроку действия

По способу генерации

Применение

Подписанные URL используются в различных сценариях, где требуется временный, контролируемый доступ к защищённым ресурсам:

Раздача статического контента

Загрузка пользовательского контента

API и микросервисы

Безопасность и ограничение доступа

Примеры реализации

Amazon S3

Amazon Simple Storage Service (S3) поддерживает подписанные URL через AWS SDK. Пример генерации на Python с использованием библиотеки boto3: ```python import boto3 from botocore.config import Config

s3_client = boto3.client('s3', config=Config(signature_version='s3v4')) url = s3_client.generate_presigned_url( ClientMethod='get_object', Params={'Bucket': 'my-bucket', 'Key': 'path/to/file.pdf'}, ExpiresIn=3600 # срок действия 1 час ) print(url) ```

Google Cloud Storage

В Google Cloud Storage подписанные URL создаются с помощью утилиты gsutil или клиентских библиотек. Пример через gsutil: ``bash gsutil signurl -d 1h /path/to/private-key.json gs://my-bucket/path/to/file.pdf ``

Yandex Object Storage

В сервисе Yandex Object Storage подписанные URL генерируются аналогично S3, так как он совместим с API Amazon S3. Пример через HTTP-запрос с использованием HMAC-SHA256: `` GET /path/to/file.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Date=...&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=... ``

CloudFront (AWS)

Amazon CloudFront поддерживает подписанные URL для доступа к контенту, раздаваемому через CDN. Для генерации требуется ключевая пара (Key Pair ID и Private Key). Пример на Java: ``java SignedUrl signedUrl = SignedUrl.builder() .resourceUrl("https://d123.cloudfront.net/video.mp4";) .expirationDate(new Date(System.currentTimeMillis() + 3600 * 1000)) .privateKey(privateKey) .keyPairId("K2J4T5R6M8N9") .build(); String url = signedUrl.generate(); ``

Преимущества и недостатки

Преимущества

Недостатки

Безопасность

При использовании подписанных URL необходимо соблюдать следующие меры безопасности:

Сравнение с другими методами аутентификации

МетодОписаниеСложность реализацииБезопасностьПрименение
Подписанный URLКриптографическая подпись в URLНизкаяВысокая (при HTTPS)Временный доступ к объектам хранилища
API-ключСтатический ключ, передаваемый в заголовке или параметреНизкаяСредняяДоступ к API
OAuth 2.0Токены доступа, получаемые после аутентификацииВысокаяВысокаяДоступ к ресурсам от имени пользователя
JWT (JSON Web Token)Самодостаточный токен с подписьюСредняяВысокаяАутентификация и авторизация в API
Базовая аутентификацияПередача логина и пароля в заголовке (Base64)Очень низкаяНизкаяУстаревший метод, не рекомендуется

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

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →