iGotTools

Decodifique e inspecione tokens JWT com segurança

Veja exatamente o que há dentro de um JSON Web Token: emissor, expiração, scopes e claims. Decodifique localmente e detecte tokens expirados ou suspeitos antes de confiar neles.

Um JSON Web Token (JWT) é a string que seu navegador envia para provar quem você é depois de fazer login — e é legível por qualquer um que o tenha. Isso não é uma falha do design; é o design. O risco real não é ler um token, é onde você o lê. Colar um token vivo num site decodificador qualquer entrega sua sessão a um servidor que você não controla. O JWT Decoder nunca envia nada — ele decodifica o header, o payload e os claims inteiramente no seu navegador, e diz isso de antemão: a nota de segurança sob a entrada diz “Decodifica localmente no navegador. A assinatura nao e verificada.”

TL;DR

Um JWT não é um envelope selado. São três partes Base64URL com uma assinatura no final, e as duas primeiras são texto plano disfarçado.

  • Um JWT tem três partesheader.payload.signature, cada uma separada por um ponto. As duas primeiras são JSON codificado em Base64URL.
  • Qualquer um que tenha o token pode lê-lo — o header e o payload decodificam em milissegundos, sem chave.
  • A assinatura prova integridade, não confidencialidade — permite ao servidor confirmar que o token não foi alterado. Não oculta o conteúdo.

Decodifique localmente, leia o que o token diz e nunca trate o payload como um lugar seguro para segredos.

Anatomia de um JWT

Todo JWT tem exatamente três segmentos Base64URL, unidos por pontos:

<header>.<payload>.<signature>

Pegue o token de exemplo da ferramenta (carregue-o com o botão Exemplo) e observe os dois primeiros segmentos. Parecem ruído, mas cada um é apenas JSON codificado em Base64URL. Decodificados, temos:

  • Header{"alg":"HS256","typ":"JWT","kid":"example-demo"}. Declara o algoritmo, o tipo de token e o id de chave. Diz ao servidor como verificar, nada secreto.
  • Payload{"iss":"example-app","sub":"demo-user","name":"홍길동","scope":"read write","iat":1704067200,"nbf":1704067200,"exp":4102444800}. Estes são os claims (declarações) sobre o token — quem o emitiu, para quem é, o que permite e quando expira.
  • Signaturedemo-signature. Num token real este é um valor criptográfico que o servidor calcula sobre o header e o payload usando um segredo ou chave privada. O exemplo da ferramenta traz um marcador de propósito.

O header e o payload são as partes legíveis. A assinatura é a única peça que você não consegue ler de volta à sua entrada — e ela existe para provar que as outras duas não foram alteradas em trânsito, não para mantê-las privadas. (Para a metade de codificação dessa história, veja Codificação Base64 vs criptografia — um JWT é um exemplo prático de “Base64 não é segredo”.)

Claims padrão decodificados

O payload é um saco de claims — pares chave/valor acordados por convenção. Os registrados que você encontrará quase sempre:

  • iss (emissor) — quem emitiu o token, geralmente uma URL ou identificador.
  • sub (sujeito) — de quem é o token, tipicamente um id de usuário ou conta.
  • aud (audiência) — para quem o token se destina. Um token emitido para o serviço de faturamento deve ser rejeitado pelo serviço de perfil.
  • exp (expiração) — o momento em que o token deixa de ser válido, como timestamp Unix. É o claim mais importante a checar.
  • iat (emitido em) — quando o token foi criado.
  • nbf (não antes de) — o momento mais cedo em que o token é válido. Combinado com iat, permite emitir tokens ligeiramente adiantados.

exp importa porque tokens são credenciais ao portador: quem apresenta uma válida entra. Tokens curtos, com expiração rápida, limitam o raio de dano se um for roubado. Um token com exp distante no futuro é uma chave de longa duração; um token sem exp algum é efetivamente permanente. Leia sempre a expiração antes de confiar no que um token afirma.

Passo a passo: decodificar um token

