Como Decodificar um Token JWT com Segurança (O Que Há Dentro Dele)
Um JWT é decodificado, não descriptografado, porque suas três partes são codificadas em Base64URL em vez de criptografadas, o que significa que qualquer um que possua o token consegue ler seu conteúdo sem nenhum segredo ou chave. Um JSON Web Token é simplesmente três strings unidas por pontos, header.payload.assinatura, onde o header e o payload são JSON simples que foi codificado em Base64URL. Este guia mostra exatamente o que há dentro de um JWT, como ler as claims padrão e a diferença crítica entre decodificar um token (que não exige nada) e verificá-lo (que exige a chave de assinatura).
O que um JWT contém: header, payload, assinatura
Um JWT contém três segmentos separados por pontos, cada um codificado em Base64URL: um header, um payload e uma assinatura. Divida um token em seus dois pontos e você obtém exatamente essas três partes, e as duas primeiras decodificam diretamente de volta para JSON legível.
O header é um pequeno objeto JSON que nomeia o tipo do token e o algoritmo de assinatura, por exemplo `{"alg":"HS256","typ":"JWT"}`. O payload é o objeto JSON que carrega as claims, as afirmações sobre o usuário ou a sessão, como o ID dele e a validade do token. A assinatura é um hash criptográfico dos dois primeiros segmentos mais uma chave secreta e, ao contrário das outras, não decodifica em texto legível.
Como as duas primeiras partes estão apenas codificadas em Base64URL, decodificar um JWT é trivial: reverta a codificação no header e no payload e você vê o JSON bruto. Isso é intencional, os JWTs foram feitos para serem lidos pelos sistemas que os recebem.
Decodificar vs. verificar: a diferença crítica
Decodificar um JWT não exige nenhum segredo, mas verificar um exige a chave de assinatura, e confundir os dois é um erro de segurança grave. Decodificar apenas reverte o Base64URL para revelar as claims; verificar recalcula a assinatura com a chave secreta para provar que o token é autêntico e não foi alterado.
Isso significa que você pode ler qualquer JWT que encontrar, mas lê-lo não diz nada sobre se você deve confiar nele. Um atacante pode pegar um token válido, decodificá-lo, alterar o payload para afirmar que é um administrador e recodificá-lo. O token forjado decodifica perfeitamente; ele só falha na verificação de assinatura, porque o atacante não tem a chave necessária para produzir uma assinatura correspondente.
A regra para os servidores: nunca tome uma decisão de confiança com base apenas em um payload decodificado. Sempre verifique a assinatura com a sua chave e cheque a validade, antes de agir sobre qualquer claim. Decodificar é para inspeção e depuração; a verificação é para autorização.
Por que os JWTs são codificados, não criptografados
Um JWT assinado padrão é codificado, não criptografado, então seu payload é totalmente legível por qualquer um que obtenha o token, que é por que você nunca deve colocar segredos dentro dele. A assinatura garante a integridade, que o conteúdo não foi adulterado, mas não fornece nenhuma confidencialidade; as claims ficam em JSON simples e decodificável.
Os desenvolvedores rotineiramente cometem o erro de colocar dados sensíveis, senhas, registros pessoais completos, identificadores internos, dentro de um payload de JWT, presumindo que o token é opaco. Ele não é. Qualquer um que intercepte o token, do armazenamento do navegador, de um arquivo de log ou de uma captura de rede, consegue decodificar o payload em segundos.
Mantenha os payloads com claims não sensíveis: um ID de usuário, papéis (roles) e campos de tempo. Se você realmente precisa esconder o conteúdo, isso é uma construção diferente, um JWE (JSON Web Encryption), que de fato criptografa o payload. Um JWT assinado simples nunca faz isso.
Lendo as claims padrão do JWT
O padrão do JWT, a RFC 7519, define sete nomes de claims registradas que carregam um significado consistente entre sistemas, e todas elas são opcionais, mas amplamente usadas. Reconhecê-las permite que você leia o payload de qualquer token de relance, independentemente de quem o emitiu.
Três dessas claims são timestamps, exp, iat e nbf, e são armazenadas em tempo Unix: o número de segundos decorridos desde 1º de janeiro de 1970 UTC. Um valor como 1767225600 não é um número aleatório; é uma data, e convertê-lo revela exatamente quando um token foi emitido ou quando expira. Para descobrir o tempo de vida de um token, subtraia o iat do exp.
A tabela abaixo lista todas as sete claims registradas e o que cada uma significa.
| Claim | Nome | Significado |
|---|---|---|
| exp | Expiration Time | Timestamp Unix após o qual o token deve ser rejeitado |
| iat | Issued At | Timestamp Unix de quando o token foi criado |
| nbf | Not Before | Timestamp Unix antes do qual o token não deve ser aceito |
| iss | Issuer | Quem emitiu o token, muitas vezes uma URL ou nome de serviço |
| sub | Subject | Sobre quem é o token, geralmente um ID de usuário |
| aud | Audience | Destinatário(s) pretendido(s); sua API deve confirmar que está listada |
| jti | JWT ID | Um identificador único para este token específico |
Consigo decodificar um JWT sem enviá-lo a um servidor?
Sim, um decodificador de JWT no lado do cliente divide e decodifica o Base64URL do token inteiramente no seu navegador, então o token nunca é transmitido a nenhum servidor. A decodificação é pura manipulação de strings que roda no seu próprio dispositivo, nenhuma requisição de rede é necessária para revelar o header e o payload.
Isso não é só conveniente, é um controle de segurança de verdade. Um JWT é uma credencial ao portador (bearer): quem o possui pode agir como o usuário até ele expirar. Colar um token de produção em um decodificador online qualquer envia essa credencial ativa a um terceiro desconhecido, que poderia capturá-la e reutilizá-la. Uma ferramenta que decodifica localmente elimina essa exposição por completo, permitindo que você inspecione tokens reais sem nunca entregá-los ao servidor de outra pessoa.
Perguntas frequentes
Consigo decodificar um JWT sem a chave secreta?
Sim. O header e o payload estão apenas codificados em Base64URL, então qualquer um pode decodificá-los e lê-los sem nenhuma chave. O segredo só é necessário para verificar ou criar a assinatura, não para ler as claims.
Um JWT é criptografado?
Um JWT assinado padrão não é criptografado, apenas codificado e assinado. O payload é legível por qualquer um que tenha o token. Use JWE se você realmente precisar que o conteúdo seja criptografado.
Qual é a diferença entre decodificar e verificar um JWT?
Decodificar revela as claims e não precisa de nenhum segredo. Verificar recalcula a assinatura com a chave de assinatura para confirmar que o token é autêntico e não foi alterado. Apenas tokens verificados devem receber confiança.
O que significam exp e iat em um JWT?
São os horários de expiração e de emissão, armazenados como timestamps Unix (segundos desde 1970). Subtraia o iat do exp para obter o tempo de vida do token; um token está expirado assim que o horário atual passa do exp.
É seguro colar um JWT em um decodificador online?
Apenas se o decodificador rodar inteiramente no seu navegador. Um JWT é uma credencial ativa ao portador, e colar um token de produção em um decodificador no lado do servidor o envia a um terceiro que poderia reutilizá-lo. Use uma ferramenta no lado do cliente.