Como decodificar um JWT e inspecionar suas declarações com segurança
Resposta rápida
Um JWT são três strings Base64URL unidas por pontos: header.payload.signature. Decodifique o cabeçalho e a carga útil com a decodificação Base64URL para inspecionar as declarações - mas a decodificação apenas lê os dados, não verifica a autenticidade. Sempre verifique a assinatura no servidor antes de confiar em qualquer reclamação. Use nosso decodificador JWT para inspecionar tokens em seu navegador.
Introdução
Um JSON Web Token (JWT, RFC 7519) é um formato de token compacto e seguro para URL usado para autenticação e autorização. Possui três partes codificadas em Base64URL separadas por pontos: header.payload.signature. O cabeçalho descreve o algoritmo, a carga contém declarações (ID do usuário, funções, expiração) e a assinatura prova que o token foi emitido por uma parte confiável. Crucialmente, o cabeçalho e a carga útil são codificados, não criptografados – qualquer pessoa pode lê-los.
Passo a passo
-
Divida o token em três partes
Um JWT se parece com xxxxx.yyyyy.zzzzz. Divida no caractere de ponto para obter o cabeçalho (parte 0), carga útil (parte 1) e assinatura (parte 2). Se não houver exatamente três partes, o token está malformado.
-
Base64URL decodifica o cabeçalho
O cabeçalho é um objeto JSON codificado em Base64URL como {"alg":"HS256","typ":"JWT"}. Base64URL usa - e _ em vez de + e/e omite o preenchimento. Decodifique-o e JSON.parse para ler o algoritmo e digitar. Nosso decodificador JWT faz isso automaticamente.
-
Base64URL decodifica a carga útil (reivindicações)
A carga útil é um objeto JSON de reivindicações. As reivindicações registradas incluem iss (emissor), sub (assunto), aud (público), exp (expiração), nbf (não antes), iat (emitido em) e jti (id de token). As declarações privadas são específicas do aplicativo (por exemplo, função, email). Decodifique e inspecione, mas não confie até ser verificado.
-
Verifique o vencimento e as reivindicações não anteriores
exp e nbf são carimbos de data/hora Unix (segundos). Se o tempo atual tiver passado de exp, o token expirou e deve ser rejeitado. Se a hora atual for anterior ao nbf, o token ainda não é válido. Verifique se há UX no lado do cliente, mas aplique-os no lado do servidor para segurança.
-
Verifique a assinatura no servidor (nunca no lado do cliente)
A assinatura é HMAC-SHA256(secret, header.payload) para HS256 ou assinatura RSA/ECDSA para RS256/ES256. A verificação requer a chave secreta ou pública, que nunca deve chegar ao navegador. Use uma biblioteca como jsonwebtoken (Node) ou jose para verificar – nunca escreva sua própria criptografia.
Exemplos
Um típico JWT (três partes)
Entrada: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpmeJf36POk6yJV_adQssw5c
Saída: Header: {"alg":"HS256","typ":"JWT"} Payload: {"sub":"1234567890","name":"John Doe","iat":1516239022}
Carga útil decodificada com declarações padrão
Entrada: Carga útil de um token de autenticação real
Saída: {"sub":"user-42","iss":"freeonlinetoolsgo.com","exp":1767229200,"iat":1767225600,"role":"admin"}
Detecção de token expirado
Entrada: exp: 1609459200 (01/01/2021) verificado em 28/08/2026
Saída: Token is expired —current time (1767225600) > exp (1609459200). Reject and prompt re-login.
Problemas comuns
- Tratar a decodificação como verificação: qualquer um pode criar um JWT com qualquer reivindicação e uma assinatura falsa. A decodificação lê a carga útil, mas não prova nada. Sempre verifique a assinatura com a chave secreta/pública no servidor antes de confiar nas declarações.
- Usando o algoritmo 'none': a especificação JWT permite alg: none para tokens não seguros. Se o seu verificador aceitar alg: none, um invasor poderá falsificar tokens. Configure sua biblioteca para rejeitar nenhum algoritmo esperado e colocar na lista de permissões.
- Armazenando JWTs em localStorage: XSS pode ler localStorage e exfiltrar tokens. Prefira cookies httpOnly, Secure, SameSite=Strict para tokens de sessão ou tokens de memória de curta duração com um cookie de token de atualização.
- Não verificar exp/aud/iss: um token roubado é válido até expirar. Sempre verifique exp (expiração), aud (público-alvo) e iss (emissor) em cada solicitação para evitar a repetição do token entre serviços.
Dicas
- Use tokens de acesso de curta duração (15 minutos) mais tokens de atualização de longa duração — isso limita a janela se um token de acesso for roubado.
- Prefira RS256 (assimétrico) a HS256 (simétrico) quando vários serviços verificam tokens: cada serviço obtém a chave pública e apenas o emissor possui a chave privada.
- Use nosso decodificador JWT durante o desenvolvimento para inspecionar o que o servidor está emitindo - ele mostra o cabeçalho decodificado, a carga útil e um resumo de declaração legível por humanos sem enviar o token a qualquer lugar.
- Nunca coloque dados confidenciais (senhas, PII) em uma carga útil JWT — ela é codificada em Base64, não criptografada, e qualquer pessoa que interceptar o token pode ler todas as declarações.