Pular para o conteúdo

Decodificar um JWT

Veja o cabeçalho, as claims e a expiração de um JSON Web Token. Um token é uma credencial que funciona, então nada aqui é enviado a lugar nenhum nem fica armazenado, nunca.

  • Nunca armazenado
  • Sem fila, sem espera
  • Sem cadastro, sem marca d'água

Seu token nunca sai desta página. Ele é decodificado aqui mesmo, sem nenhuma requisição a servidor — o que importa, porque um JWT costuma ser uma credencial válida. Desligue o Wi-Fi depois que a página carregar e ele continua decodificando: nada é enviado.

O prefixo “Bearer ” não tem problema — ele é ignorado.

Como funciona

1

Cole o token

Com ou sem o prefixo “Bearer ”. Ele fica nesta página; nenhuma requisição é feita.

2

Leia as três partes

Cabeçalho, payload e assinatura, cada um decodificado e formatado. Os timestamps viram datas reais, e você vê quanto tempo resta.

3

Confira os alertas

Tokens expirados, falta de expiração, o algoritmo “none” e outros problemas são apontados com o que significam.

O que é verificado, e o que é só lido

Tudo nesta página, exceto duas comparações de data, é transcrição. O cabeçalho e o payload são decodificados de Base64URL e exibidos; a assinatura é copiada e nunca mexida, porque não há chave aqui e nenhuma criptografia é executada. Os dois julgamentos que a página faz são aritmética com o relógio do seu próprio dispositivo — a claim de expiração comparada com o agora, e a claim de “não antes de” comparada com o agora. Nenhuma tolerância é aplicada para diferença de relógio, enquanto um servidor que confere o mesmo token normalmente permite um ou dois minutos. Um notebook cinco minutos adiantado vai mostrar um token válido como expirado, e o token estará perfeitamente bem.

Dois detalhes de análise decidem o que você realmente vê. As claims de tempo só são lidas quando chegam como números JSON: um token cuja expiração foi escrita como a string "1699999999" é tratado como se não tivesse expiração nenhuma e recebe o alerta dizendo que ele nunca expira sozinho — o oposto da verdade. E o payload é analisado pelo parser JSON do próprio navegador, e não pelo que preserva dígitos usado nas nossas ferramentas de JSON, então uma claim numérica de 64 bits, como um ID de usuário snowflake no subject, aparece com os últimos dígitos arredondados. Identificadores em um JWT costumam ser strings exatamente por isso; quando um não é, leia-o no payload bruto, e não na tabela de claims.

Um token com cinco seções é recusado como JWE criptografado, e esse julgamento é feito só pela contagem de seções, sem ler o cabeçalho — correto na prática, e vale saber que é um atalho. Qualquer coisa que não tenha três seções é recusada de cara, assim como um payload que decodifica em um array JSON ou em uma string solta em vez de um objeto. Alertas aparecem para o algoritmo “none” e para a família HS, em que a chave de assinatura é um segredo compartilhado, e não uma chave pública. Tokens assinados com RS, ES ou PS não geram nenhum alerta, então o silêncio desta página significa ausência de um formato sabidamente ruim, não aprovação.

Quando você precisa de outra coisa

Nada aqui fica armazenado, e esse é o único motivo pelo qual esta página faz sentido existir — e ainda assim não é o hábito a cultivar. Uma promessa de privacidade não pode ser comprovada lendo-a: desconecte depois que a página carregar e veja o decodificador continuar funcionando, que é justamente o que uma ferramenta com servidor por trás não consegue fazer. E se um token que você colou em algum lugar que não pode auditar ainda é válido, troque-o em vez de ficar pensando nisso. Trocar leva um minuto. A alternativa é uma longa discussão consigo mesmo sobre uma credencial que ainda abre a porta. Para ler um token em uma máquina em vez de em uma aba, o payload é uma linha de shell: recorte o segundo campo separado por ponto, passe por base64 -d e envie para o jq.

Quando a pergunta é se um token é autêntico, e não o que ele diz, esta é a página errada por definição, assim como qualquer outro decodificador online. A verificação pertence ao lugar onde a chave já está — a biblioteca JWT da sua linguagem, no seu servidor, conferida contra o JWKS publicado pelo emissor. São poucas linhas, é a única resposta que tem valor, e qualquer site que se ofereça para fazer isso por você está pedindo o único segredo que você nunca deve dar a um site.

