Você sabia que o formato JWT pode ser tanto um JWS quanto um JWE? E que o algoritmo mais recomendado para assinar um JWT é o ECDsa P-256 SHA-256 (ES256)? Veja neste artigo detalhes do JWT e como proteger melhor suas API's.

Json Web Token (JWT)

O JWT é o acrônimo de JSON Web Token. É uma estrutura de dados no formato JSON. Ele é compacto, seguro, e pode trafegar na URL sem prejudicar seu conteúdo. O JWT pode ser comparado a uma classe abstrata. JWS e JWE são as implementações do JWT.

Seu conteúdo é composto por claims, que são um conjunto de chave/valor. Fornecem ao client ou API informações sobre o usuário que está consumindo seus serviços.

Ele é amplamente utilizado para transferir dados através do protocolo HTTP, entre clients frontends (SPA) e API's. Pode ser também utilizado para transferência de dados entre API's.

O JWT é uma estrutura JSON. As especificações sobre como criptografar ou assinar digitalmente um JWT estão no Javascript Object Signing & Encryption (JOSE). É composto pelos seguintes componentes e suas respectivas RFC's:

AcrotimoNomenclaturaDetalhes
JWSJson Web Signature (RFC7515)Processo de assinatura digital de um JWT
JWEJson Web Encryption (RFC7516)Processo de criptografia de um JWT
JWKJson Web Key (RFC7517)Define uma estrutura JSON para representar uma chave de criptografia.
JWAJson Web Algorithm (RFC7518)Define os algoritmos válidos para assinar ou criptografar um JWT

O JOSE é um framework cujo objetivo é fornecer um método seguro para transferir as claims. Garantindo que seu conteúdo não seja adulterado durante o transporte das informações.

Json Web Signature (JWS)

O JWS é o mais popular e facilmente confundido com o próprio JWT. Após assinar digitalmente o JWT, ele torna-se um JWS. O JWS é o conteúdo JWT com uma assinatura digital.

A segurança do JWS é garantida pela sua assinatura digital. Esta assinatura é o resultado da criptografia da composição do Header & Payload.

Encrypt(header + '.' + payload, secret);

Dessa forma, o conteúdo do JWT (Payload) é legível, mas qualquer alteração no conteúdo resultaria em uma assinatura diferente.

A chave pública permite apenas acesso de leitura, possibilitando à API ou Client frontend (SPA) validar se o payload do JWT foi alterado. Apenas quem possui a chave privada pode gerar uma assinatura válida para o JWT.

O JWS é composto por três seções: Header, Payload e Digital Signature.

Exemplo de uso do algoritimo ES256:

O formato final do JWS é simples: é a transformação para base64url dos componentes, separados por . (ponto).

Json Web Encryption (JWE)

O JWE representa o conteúdo criptografado de um JWT. Assim como o JWS, ele possui uma estrutura de dados JSON própria:

  • Header
  • Chave Criptografada
  • Initialization Vector
  • Additional Authenticated Data (AAD)
  • Ciphertext
  • Authentication Tag

Alguns valores podem não ser utilizados, dependendo do algoritmo de assinatura utilizado.

Json Web Algorithms (JWA)

Não é qualquer algoritmo que pode ser utilizado para Assinar Digitalmente ou Criptografar um JWT. Existe uma RFC que especifica quais algoritmos devem ser utilizados. Mesmo que todos os algoritmos estejam em conformidade com a RFC, ela recomenda a utilização do ECDSA using P-256 and SHA-256 (ES256) ou RSASSA-PSS (PS256) para assinar digitalmente o JWT.

JWS

Abaixo uma tabela de quais algoritmos utilizar para assinar um JWS.

AlgoritmoDescrição
HS256HMAC using SHA-256
HS384HMAC using SHA-384
HS512HMAC using SHA-512
RS256RSASSA-PKCS1-v1_5 using SHA-256
RS384RSASSA-PKCS1-v1_5 using SHA-384
RS512RSASSA-PKCS1-v1_5 using SHA-512
ES256ECDSA using P-256 and SHA-256
ES384ECDSA using P-384 and SHA-384
ES512ECDSA using P-521 and SHA-512
PS256RSASSA-PSS using SHA-256 and MGF1 with SHA-256
PS384RSASSA-PSS using SHA-384 and MGF1 with SHA-384
PS512RSASSA-PSS using SHA-512 and MGF1 with SHA-512
noneNo digital signature or MAC performed

Json Web Key (JWK)

JWK é uma estrutura JSON que representa uma chave de criptografia. Na sua estrutura contém as informações para criptografar um JWT (JWE) ou Assinar Digitalmente (JWS).

Dentro de um ambiente OAuth 2.0, o responsável por criar e gerenciar o JWK é o Authorization Server. Como no OAuth 2.0 todos os JWT's são emitidos por um único servidor, ele gerencia o JWK. Somente o Authorization Server pode emitir um JWT.

Certos parâmetros do JWK podem ser públicos, permitindo que os consumidores do JWT validem se ele não foi adulterado.

Json Web Key Set (JWKS)

JWKS é um array de JWKs.

Os algoritmos de criptografia se tornam mais fracos com o tempo devido a melhorias em técnicas de análise criptográfica e no desempenho dos computadores. Ambos contribuem para diminuir o tempo necessário para quebrar um algoritmo. Portanto, o objetivo do JWK e JWKS é permitir que um servidor OAuth 2.0 se adapte facilmente a novos algoritmos.

Por esse motivo, as boas práticas dizem que o JWK deve mudar a cada 90 dias. Com o JWKS, ao trocar o algoritmo, não será necessário invalidar tokens gerados com o algoritmo anterior, permitindo uma troca gradual.

Referências