Guia de JWT Parser: como decodificar, validar e inspecionar JSON Web Tokens com segurança

Guia de JWT Parser: como decodificar, validar e inspecionar JSON Web Tokens com segurança

9 min read

Sua autenticação acabou de quebrar em produção. Os usuários estão recebendo erros de “Invalid Token”, e você precisa descobrir o porquê — rápido. Você abre o JWT e ele parece uma bagunça: três blocos de caracteres aleatórios separados por pontos. Os dados estão lá, mas você não consegue lê-los sem um parser.

Um JWT Parser é uma ferramenta especializada que decompõe as três partes de um JSON Web Token — Header, Payload e Signature — seguindo o padrão RFC 7519. Em abril de 2026, esses parsers decodificam dados codificados em Base64URL e verificam assinaturas usando segredos ou chaves públicas para garantir que o token não tenha sido adulterado, bloqueando ameaças como o ataque “alg: none”.

O que um JWT Parser realmente faz

Pense em um JWT parser como um tradutor. Ele pega uma string longa e opaca e a transforma de volta em objetos JSON legíveis. Isso é fundamental para gerenciar identidades de usuários e proteger a troca de dados em aplicações modernas.

Internamente, o parser encontra os dois pontos (.) que dividem o token em três seções:

Section Purpose Encoded? Readable Without Key?
Header Metadados: algoritmo de assinatura (HS256, RS256) Base64URL Yes
Payload Claims: dados do usuário, expiração, papéis Base64URL Yes
Signature Lacre digital que comprova autenticidade HMAC/RSA No — requires key

Estrutura simplificada de 3 partes de um token JWT

Decodificação passo a passo: o que acontece por dentro

Vamos percorrer um token real. Pegue este JWT de exemplo:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4iLCJpYXQiOjE3MDAwMDAwMDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Step 1: Split on periods

[0] eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
[1] eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4iLCJpYXQiOjE3MDAwMDAwMDB9
[2] SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Step 2: Base64URL-decode section [0] (Header)

{
  "alg": "HS256",
  "typ": "JWT"
}

Step 3: Base64URL-decode section [1] (Payload)

{
  "sub": "1234567890",
  "name": "John",
  "iat": 1700000000
}

Step 4: Verify section [2] (Signature) — requires the secret key

O parser pega o header codificado em Base64URL + “.” + payload, depois calcula um HMAC-SHA256 usando o segredo. Se o resultado corresponder à seção [2], o token é autêntico.

Nota crítica de segurança: Base64URL não é criptografia

Uma armadilha comum para desenvolvedores menos experientes é assumir que o header e o payload codificados estão criptografados. Não estão. Como o JustUse.me destaca, a codificação Base64URL apenas torna o JSON seguro para envio via URLs e headers. Qualquer pessoa que tenha o token pode decodificar o payload sem senha ou chave.

Nunca armazene dados sensíveis (senhas, CPFs, chaves de API) no payload de um JWT. Eles ficam visíveis para qualquer um que intercepte o token.

Verificação de assinatura: o portão de segurança

Embora qualquer um possa ler os dados de um token, a verificação de assinatura é o que realmente mantém seu sistema seguro. Um JWT parser não apenas lê informações — ele comprova de onde elas vieram.

O parser recalcula a assinatura usando o header, o payload e uma chave, depois verifica se o resultado corresponde à assinatura do token. Se não corresponderem, o token foi adulterado.

Duas famílias de algoritmos

Algorithm Key Type How It Works Common Use Case
HS256 (HMAC) Simétrica — mesma chave secreta para assinar e verificar Ambas as partes compartilham um segredo Auth de serviço único, microsserviços dentro de uma equipe
RS256 (RSA) Assimétrica — chave privada assina, chave pública verifica O remetente guarda a chave privada; qualquer um com a chave pública pode verificar Provedores OAuth2, integrações de API de terceiros
ES256 (ECDSA) Assimétrica — mesmo modelo do RSA, mas com curvas elípticas Chaves menores, verificação mais rápida Apps móveis, serviços sensíveis a desempenho

A lógica de verificação em 3 etapas de um JWT parser

O ataque “alg: none”

Esta é uma das vulnerabilidades de JWT mais perigosas. Um atacante modifica o header para declarar "alg": "none" e remove a assinatura. Um parser mal implementado pode aceitar isso, tratando o token como válido sem nenhuma verificação.

Defesa: Seu parser deve rejeitar explicitamente qualquer token em que o algoritmo seja “none” ou não corresponda ao algoritmo esperado. Stas Persiianenko, que desenvolveu a ferramenta JWT da Apify, enfatiza que, embora os tokens sejam transparentes por design, sua segurança depende de o parser rejeitar rigorosamente tokens não assinados ou adulterados.

decoded = jwt.decode(token, key, algorithms=None)  # NEVER do this

decoded = jwt.decode(token, key, algorithms=["HS256"])

Claims padrão do JWT: o que cada campo significa

Um JWT parser extrai “claims” do payload. Elas seguem o framework JOSE (JSON Object Signing and Encryption) para compatibilidade entre sistemas.

