Pular para o conteúdo
TBToolbox Brasil

O que é JWT? Guia Completo sobre JSON Web Token

·8 min de leitura·Por Equipe Toolbox Brasil

O JWT (JSON Web Token) é um padrão aberto (RFC 7519) utilizado para transmitir informações entre sistemas de forma compacta e segura. Ele é amplamente utilizado em autenticação de usuários, autorização de acesso e comunicação entre APIs.

Quando um usuário faz login, o servidor pode gerar um JWT contendo informações sobre a identidade e permissões desse usuário. Em vez de armazenar uma sessão no servidor, o cliente envia esse token em cada requisição para provar que está autenticado.

Hoje, JWT é amplamente utilizado em aplicações web, aplicativos mobile, microsserviços e integrações com APIs.


Índice


Como funciona um JWT?

O fluxo básico é simples:

  1. O usuário informa suas credenciais
  2. O servidor valida as informações
  3. Um JWT é gerado
  4. O cliente armazena esse token
  5. Cada nova requisição envia o JWT no cabeçalho HTTP
  6. O servidor valida a assinatura antes de responder

Na maioria das APIs REST, o token é enviado no cabeçalho Authorization:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Estrutura de um JWT

Um JWT possui três partes separadas por ponto (.):

HEADER.PAYLOAD.SIGNATURE

Exemplo:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTYiLCJuYW1lIjoiSm9hbyIsImFkbWluIjp0cnVlLCJleHAiOjE3MzAwMDAwMDB9.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

O Header informa o tipo do token e o algoritmo utilizado.

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

Algoritmos mais comuns

| Algoritmo | Tipo | Descrição | |-----------|------|-----------| | HS256 | Simétrico | HMAC com SHA-256 | | HS384 | Simétrico | HMAC com SHA-384 | | HS512 | Simétrico | HMAC com SHA-512 | | RS256 | Assimétrico | RSA com SHA-256 | | ES256 | Assimétrico | ECDSA com SHA-256 |


Payload

O Payload contém as informações (claims).

{
  "sub": "123456",
  "name": "João",
  "email": "joao@email.com",
  "role": "admin",
  "exp": 1780000000
}

Claims padrão (registered claims)

| Claim | Descrição | Exemplo | |-------|-----------|---------| | sub | Identificador do usuário | "123456" | | iss | Emissor | "api.toolboxbrasil.com" | | aud | Destinatário | "app.toolboxbrasil.com" | | iat | Data de emissão | 1720000000 | | nbf | Não válido antes de | 1720000000 | | exp | Expiração | 1720003600 | | jti | Identificador único | "abc123" |


Signature

A assinatura garante que o token não foi alterado.

Ela é criada utilizando:

  • Header (codificado em Base64URL)
  • Payload (codificado em Base64URL)
  • Chave secreta (ou chave privada)
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

Se qualquer informação do token for modificada, a assinatura deixa de ser válida.


Fluxo de autenticação

Usuário
  │ Login (email + senha)
  ▼
Servidor valida credenciais
  │ Gera JWT
  ▼
Cliente armazena token
  │ Requisição com Bearer Token
  ▼
API valida assinatura
  │ Resposta autorizada
  ▼
Dados retornados

Exemplo em código

