Saltar para o conteúdo
Toolbrik
Voltar ao blog

O que é um JWT e como o descodificar sem bibliotecas

8 de setembro de 2026 · Ferramenta relacionada: Descodificador JWT

Um JWT (JSON Web Token) aparece em quase todas as APIs modernas: no cabeçalho Authorization: Bearer ..., em cookies de sessão ou em tokens de terceiros (OAuth, SSO). E, ainda assim, muita gente nunca olhou para o que está lá dentro.

As três partes

Um JWT são três blocos em Base64URL separados por pontos: header.payload.signature.

  1. Header — o algoritmo de assinatura (HS256, RS256...) e o tipo de token.
  2. Payload — os claims: dados como sub (sujeito), exp (expiração), iat (emitido em) e qualquer campo personalizado que o backend adicione.
  3. Signature — o hash que garante que o header e o payload não foram alterados desde a assinatura.

Cola-o no descodificador de JWT e verás o header e o payload já convertidos em JSON legível, com a data de expiração transformada em algo humano em vez de um timestamp Unix em bruto.

Descodificar não é verificar

É isto que mais confunde: qualquer pessoa pode descodificar um JWT, porque o header e o payload estão apenas codificados em Base64URL, não cifrados. Abri-los não exige a chave secreta.

O que exige a chave (ou a chave pública, em RS256) é verificar a assinatura — confirmar que o token não foi alterado e que foi mesmo emitido por quem diz tê-lo emitido. Um descodificador online mostra-te o conteúdo, mas nunca deves confiar num JWT alheio sem que o teu backend verifique primeiro a assinatura.

Porque expira

O claim exp é uma data de expiração em segundos desde a epoch Unix. Se a tua sessão "termina sozinha" de vez em quando, é quase sempre por isto: o token expirou e o cliente não o renovou a tempo. Compara com o conversor de timestamp Unix se precisares de fazer as contas à mão.

Quando desconfiar de um token

  • Se o alg do header for none — significa que o emissor não está a assinar nada, uma vulnerabilidade clássica se o backend não a rejeitar explicitamente.
  • Se não houver exp — o token nunca expira, o que raramente é intencional.
  • Se o payload contiver dados sensíveis em texto simples (palavras-passe, cartões) — um JWT não é um contentor cifrado, não deve levar nada que não possa ser visto.

Em resumo: usa o descodificador para depurar e entender, mas a validação real de um JWT passa sempre pelo teu servidor.