Claim Full Name Purpose Example Value
iss Issuer Quem emitiu o token "auth.example.com"
sub Subject O usuário ou entidade que o token representa "user:12345"
aud Audience Destinatário pretendido do token "api.example.com"
exp Expiration Time Quando o token se torna inválido 1700000000 (Unix timestamp)
iat Issued At Quando o token foi criado 1699999999
nbf Not Before O token não é válido antes deste momento 1699999999
jti JWT ID Identificador único do token "a1b2c3d4"

Ao usar assinaturas assimétricas, os parsers costumam referenciar uma JWK (JSON Web Key) — uma estrutura JSON que representa uma chave pública. O parser busca automaticamente a JWK correta no endpoint de metadados do emissor para verificar o token.

Implementação: código real para produção

PHP com lcobucci/jwt

O padrão do ecossistema PHP é lcobucci/jwt. Dados do Packagist mostram mais de 322 milhões de instalações em abril de 2026, tornando-o a escolha padrão para projetos Laravel e Symfony.

use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;

$config = Configuration::forSymmetricSigner(
    new Sha256(),
    InMemory::plainText('your-secret-key')
);

// Parsing and validating a token
$token = $config->parser()->parse($jwtString);

// Verify constraints: expiration, issuer, etc.
$constraints = [
    new \Lcobucci\JWT\Validation\Constraint\IssuedBy('auth.example.com'),
    new \Lcobucci\JWT\Validation\Constraint\PermittedFor('api.example.com'),
    new \Lcobucci\JWT\Validation\Constraint\SignedWith(
        $config->signer(),
        $config->signingKey()
    ),
];

$isValid = $config->validator()->validate($token, ...$constraints);

Hono (Edge/Serverless) com Web Crypto

Para aplicações edge leves, o Hono JWT Helper oferece uma função decode() minimalista, perfeita para plataformas serverless onde você quer cold starts rápidos e dependências mínimas.

import { jwt } from 'hono/jwt'

// Middleware to verify JWT on every request
app.use('/api/*', jwt({ secret: 'your-secret' }))

// Access decoded claims in your handler
app.get('/api/profile', (c) => {
  const payload = c.get('jwtPayload')
  return c.json({ user: payload.sub })
})

Análise de JWT com IA via MCP

Em 2026, o Model Context Protocol (MCP) permite que assistentes de IA como Claude Code ou Cursor se comuniquem diretamente com ferramentas de JWT. Configure um servidor MCP e um desenvolvedor pode pedir a uma IA para “Verificar todos os JWTs nesses logs em busca de erros de expiração” — o agente cuida do parsing pela linha de comando.

Segundo a Apify, o processamento em massa custa cerca de $11.50 por 10.000 tokens em 2026. Essa automação permite que agentes de IA encontrem tokens expirados e sugiram imediatamente correções de código para as configurações de segurança do app.

Conclusão

Um JWT parser é mais do que uma conveniência de debug — é um ponto de verificação de segurança vital. Ele garante que os tokens sejam autênticos por meio de verificações de assinatura e válidos por meio da verificação de claims. Lembre-se das duas regras que mais importam: Base64URL não é criptografia, então nunca coloque segredos no payload. E sempre especifique explicitamente os algoritmos permitidos para evitar ataques de “alg: none”.

Para apps em produção, use bibliotecas consagradas como lcobucci/jwt ou o helper JWT do Hono em vez de criar seu próprio parser. Para debug e análise em massa, ferramentas MCP baseadas em IA são a abordagem moderna para manter auditorias de segurança automatizadas e detalhadas.

FAQ

É legal decodificar um token JWT que encontrei no meu navegador?

Sim, é totalmente legal. JWTs são projetados para serem transparentes — o header e o payload são codificados para transporte, não criptografados para sigilo. Ter o token implica que você tem acesso aos dados em suas claims. No entanto, sempre cumpra as leis locais de proteção de dados, como a LGPD e o GDPR, quando os tokens contiverem informações pessoais.

Por que meu JWT parser mostra isExpired: true para um token que acabei de gerar?

Isso geralmente é causado por clock drift entre o servidor que gerou o token e o sistema que o está analisando. Se os relógios dos dois sistemas não estiverem sincronizados (via UTC/NTP), as claims exp ou nbf podem parecer inválidas. Corrija isso garantindo que ambos os sistemas usem NTP para sincronização de horário, ou adicione uma pequena “folga” (geralmente 60 seconds) na sua biblioteca de parsing para compensar pequenas variações.

Posso decodificar um JWT sem ter a chave secreta ou pública?

Sim, você sempre pode decodificar e ler o Header e o Payload sem uma chave, porque são simplesmente JSON codificado em Base64URL. No entanto, você não pode verificar a Signature nem confiar que os dados são autênticos sem o segredo correspondente (para HS256) ou a chave pública (para RS256). Sem verificação, trate os dados como não verificados e potencialmente adulterados.

O que é o ataque “alg: none” e como evitá-lo?

O ataque “alg: none” explora parsers que aceitam o algoritmo especificado no header do token sem validação. Um atacante altera o header para "alg": "none" e remove a assinatura, enganando um parser vulnerável para aceitar o token como válido. Evite isso especificando sempre explicitamente os algoritmos permitidos no seu código de verificação — nunca aceite “none” nem permita que o token dite qual algoritmo usar.

About the author

SE

SectoJoy

Creator of Ez Parser, focused on practical parser and decoder workflows.

Follow author