Perguntas frequentes

Meu token é enviado para algum lugar?

Não — e nesta página esse é o ponto principal, não um recurso a mais. Um JWT costuma ser uma credencial ativa: quem o tem pode agir em seu nome até ele expirar. Colar um em um decodificador online que o envia para um servidor é entregar uma chave que funciona, e nenhuma promessa de não registrar desfaz isso. Este decodificador é JavaScript puro na página que você está vendo. Nada fica armazenado, nada é registrado, nenhuma requisição é feita. Depois que a página carregar, desligue o Wi-Fi e ela funciona exatamente igual. Essa é a forma mais simples de confirmar a promessa de privacidade por conta própria, em vez de confiar na nossa palavra.

Ele verifica a assinatura?

Não, e nenhum decodificador online consegue fazer isso honestamente sem a sua chave de assinatura. Decodificar e verificar são operações completamente diferentes. Decodificar apenas desfaz o Base64 do token — qualquer pessoa pode fazer isso com qualquer token, e não prova nada sobre ele ser autêntico. Verificar significa recalcular a assinatura com o segredo ou a chave pública que o assinou, e essa chave nunca deve ser colada em um site. O que você vê aqui é o que o token DECLARA. Se essas declarações são confiáveis é uma pergunta que só o seu servidor, que tem a chave, pode responder.

Alguém consegue ler um JWT que eu enviar?

Sim — por completo, e isso pega muita gente de surpresa. Um JWT é assinado, não criptografado. O cabeçalho e o payload são Base64, uma codificação sem nenhum segredo, então qualquer pessoa que intercepte o token consegue ler todas as claims dentro dele. A assinatura impede que ALTEREM o token; ela não faz nada para impedir que o LEIAM. Nunca coloque nada confidencial no payload de um JWT: nada de senhas, números de cartão ou dados pessoais que você não escreveria em um cartão-postal.

O que significa o alerta do algoritmo “none”?

Que o token diz que não está assinado, e essa é uma das descobertas mais graves que esta página aponta. `alg: none` é um desvio de autenticação documentado: um atacante pega um token real, altera o payload para dizer que é administrador, define o algoritmo como “none”, remove a assinatura, e uma biblioteca que confia no cabeçalho o aceita. Toda biblioteca JWT séria hoje bloqueia isso por padrão, mas ainda existem implementações que confiam em `alg`. Um token que chega com `alg: none` deve ser tratado como um ataque até que se prove o contrário.

Como leio a expiração?

Isso é feito para você. `exp`, `iat` e `nbf` são timestamps Unix — segundos desde 1970 — ilegíveis como números brutos. Cada um aparece como uma data real no seu fuso horário, com quanto tempo atrás ou quanto tempo falta, e um token expirado é informado com todas as letras, em vez de deixar a conta para você. Um token sem `exp` também é sinalizado: um JWT que nunca expira não pode ser revogado pela expiração e continua válido enquanto a chave de assinatura for.

Meu token tem cinco partes, não três

Então ele é um JWE — criptografado, e não apenas assinado — e o conteúdo realmente não pode ser lido sem a chave de descriptografia. A página reconhece esse formato e avisa, em vez de mostrar algo sem sentido. Cinco partes significam que o payload é texto cifrado de verdade; não há nada para decodificar.

Quais são as claims padrão?

As registradas são: `iss` quem emitiu, `sub` a quem se refere (geralmente um ID de usuário), `aud` para quem é, `exp` quando expira, `nbf` não válido antes de, `iat` quando foi emitido, e `jti` um ID único do token. Todo o resto é personalizado por quem construiu o sistema. Cada claim registrada aparece com o significado no resultado, então você não precisa lembrar qual abreviação de três letras é qual.

Bom saber: Esta ferramenta decodifica; ela não verifica. A assinatura de um JWT prova que o token não foi alterado, e conferi-la exige o segredo ou a chave pública do emissor — que você nunca deve colar em uma página web. Trate tudo o que aparece aqui como declarado, não comprovado, e faça a verificação no seu servidor.

Coloque esta ferramenta no seu site

Grátis para qualquer blog, página de turma ou artigo de ajuda. Cole um único trecho de código e seus visitantes podem usá-la direto na sua página.