Decodificador de JWT

Cole um JSON Web Token e leia o que ele diz: quem o emitiu, para quem é, o que permite e quando deixa de funcionar. O token nunca sai desta página.

O token é decodificado dentro desta página enquanto você digita ou cola: ele não é enviado para nós, não é salvo e não é adicionado ao endereço. Um Bearer no início e as quebras de linha são ignorados.

Trate um token real de produção como uma senha: até ele expirar, quem o tiver pode agir como você, então evite colá-lo em qualquer site que você não controla.

Três pedaços de texto unidos por pontos

Depois que você entra num site, o servidor precisa reconhecer você de novo na próxima requisição. Um jeito comum de fazer isso é entregar ao seu navegador um bilhete curto e assinado dizendo “este é o usuário 48213, autorizado a ler pedidos, até as 15h15”. Esse bilhete é um JSON Web Token, ou JWT.

Um JWT parece uma longa sequência aleatória, mas sempre tem o mesmo formato, header.payload.signature.

  • O cabeçalho (header) é um pequeno objeto JSON que indica o algoritmo de assinatura (alg) e muitas vezes a chave que foi usada (kid).
  • O payload é um objeto JSON de claims, que são afirmações como sub (quem), aud (para qual serviço) e exp (até quando).
  • A assinatura (signature) é um selo calculado a partir dos dois primeiros pedaços e de uma chave.

Cabeçalho e payload são escritos em Base64URL, um jeito de escrever bytes com letras, dígitos, - e _ para que sobrevivam a uma passagem por um endereço ou por um cabeçalho HTTP. É também por isso que quase todo token começa com eyJ, que é como {" fica nessa codificação.

Codificado não é criptografado

Base64URL é uma forma de escrita. Não tranca nada, e transformá-la de volta em texto não exige chave nenhuma, que é tudo o que esta página faz. Então um JWT assinado não esconde absolutamente nada. Se o payload contém um endereço de e-mail, um papel ou um ID interno, qualquer um que pegue o token consegue ler, seja uma extensão do navegador, um log de proxy ou uma captura de tela.

O que a assinatura garante é a integridade. Mude um caractere do payload e o selo deixa de bater, então o servidor recusa o token. As pessoas ainda conseguem ler. Só não conseguem reescrever.

Um token com cinco partes é outro objeto, um JWE, e o conteúdo dele é realmente criptografado. Esta ferramenta mostra o cabeçalho, explica as cinco partes e para por aí. Ela nunca pede uma chave.

O que esta página lê e o que ela aponta

O decodificador remove um Bearer inicial, espaços e quebras de linha, divide o token e mostra o cabeçalho e o payload como JSON formatado. Depois passa pelas claims uma por uma. As três datas, exp, nbf (não antes de) e iat (emitido em), são números de segundos desde 1º de janeiro de 1970. Você as vê no seu fuso horário e em UTC, com uma contagem ao vivo como “válido por mais 12 minutos”.

ConstataçãoPor que importa
Expirado, ou ainda não válidoComparado com o relógio do seu dispositivo. Um servidor correto recusa o token.
Sem claim expO token funciona para sempre, a menos que o servidor mantenha uma lista de tokens revogados.
Validade acima de 30 diasUm token roubado continua útil por todo esse tempo.
alg é noneO token não é assinado. Qualquer um pode escrever um.
Datas em milissegundosUm valor 1.000 vezes grande demais faz o token nunca expirar para um receptor rigoroso.
Dados pessoais, ou um campo com nome de segredoQualquer um que tenha o token consegue ler.
jku, x5u ou jwk no cabeçalhoO token aponta para a própria chave, e um falsificador também pode fazer isso.

Você também recebe um comentário sobre o algoritmo. HS256 usa um único segredo compartilhado para assinar e para verificar. RS256, ES256 e EdDSA usam um par de chaves, em que uma chave privada assina e uma chave pública verifica, então os serviços que só verificam tokens não conseguem criá-los.

O que a decodificação não consegue dizer

Esta página não verifica a assinatura. Isso exigiria o segredo ou a chave pública do emissor, e uma página que pede o seu segredo de assinatura é uma página para fechar. Por isso, um token falsificado e um legítimo parecem iguais aqui. Leia o resultado como “isto é o que o token afirma”, nunca como “este token é válido”.

Pelo mesmo motivo, “não expirado” só quer dizer que exp é posterior ao relógio do seu dispositivo. O servidor pode ter revogado o token uma hora atrás.

Se você está escrevendo o lado que recebe, as verificações que contam acontecem no seu código. Aceite só os algoritmos que você espera, verifique a assinatura com uma chave em que já confia e depois compare iss, aud e exp com o que você espera. Use uma biblioteca mantida e nunca decida o caminho com base no alg que o token pede.

Um token ativo é uma credencial

Até expirar, um token bearer funciona para quem o apresentar. Cole um token de produção num site e você o entregou a esse site, a menos que a decodificação aconteça no seu navegador. Aqui é o caso. Nenhuma requisição leva o token, ele não é escrito na barra de endereços e não é salvo no armazenamento do navegador. Você não precisa acreditar na nossa palavra: observe a aba Rede (Network) das ferramentas de desenvolvedor, ou carregue a página e fique offline antes de colar.

Mesmo assim, o hábito mais seguro é depurar com tokens de uma conta de teste ou com tokens expirados. Se um token real for parar num chat, num chamado ou num log público, saia da conta em todos os lugares ou peça ao emissor para revogá-lo.

Perguntas frequentes

É seguro colar um JWT num decodificador online?

Só se o decodificador funcionar no seu navegador e não enviar nada. Este divide e decodifica o token localmente, não faz nenhuma requisição com ele e não guarda nada. Para tokens de produção, um token expirado ou de uma conta de teste continua sendo a melhor escolha.

Dá para decodificar um JWT sem a chave secreta?

Sim. O cabeçalho e o payload são texto Base64URL que qualquer um pode transformar de volta em JSON. Você só precisa do segredo ou da chave para verificar a assinatura, ou para criar um token que um servidor aceite.

O que significam exp, iat e nbf num JWT?

exp é o momento em que o token deixa de ser aceito, iat o momento em que foi emitido e nbf o momento em que passa a ser aceito. Os três são números de segundos desde 1º de janeiro de 1970 (UTC), não milissegundos.

Por que meu token começa com eyJ?

O cabeçalho é um objeto JSON, então começa com {", e esses caracteres sempre viram eyJ em Base64. O payload começa do mesmo jeito pelo mesmo motivo.

Qual a diferença entre HS256 e RS256?

HS256 assina e verifica com um único segredo compartilhado, então todo serviço capaz de verificar um token também poderia falsificar um. RS256 assina com uma chave privada e verifica com uma chave pública. Muitos serviços podem então verificar tokens, enquanto só o emissor consegue criá-los.

Por que um token com alg none é perigoso?

Ele não tem assinatura, então qualquer um pode editar o conteúdo. Um servidor que o aceita deixa as pessoas escolherem o próprio ID de usuário ou papel. Os receptores precisam listar os algoritmos que aceitam e recusar todo o resto.