O que é uma URL assinada?

Uma URL assinada contém uma prova criptográfica de que uma parte autorizada concedeu acesso a um recurso ou a uma transformação. Sua assinatura geralmente abrange um prazo de expiração e o caminho ou os parâmetros de consulta específicos da requisição.

Como funcionam as URLs assinadas

Um signatário que detém uma chave monta uma string com as partes da requisição que deseja autorizar, normalmente o caminho, os parâmetros de consulta selecionados e um prazo de expiração, calcula uma assinatura sobre essa string e acrescenta a assinatura à URL. O serviço verifica a assinatura e o prazo de expiração antes de fornecer qualquer conteúdo. Dois modelos de chaves são comuns. Com um HMAC, o signatário e o serviço detêm o mesmo segredo; o Google Cloud CDN e o Smart CDN da Transloadit funcionam dessa forma. Com um par de chaves, o signatário mantém uma chave privada e o serviço precisa apenas da chave pública; o Amazon CloudFront verifica assinaturas RSA ou ECDSA com as chaves públicas de um grupo de chaves confiáveis. Em ambos os casos, trata-se de autorização delegada, não de criptografia. A AWS descreve URLs pré-assinadas como tokens bearer, e o Google afirma que qualquer pessoa que tenha uma URL assinada pode usá-la enquanto ela estiver ativa. Uma URL pré-assinada é o caso específico do armazenamento de objetos: o Amazon S3 usa esse nome para uma URL que carrega as credenciais de quem a criou para um único bucket, uma única chave de objeto e um único método HTTP, como um download com GET ou um upload com PUT, enquanto o Google Cloud Storage chama seu equivalente de URL assinada.

Informações essenciais

  1. É possível adicionar ou alterar um parâmetro de consulta após a assinatura? Somente se o esquema o deixar fora da assinatura ou se a política assinada permitir. O CloudFront retorna HTTP 403 quando uma string de consulta é adicionada a uma URL assinada após a assinatura. Uma política personalizada do CloudFront pode ampliar essa permissão: sua URL Resource pode conter curingas, o CloudFront compara a URL solicitada com esse padrão, e um asterisco no fim do caminho também corresponde à string de consulta. O imgix retorna 403 quando o caminho ou os parâmetros mudam depois que seu parâmetro s é definido. Esquemas que assinam uma requisição canônica também são sensíveis à forma como a requisição é feita: as assinaturas V4 do S3 e do Google Cloud Storage abrangem o método HTTP, o caminho, a string de consulta ordenada e o cabeçalho host, portanto uma URL assinada para um método ou nome de host não é validada para outro. O Google Cloud CDN é uma exceção deliberada quando você assina um URLPrefix em vez da URL completa: nesse caso, os parâmetros de consulta não são assinados e podem ser incluídos livremente, e uma assinatura é válida para toda URL que comece com o prefixo.
  2. Por que uma URL pré-assinada deixaria de funcionar antes do prazo de expiração definido? Geralmente porque as credenciais usadas para criá-la expiraram primeiro. A AWS afirma que uma URL pré-assinada do S3 expira no horário configurado ou quando as credenciais usadas para criá-la expiram, o que ocorrer primeiro. Assim, uma URL assinada com credenciais temporárias de uma função expira junto com a sessão da função, mesmo que tenha sido solicitado um prazo de validade maior. Da mesma forma, as URLs assinadas do Google Cloud Storage deixam de funcionar quando a chave usada para assiná-las passa por rotação. A AWS também lista a diferença no relógio da máquina que assina e proxies que modificam cabeçalhos ou strings de consulta como causas de divergências de assinatura. Assine com credenciais que permaneçam válidas por mais tempo que a URL ou emita URLs com validade menor que a sessão.
  3. O que acontece com um download ou uma reprodução que ainda está em andamento no momento da expiração? O prazo de expiração é verificado quando cada requisição HTTP chega, não enquanto uma resposta está sendo enviada. Tanto o S3 quanto o CloudFront documentam que um download iniciado pouco antes da expiração continua e que um cliente que se reconecta após a expiração não consegue prosseguir. No CloudFront, qualquer requisição Range GET feita após a expiração também falha. Portanto, um player que busca um arquivo grande por intervalos ou um gerenciador de downloads que retoma transferências precisa de um prazo de validade que cubra toda a sessão ou de uma forma de obter uma nova URL.
  4. Exigir URLs assinadas na CDN protege a origem, e as respostas assinadas continuam sendo armazenadas em cache? A CDN verifica a assinatura; a origem é um ponto de entrada separado. A AWS recomenda, mas não exige, restringir um bucket S3 para que ele só possa ser lido por meio do CloudFront. O Google alerta que o Cloud CDN não bloqueia requisições sem assinatura, portanto uma origem do Cloud Storage por trás dele não deve ser pública. Quanto ao cache, o CloudFront e o Google Cloud CDN removem os parâmetros de assinatura antes de encaminhar uma requisição à origem, e o Google primeiro valida a assinatura e depois atende à requisição a partir do cache, armazenando separadamente as respostas a requisições com e sem assinatura. Essa separação não remove o que foi armazenado em cache enquanto o conteúdo era público: o Cloud CDN atende uma requisição sem assinatura a partir do cache em caso de acerto de cache. Portanto, após restringir o acesso à origem, invalide as respostas anteriormente armazenadas em cache ou aguarde até que expirem. Alguns serviços vinculam o tempo de vida do cache ao prazo de validade: o imgix substitui Cache-Control pelo tempo restante até expires.

