Header decodificado
- Entrada
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- Saída esperada
- {"alg":"HS256","typ":"JWT"}
`alg` declara o algoritmo de assinatura, mas o servidor precisa validar esse valor, nunca aceitá-lo de forma cega.
JWT e autenticação
Um JWT parece uma string opaca, mas é só texto codificado em 3 partes visíveis para quem sabe olhar. Entender o que cada parte faz, e principalmente o que a assinatura protege e o que ela não protege, evita o erro mais comum: tratar o token como se fosse cifrado quando ele só está codificado.
`alg` declara o algoritmo de assinatura, mas o servidor precisa validar esse valor, nunca aceitá-lo de forma cega.
`sub` identifica o usuário, `iat` marca quando o token foi emitido em segundos desde 1970; nenhum campo aqui é secreto.
É um HMAC-SHA256; recalcular com o mesmo segredo e comparar byte a byte é a única forma válida de verificar o token.
Sim. Esse tipo de utilitário costuma mostrar os segmentos do token de forma legível para depuração e estudo, além de indicar situações de tempo e, quando aplicável, apoiar verificação local de assinatura HMAC.
Não com codificação padrão: Base64URL não esconde nada, qualquer pessoa decodifica o payload sem segredo algum; para sigilo real seria preciso um JWE (JSON Web Encryption), um padrão diferente do JWS comum que a maioria dos sistemas usa para autenticação.
Porque decodificar e validar são etapas separadas: o token continua sendo Base64URL válido depois de expirar, então o header e o payload sempre decodificam; é o servidor que precisa comparar a claim `exp` com o horário atual e rejeitar a requisição, o decodificador em si não aplica essa regra.
HS256 usa um único segredo compartilhado tanto para assinar quanto para verificar, então qualquer serviço que verifica também pode forjar tokens; RS256 usa um par de chaves RSA, a privada assina e fica só no emissor, a pública verifica e pode circular livremente sem risco de forjar um token novo.
`iat` (issued at) registra quando o token nasceu e `exp` (expiration) marca até quando ele vale, ambos como timestamp Unix em segundos; sem `exp`, um token roubado continuaria válido para sempre, então essa claim é o principal limite de tempo de vida de um JWT de sessão.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQSflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}Token e segredo ficam no navegador. Não use URLs, analytics ou suporte para compartilhar JWTs reais.