O JWT Decoder roda inteiramente no seu navegador — o token nunca sai do seu dispositivo. O fluxo:

  1. Cole o token. Solte uma string completa header.payload.signature na caixa Entrada de token JWT. Clique em Exemplo para carregar o token de demo embutido em vez de colar o seu.
  2. Decodifique. Clique em Decodificar. O painel direito se preenche com o resultado analisado. (Se você editar a entrada depois, a linha de status diz “A entrada mudou. Decodifique de novo para atualizar.” para que você nunca leia uma análise obsoleta.)
  3. Leia o painel de Diagnóstico. No topo ele lista Algoritmo, Tipo e Key ID extraídos do header, mais o tamanho em bytes de cada segmento. É aqui que tokens malformados ou de assinatura vazia aparecem — um aviso aqui diz “O token esta expirado.”, “O token ainda nao e valido.” ou “O segmento de assinatura esta vazio. Decodificar nao verifica assinaturas.”
  4. Confira a linha do tempo de claims. A tabela dispõe os claims temporais — exp, iat, nbf — cada um com seus segundos brutos, a leitura ISO UTC e um Estado de Ativo, Passado ou Futuro. Uma linha exp marcada Passado é um token expirado; uma linha nbf marcada Futuro significa que ainda não é válido.
  5. Leia os painéis Header e Payload. Cada um é JSON formatado com um botão Copiar. Este é o conteúdo completo e decodificado do token — emissor, sujeito, scopes, tudo.
  6. Copie o que precisar. Use Copiar num único painel ou Copiar tudo para um resumo em texto de header, payload e assinatura juntos. Use Limpar para limpar tudo.

Tudo é uma operação de leitura. A ferramenta não faz chamadas externas, não verifica a assinatura contra um emissor e não armazena o token — atualize a página e ele se foi.

O erro crítico

Como um JWT é usado para autenticação, as pessoas assumem que seu conteúdo é secreto. Não é. O header e o payload estão codificados em Base64URL, o que é codificação, não criptografia — reversível por qualquer um num passo, sem chave. (É a mesma armadilha que tratar Base64 como segurança; veja Codificação Base64 vs criptografia.)

Isso tem uma regra de ferro: nunca coloque um segredo no payload de um JWT. Nem senhas, nem chaves de API, nem números de cartão, nem credenciais de qualquer tipo. Se está no payload, assuma que é público — porque no momento em que o token sai do servidor, qualquer um no caminho pode lê-lo. A assinatura garante que o token não foi alterado; não garante nada sobre quem pode vê-lo.

Quando você decodifica um token e o payload é lido corretamente, isso significa o formato é honesto — não que o conteúdo seja privado. Projete de acordo: coloque no payload só o que o cliente precisa, mantenha os segredos reais no servidor e deixe valores curtos de exp fazer a proteção.

Verificações relacionadas

Decodificar é a primeira pergunta. Alguns vizinhos respondem ao resto:

  • Verifique as partes Base64. Cada segmento é Base64URL — confirme a ida e volta com a ferramenta Base64. É também como você prova que o conteúdo de um JWT não está oculto: cole um segmento, decodifique, e o JSON volta direto.
  • Confira os timestamps. exp, iat e nbf são segundos Unix. Transforme um numa data legível com o Conversor de Timestamp para ver exatamente quando um token expira ou se tornou válido.
  • Integridade via hash. A assinatura de um JWT prova que ele não foi alterado. Para o mesmo trabalho num arquivo ou string arbitrária, compare hashes com o gerador de hash e checksum — um digest correspondente significa “inalterado”, sem troca de chave.

Perguntas frequentes

É seguro decodificar um JWT?

Sim — decodificar um JWT é apenas decodificar em Base64URL dois segmentos JSON. Revela o que o token já diz em texto plano a quem o detém; não enfraquece, expõe ou invalida o token. O que não é seguro é onde você decodifica: colar um token vivo num site desconhecido pode vazar sua sessão. Decodifique no seu navegador com o JWT Decoder e o token nunca sai do seu dispositivo.

A ferramenta pode ler meu token?

Não. O JWT Decoder roda totalmente no lado do cliente. O token é analisado na memória do seu navegador; nada é enviado, registrado nem armazenado num servidor. A nota de segurança sob a entrada afirma isso diretamente: “Decodifica localmente no navegador.” Atualize a página e a entrada é limpa.

O que significa “expirado” aqui?

Significa que o claim exp do token — seu timestamp de expiração — está no passado, então um servidor verificador deveria rejeitá-lo. Na ferramenta, um token expirado mostra exp como Passado na linha do tempo de claims e levanta um aviso “O token esta expirado.” no painel de Diagnóstico. “Expirado” é sobre validade, não legibilidade: o token ainda decodifica bem, só não deveria ser confiável.

Onde o token é validado?

Não nesta ferramenta. O JWT Decoder decodifica — ele lê o header e o payload e mostra a linha do tempo de claims. Ele não verifica a assinatura contra a chave de um emissor, então não pode dizer se um token é autêntico, apenas o que ele afirma. A validação real (checar a assinatura, exp, aud e o emissor) acontece no servidor que emitiu ou confia no token. É por isso que a nota de segurança é explícita: “A assinatura nao e verificada.”

iGotTools

Comece com esta ferramenta

Começar agora