- Ele verifica a assinatura?
- Não, de propósito. Verificar a assinatura de um JWT exige o segredo (em tokens HMAC) ou a chave pública (em RSA/ECDSA). Pedir isso numa ferramenta web de colar e ler é exatamente como segredos vazam — alguém cola um segredo de produção na aba errada e agora ele está no histórico do navegador, em logs de erro, no preenchimento automático. Este decodificador lê as partes públicas do token e para aí. Para verificar, use a biblioteca de JWT que já está no seu servidor: jose para Node, PyJWT para Python, jjwt para Java, golang-jwt para Go.
- O que é um JWT, em um parágrafo?
- Um JSON Web Token são três pedaços codificados em base64url unidos por pontos: cabeçalho.payload.assinatura. O cabeçalho é um JSON como {"alg":"HS256","typ":"JWT"}. O payload é um JSON com claims como {"sub":"user_123","exp":1735689600}. A assinatura é um hash do cabeçalho+payload calculado com um segredo, para que um servidor com o mesmo segredo possa verificar que o token não foi adulterado. A ideia: um servidor entrega um token a você, você o leva em cada requisição, e o servidor não precisa de um banco de sessões para confiar em você — verificar a assinatura basta.
- Qual a diferença para o jwt.io?
- O jwt.io é a referência e é excelente. Fazemos menos de propósito — sem verificação de assinatura, sem assinar —, o que significa que nunca pedimos que você cole um segredo, ponto. Essa é a troca. Se quiser verificar, use o jwt.io ou a biblioteca do seu servidor. Se só quer ver o que tem dentro de um token, este carrega mais rápido, não tem anúncios e não oferece o Auth0 na lateral.
- O que são exp, nbf, iat, sub, iss, aud, jti?
- As sete claims padrão definidas na RFC 7519. exp é a hora de expiração (segundos Unix — o token deixa de valer depois disso). nbf é 'not before', não antes de (segundos Unix — o token não vale antes disso). iat é 'issued at', emitido em (segundos Unix — quando o servidor criou o token). sub é o sujeito (normalmente um ID de usuário). iss é o emissor (qual serviço criou). aud é a audiência (qual serviço deve aceitá-lo). jti é um ID único do token (usado em listas de revogação). As sete são opcionais — a maioria dos tokens reais usa sub, iat, exp e às vezes iss/aud.
- Por que a data aparece milhares de anos no futuro?
- As datas do JWT são em segundos desde 1970-01-01 UTC, não em milissegundos. Se você vê uma data no ano 50.000 ou depois, alguém passou por engano um valor em milissegundos do Date.now() do JavaScript para uma claim do JWT. O token vai funcionar na maioria das bibliotecas (elas leem o número que acharem), mas nunca vai expirar. Gere de novo com Math.floor(Date.now() / 1000).
- O cabeçalho diz alg: none — isso é ruim?
- É o ataque famoso. Algumas bibliotecas de JWT de 2014-2016 aceitavam um token com alg: none e pulavam a verificação de assinatura inteira, o que deixava um atacante forjar qualquer payload. Bibliotecas modernas recusam alg: none por padrão. Se você vir isso num token real, trate como quebrado — ou uma biblioteca mal configurada do lado de quem emitiu, ou alguém testando um ataque. Tokens de produção devem usar HS256 ou RS256.
- Posso decodificar tokens assinados com RSA (RS256/ES256) aqui?
- Sim. A decodificação não liga para o algoritmo — ela só decodifica as partes em base64url e mostra. O algoritmo só importa para a verificação (que esta ferramenta não faz). Tokens RS256 e ES256 têm o mesmo formato de tokens HS256; só os bytes da assinatura mudam.
- O token é guardado ou enviado para algum lugar?
- Não. A página é um arquivo HTML estático com um pouco de JavaScript. O JavaScript roda no seu navegador, faz a decodificação e mostra o resultado. Não há fetch, nem localStorage, nem análise do conteúdo do token. Feche a aba e o token some. A gente nem fica sabendo que você decodificou um.