PureTools

Tokens JWT: Decodifique e Entenda Seus Tokens

PureTools Team· 9 min de leitura
Tokens JWT: Decodifique e Entenda Seus Tokens

Tokens JWT: O Que Tem Dentro?

Você já viu eles — aquelas strings longas começando com eyJ que aparecem em headers Authorization, cookies e local storage. JWTs (JSON Web Tokens) estão em todo lugar na autenticação moderna, e entender sua estrutura é essencial para debugar problemas de auth.

Anatomia de um JWT

Um JWT tem três partes separadas por pontos:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

|___________ header ___________|.|_____________ payload ______________|.|_________ signature __________|

Cada parte é JSON codificado em Base64url (não criptografado — qualquer pessoa pode ler).

O Header

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

Diz qual algoritmo de assinatura. Valores comuns:

  • HS256 — HMAC com SHA-256 (simétrico, usa um segredo compartilhado)
  • RS256 — RSA com SHA-256 (assimétrico, usa par de chaves pública/privada)
  • ES256 — ECDSA com curva P-256 (assimétrico, chaves menores)
  • nonePERIGO: sem assinatura. Nunca aceite isso em produção.

O Payload (Claims)

{
  "sub": "user-123",
  "name": "Alice",
  "email": "alice@example.com",
  "role": "admin",
  "iat": 1716239022,
  "exp": 1716242622,
  "iss": "auth.myapp.com"
}

Claims padrão:

ClaimSignificado
subSubject (ID do usuário)
iatIssued At (timestamp Unix)
expExpiration (timestamp Unix)
issIssuer (quem criou o token)
audAudience (destinatário pretendido)
nbfNot Before (válido após este momento)

Você pode adicionar qualquer claim customizado — só não coloque dados sensíveis, porque o payload é legível por qualquer pessoa que tenha o token.

A Assinatura

Isso é o que torna JWTs à prova de adulteração:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

Se alguém modificar o header ou payload, a assinatura não vai bater. O servidor rejeita o token. Mas a assinatura só prova integridade — não esconde o conteúdo.

Cenários Comuns de Debug

"Token expired": Decodifique o token, verifique o claim exp. Converta o timestamp Unix para data. O relógio do servidor está errado? O tempo de vida do token é muito curto?

"Invalid signature": O token foi assinado com um segredo/chave diferente do que seu servidor espera. Comum em setups multi-ambiente onde staging e produção usam segredos diferentes.

"Token malformed": O token não tem três partes separadas por ponto, ou a decodificação Base64 falha. Frequentemente causado por truncamento ao copiar tokens.

Considerações de Segurança

  • Não armazene dados sensíveis no payload. É codificado em Base64, não criptografado. Qualquer pessoa com o token pode ler os claims.
  • Sempre verifique a assinatura no servidor. Nunca confie em um JWT sem verificação.
  • Defina tempos de expiração razoáveis. Access tokens de curta duração (15-60 min) + refresh tokens de longa duração é o padrão.
  • Use HTTPS. JWTs em trânsito podem ser interceptados em conexões não criptografadas.

JWT em Código

// Node.js — verificar um token
import jwt from 'jsonwebtoken';

try {
  const decoded = jwt.verify(token, process.env.JWT_SECRET);
  console.log(decoded.sub); // ID do usuário
} catch (err) {
  if (err.name === 'TokenExpiredError') {
    // tratar refresh
  }
}
# Python
import jwt

try:
    payload = jwt.decode(token, SECRET, algorithms=['HS256'])
    print(payload['sub'])
except jwt.ExpiredSignatureError:
    # tratar refresh
    pass

Decodifique seu token agora: Decodificador JWT — cole qualquer JWT, veja o header, payload e expiração instantaneamente. Nenhum dado é enviado para servidores.