Desenvolvimento

Como Decodificar e Depurar um JWT

Um JSON Web Token é formado por três partes codificadas em Base64URL. Depois que você souber lê-las, a maioria dos erros de “token inválido” se explica em segundos. Este guia mostra como decodificar um JWT, verificar as claims que costumam dar problema e os erros que transformam JWTs em brechas de segurança.

Iniciante · 7 min de leitura · Atualizado em 30 de outubro de 2026

Como Decodificar e Depurar um JWT

Do que um JWT é feito

Um JWT tem o formato xxxxx.yyyyy.zzzzz. As três partes, separadas por pontos, são:

  1. Header: JSON com o algoritmo de assinatura (alg) e o tipo do token, por exemplo {"alg":"HS256","typ":"JWT"}.
  2. Payload: JSON com as claims, ou seja, para quem o token é e até quando ele vale.
  3. Assinatura: um hash das duas primeiras partes, feito com um segredo (HMAC) ou uma chave privada (RSA, ECDSA).

As duas primeiras partes são apenas codificadas, não criptografadas. Qualquer pessoa com o token consegue lê-las, por isso nunca coloque senhas ou dados pessoais no payload de um JWT.

Decodificar um token

Cole o token no JWT Decoder e ele mostra o header, o payload e cada timestamp convertido em data legível. A ferramenta roda no seu navegador, então os tokens de produção não são enviados para lugar nenhum. Para fazer na mão, decodifique cada parte em Base64URL: troque - por +, _ por / e adicione o padding. Ou, no Node:

const [header, payload] = token.split('.').slice(0, 2)
  .map(part => JSON.parse(Buffer.from(part, 'base64url').toString()));
console.log(header, payload);

As claims que mais quebram

ClaimSignificadoErro típico
expExpiração, em segundos Unix“jwt expired”: confira também os relógios do servidor e do cliente
nbfNão válido antes deUm token usado alguns segundos antes porque o relógio do emissor está adiantado
iatEmitido emRejeitado como “emitido no futuro” depois de um desvio de relógio
audAudiência para a qual o token foi feitoUm token de uma API enviado para outra: quem valida precisa checar isso
issEmissorEmissores de desenvolvimento e de produção trocados

Os timestamps estão em segundos, não em milissegundos. Se uma expiração parece ser o ano 55.000, alguém escreveu Date.now() no lugar de Math.floor(Date.now() / 1000). O Unix Timestamp Converter resolve a dúvida. A maioria das bibliotecas aceita uma pequena tolerância de relógio (30 a 60 segundos) para absorver diferenças entre servidores.

Por que “invalid signature”?

  • Segredo ou chave errados: a causa mais comum. Confira a variável de ambiente no servidor que valida, não só no que assina.
  • Algoritmo errado: um token assinado com RS256 sendo validado como HS256, ou o contrário.
  • O token foi editado: mudar um único caractere do payload quebra a assinatura, e é justamente essa a função.
  • Rotação de chaves: as chaves do emissor mudaram. Com JWKS, associe o kid do header a uma chave publicada.

Para conferir um token HS256 na mão, calcule o HMAC-SHA256 de header.payload com o segredo no HMAC Generator e compare o resultado, codificado em Base64URL, com a terceira parte.

Erros de segurança a evitar

  • Decodificar não é validar. Nunca confie nas claims vindas de jwt.decode(); use a função de verificação da sua biblioteca com uma lista explícita de algoritmos permitidos.
  • Rejeite alg: none e fixe o algoritmo. Nunca deixe o token decidir como ele será verificado.
  • Mantenha os tokens de vida curta (minutos, para access tokens) e use refresh tokens em sessões longas. Um JWT não pode ser revogado antes de expirar sem estado extra no servidor.
  • Não guarde tokens no localStorage quando um bug de XSS puder lê-los. Um cookie HttpOnly, Secure e SameSite é mais seguro para aplicações de navegador.

Precisa de um token de teste com claims específicas? Crie um com o JWT Encoder.

Perguntas frequentes

Qualquer pessoa consegue ler meu JWT?
Sim. O header e o payload são apenas codificados em Base64URL. A assinatura impede que alterem o conteúdo, não que leiam. Use JWE (tokens criptografados) se o conteúdo precisar ser secreto.
É seguro colar um token em um decodificador online?
Só se ele rodar localmente. O JWT Decoder da devpack decodifica no seu navegador e não envia nada. Evite ferramentas que enviem o token para um servidor, principalmente com tokens de produção.
O que significa “jwt malformed”?
A string não tem três partes separadas por pontos e codificadas em Base64URL. Geralmente isso acontece porque sobrou “Bearer ” antes do token ou porque ele foi cortado ao ser copiado.

Continue lendo