Decodificador JWT

Decodifique um JSON Web Token para ler seu header e payload.

100% privado — funciona inteiramente no seu navegador. Seus dados são processados no seu dispositivo e nunca enviados para a internet.

Header
Payload

Sobre o Descodificador JWT

Este descodificador JWT gratuito lê um JSON Web Token e mostra o seu cabeçalho e a sua carga útil como JSON formatado, com as horas de emissão e de expiração convertidas em datas legíveis.

A descodificação acontece no seu navegador — o seu token nunca é enviado. Isto não é um pormenor: um JWT é normalmente uma credencial ativa, e colar um num site que o envia para algum lado é entregar todo o acesso que ele transporta.

Esta ferramenta descodifica um token. Não verifica a assinatura — mais abaixo explicamos porque é que essa distinção importa.

As três partes de um token

Um JWT são três blocos de Base64url separados por pontos:

xxxxx.yyyyy.zzzzz

Cabeçalho — que algoritmo assinou o token e de que tipo ele é. Normalmente dois campos: alg e typ.

Carga útil — as declarações (claims). A quem o token diz respeito, quem o emitiu, quando expira e tudo o mais que a aplicação lá colocou: ID de utilizador, e-mail, funções, permissões, inquilino.

Assinatura — uma verificação criptográfica sobre as duas primeiras partes, feita com um segredo ou uma chave privada. Prova que o token não foi alterado desde que foi emitido.

O essencial a compreender: as duas primeiras partes não estão cifradas. Estão apenas codificadas, e qualquer pessoa as consegue ler. Cole um token nesta página e o conteúdo aparece de imediato. Base64url é uma forma de tornar os dados seguros para colocar num URL ou cabeçalho, não uma forma de os esconder.

O que isso significa para o que coloca num token

Uma vez que a carga útil é pública para quem tiver o token, a regra decorre diretamente: nunca coloque nada secreto num JWT.

O que não pertence a uma carga útil: palavras-passe, chaves de API, dados de cartão de crédito, números de identificação nacional, informação médica, tudo o que esteja abrangido pela regulamentação de privacidade. Tudo isso é legível pelo utilizador, por tudo o que registe o pedido e por quem quer que obtenha o token.

O que lá pertence: um ID de utilizador, uma função, uma expiração, um emissor, um público-alvo — identificadores e declarações destinados a ser vistos pelo sistema que os recebe.

A assinatura protege a integridade, não a confidencialidade. Garante que ninguém alterou o token. Não faz nada para impedir que o leiam.

Descodificar não é verificar

Esta é a distinção que causa falhas de segurança reais, por isso vale a pena ser preciso.

Descodificar desempacota o Base64url e mostra-lhe o JSON. Não precisa de chave nenhuma, qualquer pessoa o pode fazer, e não prova absolutamente nada sobre se o token é genuíno.

Verificar recalcula a assinatura usando o segredo ou a chave pública e confirma que corresponde. Só isso lhe diz que o token foi realmente emitido por quem afirma e que não foi adulterado.

Um token pode descodificar na perfeição e ser uma falsificação completa. Qualquer pessoa pode construir um JWT que diga "role": "admin" e ele será apresentado lindamente aqui — porque apresentá-lo é tudo o que está a acontecer.

Esta ferramenta deliberadamente não verifica, e essa é a escolha segura: a verificação exige o segredo de assinatura, e colar o seu segredo de assinatura numa página web seria muito mais perigoso do que colar um token. A verificação pertence ao seu servidor, com a sua chave, usando uma biblioteca adequada.

A versão histórica deste erro é o ataque alg: none. As primeiras bibliotecas JWT respeitavam um cabeçalho que declarava não ter sido usado algoritmo nenhum e aceitavam o token sem verificação. Um atacante podia editar a carga útil, definir alg como none e entrar. As bibliotecas modernas rejeitam isso, mas é por isso que deve sempre fixar o algoritmo esperado em vez de confiar no cabeçalho.

Ler as declarações padrão

A maioria dos nomes de campo curtos numa carga útil são declarações registadas com significados fixos:

  • exp — hora de expiração. Depois disto, o token deve ser rejeitado.
  • iat — issued at, emitido em. Quando foi criado.
  • nbf — not before, não antes de. O token é inválido até essa hora.
  • sub — sujeito. Normalmente o ID de utilizador.
  • iss — emissor. Quem criou o token.
  • aud — público-alvo. A que serviço se destina.
  • jti — ID do token, usado em listas de revogação.

