Decodificador e codificador JWT — decodifique, verifique e assine JSON Web Tokens

Decodifique o header e o payload de um JWT, leia a expiração em linguagem simples, verifique assinaturas HS, RS, PS e ES ou assine um novo token. Nada sai do seu navegador.

Header
{
  "alg": "HS256",
  "typ": "JWT"
}
Payload
{
  "sub": "user_42",
  "name": "Ada Lovelace",
  "role": "admin",
  "iat": 1757320000,
  "exp": 1788856000
}
Claims
subAssuntouser_42
nameAda Lovelace
roleadmin
iatEmitido em1757320000
expExpira em1788856000

O token de exemplo é assinado com o segredo demo-secret-do-not-use.

Decodificar nunca confere a assinatura: qualquer pessoa pode ler um JWT, e só a assinatura prova quem o emitiu. Tokens HS* precisam do segredo compartilhado; RS*, PS*, ES* e EdDSA precisam da chave pública do emissor (PEM, certificado, JWK ou o JWKS do seu /.well-known/jwks.json, associado pelo kid). Não cole segredos nem chaves privadas de produção em nenhuma página web, incluindo esta; use chaves de teste.

Tokens e chaves são processados no seu navegador com WebCrypto e nunca são enviados; mesmo assim, trate um token ou chave de produção colado aqui como uma credencial. Ver todas as ferramentas grátis.

Encontrou um problema ou algo que poderia ser melhor? Lemos todas as mensagens e corrigimos rápido.

Este decodificador JWT grátis mostra o header, o payload e as claims de um JSON Web Token, transforma exp, iat e nbf em datas legíveis com um veredito claro de válido ou expirado, verifica a assinatura (HMAC com um segredo, ou RSA, RSA-PSS, ECDSA e Ed25519 com chave pública, certificado ou JWK) e tem um codificador que assina novos tokens para testes. Tudo acontece no seu navegador, o que aqui importa mais do que na maioria das ferramentas: um token colado muitas vezes é uma credencial ativa e não deve ser enviado ao servidor de ninguém, nem ao nosso.

Um JWT são três seções em Base64URL separadas por pontos: um header que indica o algoritmo, um payload com as claims e uma assinatura. As duas primeiras não são criptografadas, apenas codificadas, então qualquer pessoa pode lê-las; é a assinatura que prova quem emitiu o token e que ele não foi alterado. Decodificar, portanto, não é o mesmo que confiar, e a página deixa essa diferença sempre visível.

Como usar

  1. Cole o token. Um “Bearer ” no início, vindo de um header Authorization, não tem problema; ele é removido.
  2. Leia a linha de status: válido por quanto tempo, expirado desde quando ou ainda não válido.
  3. Confira o payload e a tabela de claims. As claims de tempo aparecem como datas locais ao lado dos segundos Unix brutos.
  4. Para verificar, informe a chave e clique em Verificar: o segredo compartilhado para HS256/384/512 ou, para tokens RS, PS, ES e EdDSA, a chave pública do emissor como PEM, certificado, JWK ou o JWKS inteiro (a chave é escolhida pelo kid do token).
  5. Para criar um token, mude para Codificar e assinar, escolha o algoritmo, edite o JSON do header e do payload e informe um segredo ou cole uma chave privada PKCS#8 (ou gere um par de chaves de teste). Assine e depois abra o token no decodificador para verificá-lo.
  6. Copie o payload ou o header como JSON formatado se precisar deles num relatório de bug ou numa fixture de teste.

Perguntas frequentes

É seguro colar um token real aqui?

O token é decodificado com JavaScript no seu navegador e nunca é transmitido; você pode até se desconectar da internet que a página continua funcionando. Mesmo assim, trate um token de produção como uma senha: não o cole em nenhuma página em que você não confie e, quando possível, prefira um token de teste de curta duração.

Por que consigo ler o payload sem o segredo?

Porque JWTs são assinados, não criptografados. O payload é JSON codificado em Base64URL que qualquer pessoa pode decodificar. O segredo (ou a chave privada) só é necessário para criar ou verificar a assinatura. Nunca coloque dados sensíveis no payload de um JWT, a menos que esteja usando JWE, a variante criptografada, que esta ferramenta não decodifica.

O que significam exp, iat e nbf?

São timestamps Unix em segundos. exp é quando o token expira; iat é quando foi emitido; nbf (not before) é o primeiro momento em que ele é válido. Um verificador precisa rejeitar o token depois do exp ou antes do nbf. A linha de status aqui aplica as duas regras ao horário atual.

