Padrões JOSE e JWT: RFC 7515 a 7519
Se você já implementou autenticação web moderna, provavelmente usou JSON Web Tokens (JWT). Mas o JWT é apenas uma peça de uma família maior de padrões conhecidos como JOSE (JSON Object Signing and Encryption). Entender a relação entre esses padrões é crucial para construir aplicações seguras.
Neste guia, exploraremos os cinco RFCs principais que compõem o stack JOSE:
- RFC 7515: JWS (JSON Web Signature)
- RFC 7516: JWE (JSON Web Encryption)
- RFC 7517: JWK (JSON Web Key)
- RFC 7518: JWA (JSON Web Algorithms)
- RFC 7519: JWT (JSON Web Token)
1. RFC 7515: JSON Web Signature (JWS)
O JWS é a forma mais comum de JWT. Ele garante que o conteúdo do token não foi adulterado. Ele fornece integridade e autenticidade, mas não confidencialidade (o conteúdo ainda é visível para qualquer pessoa que veja o token).
Estrutura:
Um JWS é tipicamente representado no formato Compact Serialization, que possui três partes separadas por pontos:
BASE64URL(Header) . BASE64URL(Payload) . BASE64URL(Signature)
- Header (Cabeçalho): Especifica o algoritmo usado para a assinatura (ex:
{"alg": "HS256"}). - Payload (Carga Útil): Os dados reais que estão sendo assinados.
- Signature (Assinatura): O resultado da assinatura do cabeçalho e da carga útil.
2. RFC 7516: JSON Web Encryption (JWE)
Enquanto o JWS fornece integridade, o JWE fornece confidencialidade. Ele criptografa a carga útil para que apenas o destinatário pretendido possa lê-la.
Estrutura:
A Serialização Compacta JWE possui cinco partes:
BASE64URL(Header) . BASE64URL(Encrypted Key) . BASE64URL(Initialization Vector) . BASE64URL(Ciphertext) . BASE64URL(Authentication Tag)
O JWE é frequentemente usado quando o token contém informações sensíveis, como PII (Informações de Identificação Pessoal), que não devem ser visíveis para o cliente ou proxies intermediários.
3. RFC 7517: JSON Web Key (JWK)
Um JWK é uma estrutura de dados JSON que representa uma chave criptográfica. É usado para compartilhar chaves públicas entre servidores de forma padronizada.
Exemplo:
{
"kty": "RSA",
"use": "sig",
"kid": "1b94c",
"n": "vXl...",
"e": "AQAB"
}
Uma coleção de JWKs é chamada de JWKS (JSON Web Key Set), geralmente encontrada em um endpoint como /.well-known/jwks.json.
4. RFC 7518: JSON Web Algorithms (JWA)
O JWA é o "dicionário" para o stack JOSE. Ele define os algoritmos específicos usados para assinatura (JWS) e criptografia (JWE).
Algoritmos Comuns:
- HS256: HMAC usando SHA-256 (Simétrico).
- RS256: RSASSA-PKCS1-v1_5 usando SHA-256 (Assimétrico).
- ES256: ECDSA usando P-256 e SHA-256 (Assimétrico).
- A128GCM: AES GCM usando chave de 128 bits (Criptografia).
5. RFC 7519: JSON Web Token (JWT)
O JWT é uma aplicação de JWS ou JWE onde a carga útil é um conjunto de Claims (Reivindicações). Reivindicações são informações sobre uma entidade (normalmente um usuário).
Reivindicações Padrão:
iss: Emissor (Issuer)sub: Assunto (Subject, normalmente ID do usuário)aud: Público (Audience)exp: Tempo de expiraçãoiat: Emitido em (Issued At)
Resumo Comparativo
| Padrão | Propósito | Analogia |
|---|---|---|
| JWS | Integridade | Uma carta assinada |
| JWE | Confidencialidade | Um envelope criptografado |
| JWK | Representação de Chave | Um arquivo de chave pública |
| JWA | Catálogo de Algoritmos | Uma lista de cifras |
| JWT | Formato de Dados | O token em si |
Perguntas Frequentes FAQ
P: Um JWT é sempre um JWS? R: Nem sempre, mas em 99% dos casos, sim. Um JWT pode ser um JWS (assinado), um JWE (criptografado) ou até mesmo um JWT inseguro (sem assinatura).
P: Devo usar RS256 ou HS256? R: RS256 (Assimétrico) é geralmente preferido para tokens de identidade porque permite que o cliente verifique a assinatura sem precisar da chave privada. HS256 (Simétrico) é mais rápido, mas requer o compartilhamiento do segredo.
P: Onde posso ver o que há dentro de um JWT? R: Como as cargas úteis do JWS são apenas codificadas em Base64, você pode decodificá-las facilmente. No entanto, você nunca deve confiar nos dados a menos que tenha verificado a assinatura.
Ferramentas Relacionadas
- Decodificador JWT - Decodifique e inspecione tokens JWS/JWT instantaneamente.
- Gerador de Hash - Gere hashes para verificação manual.
- Gerador de Senhas - Crie segredos seguros para assinatura HS256.