// Requisição com JWT
fetch("/api/dados", {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

Vantagens do JWT

  • Não exige sessão armazenada no servidor (stateless)
  • Ideal para APIs REST
  • Funciona muito bem com microsserviços
  • Fácil integração entre sistemas
  • Compacto e leve
  • Compatível com praticamente todas as linguagens
  • Suporta tanto algoritmos simétricos quanto assimétricos

Limitações

Apesar das vantagens, JWT também possui limitações:

  • O token continua válido até sua expiração (não pode ser "invalidado" facilmente)
  • Revogar tokens pode exigir estratégias adicionais (blacklist, Redis)
  • Tokens muito grandes aumentam o tráfego de rede
  • Informações sensíveis nunca devem ser armazenadas no Payload
  • O Payload pode ser lido por qualquer pessoa (é apenas Base64URL)

Erros comuns

Armazenar informações confidenciais

O Payload pode ser decodificado facilmente. Nunca coloque:

  • Senhas
  • Números de cartão
  • CPF
  • Dados bancários
  • Informações sigilosas

Esquecer a expiração

Sempre defina o campo exp. Tokens sem expiração representam um risco de segurança significativo.

Utilizar algoritmo inseguro

Prefira algoritmos modernos e amplamente utilizados (HS256, RS256). Evite configurações que aceitem automaticamente qualquer algoritmo informado no token (vulnerabilidade conhecida como "algorithm confusion").

Não validar a assinatura

Decodificar um JWT não significa que ele é confiável. Sempre valide a assinatura antes de utilizar qualquer informação presente no Payload.

Armazenar token em localStorage sem HTTPS

Tokens em localStorage ficam acessíveis via XSS. Considere usar httpOnly cookies em aplicações sensíveis.


Boas práticas

✔ Utilize HTTPS em todas as requisições

✔ Defina tempo de expiração adequado (15min–1h para access tokens)

✔ Renove tokens utilizando Refresh Tokens quando necessário

✔ Nunca exponha a chave secreta no código-fonte

✔ Não armazene informações confidenciais no Payload

✔ Valide emissor (iss) e audiência (aud) quando fizer sentido

✔ Rejeite tokens expirados imediatamente

✔ Use algoritmos assimétricos (RS256) para comunicação entre serviços

✔ Implemente rotação de chaves periodicamente


JWT é criptografado?

Não. Na maioria dos casos, o conteúdo do JWT é apenas codificado em Base64URL. Qualquer pessoa pode visualizar o Header e o Payload.

A segurança do JWT está na assinatura, que permite verificar se o token foi alterado.

Se precisar que o conteúdo seja secreto, utilize JWE (JSON Web Encryption) em vez de JWS (JSON Web Signature).


JWT e OAuth são a mesma coisa?

Não.

  • OAuth 2.0 é um protocolo de autorização
  • JWT é um formato de token

Um sistema OAuth pode utilizar JWT como Access Token, mas isso não é obrigatório. OAuth também pode usar tokens opacos (strings aleatórias validadas no servidor).


Perguntas Frequentes

JWT é seguro?

Sim, desde que seja utilizado corretamente: com assinatura válida, HTTPS, expiração adequada e boas práticas de segurança.


Posso armazenar senha dentro do JWT?

Não. Nunca armazene informações confidenciais no Payload. O conteúdo pode ser decodificado por qualquer pessoa.


Posso alterar o Payload manualmente?

Pode alterar o texto, mas a assinatura deixará de ser válida e o servidor deverá rejeitar o token.


Qual a diferença entre Session e JWT?

Na autenticação baseada em sessão, o servidor mantém informações sobre cada usuário autenticado (stateful). Com JWT, o cliente envia o token em cada requisição e o servidor valida sua assinatura, sem precisar armazenar estado da sessão (stateless).


Como visualizar o conteúdo de um JWT?

Você pode utilizar nossa ferramenta JWT Decoder para visualizar o Header e o Payload de forma rápida e segura. A ferramenta apenas decodifica o token e não valida sua assinatura.


Onde armazenar o JWT no frontend?

As opções mais comuns são:

  • localStorage: Simples, mas vulnerável a XSS
  • httpOnly cookie: Mais seguro contra XSS, mas requer CSRF protection
  • Memória (variável): Mais seguro, mas perdido ao recarregar a página

Experimente nossa ferramenta

Cole seu JSON Web Token em nossa ferramenta JWT Decoder para visualizar:

  • Header (algoritmo e tipo)
  • Payload (claims e dados)
  • Datas de emissão e expiração
  • Informações codificadas

Tudo acontece diretamente no navegador, sem necessidade de enviar seus dados para servidores externos.

Abrir JWT Decoder →