Como verifico um token RS256 ou ES256?

Você precisa da chave pública do emissor, nunca da privada. Os provedores de identidade a publicam como JWKS numa URL como https://issuer/.well-known/jwks.json (Auth0, Okta, Cognito, Azure AD e Google fazem isso). Cole o JWKS inteiro e será usada a chave cujo kid corresponde ao header do token, ou cole um único JWK, uma chave pública PEM (BEGIN PUBLIC KEY) ou um certificado X.509. A página não busca nada sozinha, então copie o JWKS pelo seu navegador.

Posso criar e assinar um JWT aqui?

Sim. Codificar e assinar recebe o JSON do header e do payload e assina com HS256/384/512 e um segredo, ou com RS, PS, ES ou EdDSA e uma chave privada em formato PEM PKCS#8 (BEGIN PRIVATE KEY). Arquivos mais antigos com BEGIN RSA PRIVATE KEY são PKCS#1; converta-os com openssl pkcs8 -topk8 -nocrypt -in key.pem. Use apenas chaves de teste: uma chave de assinatura de produção colada em qualquer página web deve ser considerada comprometida.

O que significa “alg: none” e por que o aviso?

Indica que o token não tem assinatura. Algumas bibliotecas aceitavam esses tokens como válidos no passado, o que permitia a atacantes forjar qualquer payload. Um verificador bem configurado rejeita alg none de imediato. Se você encontrar isso num sistema real, é uma falha de segurança, não uma curiosidade.

Anatomia de um JWT

Header: {"alg":"HS256","typ":"JWT"} diz ao verificador qual algoritmo assinou o token. Payload: as claims, um objeto JSON com o que o emissor decidiu incluir, mais as claims registradas (iss, sub, aud, exp, nbf, iat, jti) que os verificadores entendem. Assinatura: HMAC ou assinatura digital sobre base64url(header).base64url(payload). Mude um caractere do payload e a assinatura deixa de bater, e é justamente essa a ideia.

Erros comuns com JWT

• Confiar no payload sem verificar a assinatura, ou verificar com o algoritmo indicado no token em vez do que o servidor espera (confusão de algoritmo).

• Access tokens de longa duração. Mantenha o exp curto (de minutos a uma hora) e use um refresh token para sessões mais longas.

• Colocar dados pessoais ou secretos no payload; qualquer pessoa que tenha o token consegue lê-los.

• Guardar tokens no localStorage num site com qualquer exposição a XSS. Um cookie httpOnly é mais seguro para sessões no navegador.

• Esquecer de checar aud e iss, o que permite que um token emitido para um serviço seja reutilizado em outro.

• Segredos HMAC curtos demais ou escolhidos por pessoas. HS256 precisa de pelo menos 256 bits (32 bytes aleatórios); um segredo adivinhável pode ser quebrado por força bruta offline a partir de um único token.

Qual algoritmo de assinatura escolher

• HS256 (HMAC-SHA256): um único segredo compartilhado assina e verifica. Simples e rápido, mas todo serviço que verifica também consegue emitir tokens. Serve bem dentro de um único backend.

• RS256 (RSA PKCS#1 v1.5 com SHA-256): a opção assimétrica mais amplamente suportada; o emissor guarda a chave privada e todos os outros verificam com a chave pública. As assinaturas têm 256 bytes com uma chave de 2048 bits.

• PS256 (RSA-PSS): as mesmas chaves do RS256 com um esquema de padding mais moderno; use quando todos os consumidores o suportarem.

• ES256 (ECDSA P-256): chaves bem menores e assinaturas de 64 bytes com segurança comparável; comum em sistemas mais novos e exigido por alguns (Apple, APIs ligadas ao WebAuthn).

• EdDSA (Ed25519): assinaturas rápidas e determinísticas, cada vez mais suportadas pelas bibliotecas; o suporte nos navegadores chegou depois dos outros.

Ferramentas grátis relacionadas

  • Codificador / decodificador Base64 — Codifique texto ou arquivos em Base64, transforme imagens em data URIs com trechos de CSS e <img>, e decodifique Base64 de volta em um arquivo com pré-visualização. Nada sai do seu navegador.
  • Formatador de JSON — Formate, minifique e valide JSON, com erros de parsing localizados por linha e coluna. No seu navegador, sem upload.
  • Gerador de senhas — Gere uma senha aleatória forte, uma frase-senha fácil de lembrar ou um PIN. Funciona inteiramente no seu navegador; nada é enviado nem armazenado.