Quando as URLs assinadas são importantes

Use URLs assinadas para dar a um navegador, player ou parceiro acesso por tempo limitado a mídias privadas sem distribuir credenciais de armazenamento nem tornar a origem pública. Uma URL assinada autoriza quem a possui, não um usuário específico. Portanto, escolha um prazo de validade que você aceitaria para um link encaminhado e adicione outra verificação nos casos em que o acesso precise permanecer vinculado a uma única pessoa.

Como a Transloadit ajuda com URLs assinadas

O Smart CDN da Transloadit aceita URLs assinadas. Seu back-end adiciona um timestamp exp em milissegundos e um auth_key, ordena os parâmetros de consulta, calcula um HMAC-SHA256 com o Auth Secret a partir do Workspace, do nome do Template, do caminho do arquivo e dos parâmetros ordenados, e acrescenta o resultado como sig. Como os parâmetros de transformação fazem parte da string assinada, uma URL assinada não pode ser editada para solicitar uma variante diferente. O prazo de validade também limita por quanto tempo uma resposta assinada pode ser armazenada em cache, portanto um valor menor de exp restringe mais o acesso e reduz o reaproveitamento do cache. Para arquivos exportados para seu próprio bucket, o Robot /s3/store pode retornar URLs assinadas por meio do parâmetro sign_urls_for.

A Auth Key usada para assinar deve estar habilitada para uso com o Smart CDN, e a assinatura precisa ser gerada no seu back-end porque requer o Auth Secret. A documentação indica que exp é opcional e recomenda sempre defini-lo. As páginas vinculadas descrevem como assinar uma URL, mas não como uma requisição sem assinatura para o mesmo Template é tratada, nem se uma requisição de intervalo que chega após exp é recusada. Portanto, teste ambos os casos no seu próprio Workspace antes de tratar a assinatura como controle de acesso ou escolher um prazo de validade menor que a duração de uma sessão de reprodução.

Explore os recursos de entrega da Transloadit

Fontes

Transforme conhecimento sobre mídia em um pipeline funcional

Conecte uploads, processamento, IA, armazenamento e entrega por meio de uma única API declarativa, com o stack de codificação, o ajuste de escala e as constantes mudanças de formatos gerenciados para você.

Experimente a Transloadit gratuitamente