exp, iat e nbf são marcas temporais Unix — segundos desde 1 de janeiro de 1970 — e é por isso que parecem um número de dez dígitos sem sentido. Esta ferramenta converte-os em datas legíveis, o que costuma ser a forma mais rápida de responder à pergunta que o trouxe aqui: *este token expirou?*

Como usar

  • Cole o seu JWT (a cadeia xxxxx.yyyyy.zzzzz)
  • Leia o cabeçalho e a carga útil descodificados abaixo
  • Copie qualquer uma das partes se precisar

Bom saber

  • Trate um token como uma palavra-passe. Se ainda for válido, quem o tiver pode agir como esse utilizador. Não cole tokens ativos em ferramentas que os enviem, nem os publique num ticket ou numa conversa.
  • Os JWT são difíceis de revogar. São válidos até expirarem, por isso um token roubado funciona até lá, a menos que mantenha uma lista de bloqueio. É por isso que as expirações curtas importam.
  • Bearer não faz parte do token. Retire esse prefixo de um cabeçalho Authorization antes de descodificar.
  • Base64url não é o Base64 padrão. Usa - e _ em vez de + e / e normalmente elimina o preenchimento =, razão pela qual um bloco de JWT pode falhar num descodificador Base64 comum.
  • A diferença de relógios causa falhas confusas. Um token pode parecer-lhe válido e ser rejeitado por um servidor cujo relógio difira um ou dois minutos.
  • Um JWT não é uma sessão. Transporta as suas declarações consigo, por isso as alterações à função de um utilizador só produzem efeito quando o token expira.

Perguntas frequentes

Um JWT está cifrado?

Não. O cabeçalho e a carga útil estão codificados em Base64url, o que os torna seguros para colocar num URL ou num cabeçalho HTTP mas não os esconde de forma nenhuma. Quem tiver o token consegue ler todas as declarações lá dentro, como esta página demonstra. A assinatura protege o token de ser modificado, não de ser lido.

Esta ferramenta verifica a assinatura?

Não, e de propósito. Verificar exige o segredo de assinatura ou a chave pública, e colar o seu segredo de assinatura numa página web seria consideravelmente mais perigoso do que colar um token. A verificação pertence ao seu servidor, usando uma biblioteca adequada. Esta ferramenta descodifica e mostra-lhe o conteúdo, que é o que precisa quando está a depurar.

É seguro colar aqui o meu token?

Aqui, sim — a descodificação acontece inteiramente no seu navegador e nada é transmitido, por isso pode desligar-se da internet e continua a funcionar. Ainda assim, tenha cuidado com as ferramentas em geral. Um JWT ativo é uma credencial funcional, e um site que o envia para um servidor acabou de receber todo o acesso que ele concede.

Como sei se o meu token expirou?

Veja a declaração exp, que é uma marca temporal Unix em segundos. Esta ferramenta converte-a numa data legível e diz-lhe diretamente se esse momento já passou. Se um token lhe parece válido mas um servidor o rejeita, verifique a diferença de relógios — uma diferença de um ou dois minutos entre máquinas é suficiente.

O que significam sub, iss, aud e iat?

São declarações registadas com significados padrão: sub é o sujeito, normalmente o ID de utilizador; iss é o emissor que criou o token; aud é o público-alvo pretendido, ou seja, que serviço o deve aceitar; iat é quando foi emitido. Juntamente com exp e nbf, cobrem o quem, o onde e o quando.

Porque é que o meu JWT falha num descodificador Base64 normal?

Porque um JWT usa Base64url, uma variante que substitui + por - e / por _ e normalmente remove o preenchimento =. Essas substituições existem para que o valor seja seguro dentro de um URL. Repondo os caracteres, ele descodifica numa ferramenta Base64 padrão.

Posso editar a carga útil de um JWT?

Pode alterar o texto, mas o resultado será rejeitado por qualquer servidor corretamente implementado, porque a assinatura já não corresponde ao conteúdo modificado. É precisamente para isso que a assinatura serve. Os tokens são reemitidos pelo serviço que os assina, não editados à mão.

Ferramentas relacionadas

Tutorial em vídeo

Adicionamos novas ferramentas com frequência — inscreva-se no YouTube para ser avisado a cada lançamento.

Mais ferramentas

Ver tudo

Aplicativos recomendados

Ver tudo