O que é JWT: header, payload, assinatura e segurança

Entenda o que é um JWT, as três partes (header, payload e assinatura), a diferença essencial entre decodificar e validar um token, os principais riscos de segurança e por que não colar tokens sensíveis em ferramentas online.

Revisado pela equipe editorial ValorFinalRFC 7519 / MDN / OWASP
Calcule agora: JWT DecoderResultado na hora, de graça e sem cadastro.

JWT está em quase toda autenticação de API e aplicação web, e mesmo assim é cercado de mal-entendidos, quase todos sobre segurança. O maior deles: muita gente acha que o token é criptografado e que os dados dentro dele são secretos. Não são. Entender as três partes de um JWT, a diferença entre codificar e criptografar e o que separa decodificar de validar evita erros que expõem contas inteiras. Neste guia você vê o que é um JWT, como ele é montado, como funciona o fluxo de login, onde estão os riscos e por que nunca colar tokens sensíveis em qualquer lugar. Para inspecionar um token com segurança, use o decodificador de JWT.

Resposta rápida

  • JWT é um token compacto e verificável com 3 partes: header.payload.signature, separadas por ponto (RFC 7519).
  • Header e payload são só codificados em Base64URL, não criptografados: qualquer um lê o conteúdo sem chave.
  • A assinatura garante integridade, não sigilo. Validar exige conferir a assinatura, a expiração (exp) e o emissor no servidor.
  • Nunca ponha senha ou dado sensível no payload, e nunca cole tokens reais em sites desconhecidos.

O que é JWT e o problema que ele resolve

JWT (JSON Web Token) é um padrão aberto, definido na RFC 7519, para transmitir informações entre duas partes de forma compacta e verificável. O problema que ele ataca é a autenticação sem estado (stateless). No modelo antigo de sessão, o servidor guarda uma tabela de sessões e, a cada requisição, procura o usuário pelo id do cookie. Isso funciona, mas amarra o usuário a um servidor específico e cria trabalho de armazenamento e consulta.

Com JWT, a ideia se inverte. Depois do login, o servidor monta um token que já carrega quem é o usuário e o assina com uma chave. O cliente guarda esse token e o envia em cada requisição. O servidor só precisa conferir a assinatura para confiar no conteúdo, sem consultar banco de dados. Como a informação vive dentro do próprio token, qualquer servidor com a chave certa consegue validar, o que facilita escalar e distribuir a autenticação entre vários serviços. O payload é escrito em JSON, o mesmo formato do guia sobre o que é JSON.

As três partes: header, payload e assinatura

Um JWT é formado por três blocos separados por ponto. Cada bloco é codificado em Base64URL:

Na prática, um token tem este formato (as quebras de linha abaixo são só para leitura; o token real é uma única linha com dois pontos):

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.        ← header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.   ← payload
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c   ← signature

Repare que cada parte parece embaralhada, mas não está protegida: é apenas texto codificado. Para entender essa codificação em si, veja o codificador Base64.

Base64URL não é criptografia (prova decodificando)

Esse é o mal-entendido número um sobre JWT. Base64URL é uma codificação, não uma cifra. Não existe segredo nem chave: qualquer pessoa converte de volta para o texto original em um clique. Um JWS assinado esconde a chave usada na assinatura, mas expõe todo o conteúdo do header e do payload. Decodificando os dois primeiros blocos do token acima, sai isto:

// header decodificado
{
  "alg": "HS256",
  "typ": "JWT"
}

// payload decodificado
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Nada de chave, nada de servidor: o navegador faz isso sozinho. A lição prática é direta. Se você colocar CPF, senha, número de cartão ou qualquer dado sensível no payload, estará entregando esse dado a quem tiver o token. A assinatura protege contra alteração, não contra leitura. Confidencialidade de verdade só vem com HTTPS no transporte e, quando o conteúdo precisa ser secreto, com JWE (a variante que de fato cifra o payload).

As claims registradas

Os dados dentro do payload são os claims. A RFC 7519 padroniza sete claims (todas opcionais), que aparecem em praticamente todo JWT de autenticação. Conhecê-las ajuda a ler e a validar tokens:

ClaimNomeO que significa
issIssuerQuem emitiu o token (o servidor de autenticação).
subSubjectO sujeito do token, em geral o id do usuário.
audAudiencePara quem o token se destina (a API que deve aceitá-lo).
expExpirationMomento em que o token deixa de valer (timestamp).
nbfNot BeforeMomento a partir do qual o token passa a valer.
iatIssued AtQuando o token foi emitido.
jtiJWT IDIdentificador único do token, útil para blocklist e evitar reuso.

Além dessas, o payload pode ter claims públicas (nomes registrados por convenção) e privadas (combinadas entre quem emite e quem consome), como nome, papel ou lista de permissões. As três datas (exp, nbf, iat) usam o formato de timestamp NumericDate, ou seja, segundos desde 1º de janeiro de 1970 em UTC.

Como o token é assinado: HS256 x RS256

A assinatura é o que dá confiança ao JWT. Ela é calculada sobre o header e o payload já codificados, usando o algoritmo declarado no header. Os dois algoritmos mais comuns representam duas famílias diferentes:

PontoHS256RS256
TipoSimétrico (HMAC com SHA-256)Assimétrico (RSA com SHA-256)
ChavesUma chave secreta compartilhadaPar de chaves: privada assina, pública verifica
Quem pode assinarQualquer um com a chave (assina e verifica)Só quem tem a chave privada
Quem pode verificarSó quem tem a mesma chave secretaQualquer um com a chave pública
Quando usarSistema único e mais simplesVários serviços verificam o mesmo token

A diferença tem peso de segurança. Com HS256, distribuir a chave para vários serviços verificarem também os transforma em capazes de forjar tokens. Com RS256, você entrega só a chave pública para os verificadores e mantém a privada isolada no emissor. Por isso RS256 é o padrão em arquiteturas com muitos serviços e provedores de identidade.

O fluxo de autenticação com JWT, passo a passo

Juntando as peças, um login com JWT costuma seguir esta sequência:

  1. O usuário envia e-mail e senha. Sobre boas práticas de senha, veja o guia do verificador de senha forte.
  2. O servidor confere as credenciais e, se estiverem certas, monta um payload (com sub, exp e o que mais for preciso) e assina o token com a chave.
  3. O token volta para o cliente, que o guarda (em cookie ou em memória, com os cuidados que veremos adiante).
  4. Em cada requisição protegida, o cliente envia o token no cabeçalho Authorization: Bearer <token>.
  5. O servidor verifica a assinatura, confere exp, nbf, iss e aud, e só então confia no conteúdo e responde.

Nenhuma etapa consulta uma tabela de sessões: a confiança vem da assinatura. Esse é o ganho e, ao mesmo tempo, a origem do maior desafio do JWT, a revogação, que veremos mais adiante.

Segurança: os erros que derrubam a proteção

A maioria das falhas com JWT não está no algoritmo, e sim em validação mal feita. Os pontos que a OWASP mais reforça:

Trate o token de acesso como uma credencial viva: quem o tem, e enquanto ele valer, está logado. Para gerar e conferir hashes ao proteger dados, o gerador de hash ajuda a entender a diferença entre hash e assinatura.

Onde guardar o token no cliente

Depois do login, o navegador precisa guardar o token em algum lugar, e cada opção tem um risco diferente. Não há escolha perfeita:

O trade-off é XSS x CSRF. Muitos times preferem o cookie HttpOnly com SameSite estrito por remover o token do alcance do JavaScript, mas a decisão depende do restante da arquitetura. Em qualquer caso, feche as portas de XSS (validando e escapando entradas) e sirva tudo por HTTPS.

JWT x sessão tradicional

JWT não é sempre melhor que a sessão clássica: são trocas diferentes. O quadro resume as três diferenças que mais pesam na decisão:

AspectoSessão tradicionalJWT
Onde fica o estadoNo servidor; o cliente guarda só um idNo próprio token, assinado, no cliente
Escala e distribuiçãoPrecisa compartilhar a sessão entre servidoresQualquer servidor com a chave valida sozinho
RevogaçãoImediata: basta apagar a sessãoDifícil: vale até expirar (precisa de blocklist)

Em resumo: a sessão é fácil de invalidar e o JWT é fácil de distribuir. Se o seu sistema é um servidor único que precisa derrubar acessos na hora, a sessão costuma ser mais direta. Se você tem vários serviços validando o mesmo login, o JWT paga o custo.

O problema da revogação

Como o servidor valida o JWT só pela assinatura, ele não sabe, por conta própria, que um token foi revogado. Um token roubado continua funcionando até o exp. As saídas combinam bem:

Refresh tokens na prática

O par token de acesso mais refresh token é o desenho mais comum. O token de acesso é curto e vai em cada requisição; o refresh token é longo e fica guardado com mais proteção (em geral um cookie HttpOnly). Quando o token de acesso expira, o cliente troca o refresh por um novo acesso, sem novo login. Uma boa prática é a rotação: cada uso do refresh gera um novo e invalida o anterior, o que ajuda a detectar reuso indevido. Ao deslogar, o servidor descarta o refresh token e passa a barrar o acesso pela blocklist até ele expirar.

JWT x token opaco

Nem todo token de autenticação é um JWT. Um token opaco é só uma string aleatória sem significado por si: o servidor guarda, em um armazenamento, a quem aquele token pertence e o consulta a cada uso. Ele é o oposto do JWT em uma dimensão importante: o opaco carrega estado no servidor (fácil de revogar, precisa de consulta), enquanto o JWT carrega estado no token (stateless, difícil de revogar). Um token opaco também não vaza dados, porque não há nada legível dentro dele. A escolha entre os dois segue a mesma lógica de sessão x JWT: revogação imediata pende para o opaco, validação distribuída pende para o JWT.

Quando não usar JWT

JWT é ótimo, mas não é resposta para tudo. Pense duas vezes antes de adotá-lo quando:

Por que não colar tokens sensíveis online

Como o payload é legível e um token de acesso válido funciona como senha, colar um JWT real de produção em um site desconhecido é arriscado: você pode entregar tanto os dados quanto uma credencial ativa. Use ferramentas que processam localmente no navegador, como o decodificador de JWT do ValorFinal, que não envia o token a nenhum servidor. Para entender o JSON do payload, veja o guia o que é JSON; para gerar hashes, o gerador de hash; e para outras tarefas de codificação, o codificador de URL e o gerador de UUID.

Limitações deste guia

Este conteúdo é educativo e não cobre todas as nuances de uma implementação segura de autenticação. Detalhes como escolha de biblioteca, rotação de chaves, formatos de armazenamento e políticas de expiração dependem do seu contexto. Para sistemas em produção, siga as recomendações oficiais (RFC 7519 e OWASP) e prefira bibliotecas consolidadas a implementar assinatura e validação do zero. Veja também como validamos os cálculos.

Fontes oficiais

Conclusão

Um JWT tem três partes, header, payload e assinatura, e o ponto que evita os erros mais graves é entender que codificar não é criptografar e decodificar não é validar. O payload é legível por qualquer um, então nunca guarde segredo nele; a assinatura garante integridade, não sigilo, e só vale depois de conferida com a chave e o algoritmo esperados no servidor, junto do exp. Como o token é válido até expirar, use exp curto, refresh token e blocklist quando precisar revogar. Para inspecionar um token com segurança, use o decodificador de JWT, entenda o JSON do payload e a codificação Base64, e conheça as demais ferramentas de tecnologia.

Calculadoras deste guia

Leia também

Fontes oficiais

Links externos para os documentos oficiais consultados na construção desta página. O conteúdo deles pode mudar sem aviso; em caso de divergência, vale sempre a fonte oficial.

Como validamos os cálculos

Os valores citados neste guia são estimativos e baseados em fontes oficiais (RFC 7519 / MDN / OWASP). Eles podem variar conforme convenção coletiva, situação individual e atualizações da legislação. Entenda nossa metodologia em como validamos os cálculos.

Perguntas frequentes

O que é um JWT?
JWT (JSON Web Token) é um padrão da RFC 7519 para transmitir informações de forma compacta e verificável entre duas partes, muito usado em autenticação. Ele carrega dados (claims) em JSON, codificados em Base64URL, mais uma assinatura que permite verificar se o token não foi alterado. O formato é header.payload.signature, com as três partes separadas por ponto.
Quais são as três partes de um JWT?
Header (cabeçalho), payload (corpo) e signature (assinatura), separadas por ponto. O header diz o algoritmo de assinatura e o tipo; o payload traz os claims, como sub (id do usuário) e exp (expiração); a assinatura é gerada a partir do header, do payload e de uma chave, e garante a integridade do token. Header e payload são apenas codificados em Base64URL, não criptografados.
JWT é criptografado?
Por padrão, não. O JWT mais comum é um JWS (JSON Web Signature): ele é assinado, não cifrado. Header e payload ficam só codificados em Base64URL e podem ser lidos por qualquer pessoa que tenha o token. A assinatura garante integridade (que não foi adulterado), mas não confidencialidade. Existe o JWE (JSON Web Encryption), que de fato cifra o conteúdo, mas é menos comum. Por isso nunca coloque dado secreto no payload.
Qual a diferença entre decodificar e validar um JWT?
Decodificar é só ler o header e o payload, que estão em Base64URL e não são cifrados. Validar é conferir a assinatura com a chave correta, checar a expiração (exp) e o emissor (iss). Uma ferramenta de decodificação mostra o conteúdo, mas não prova que o token é autêntico: isso exige validação no servidor, com a chave e o algoritmo esperados.
O que é Base64URL e por que o payload é legível?
Base64URL é uma variante do Base64 segura para URLs (usa - e _ no lugar de + e /, e omite o preenchimento com =). Ela é uma codificação, não criptografia: qualquer um decodifica de volta sem chave nenhuma. Por isso o payload de um JWT assinado é legível. Cole o token no decodificador e você vê o JSON original em texto claro.
Quais são as claims registradas do JWT?
A RFC 7519 define sete claims padronizadas, todas opcionais: iss (emissor), sub (sujeito, em geral o id do usuário), aud (destinatário), exp (expiração), nbf (não antes de), iat (emitido em) e jti (id único do token). Além delas, o payload pode ter claims públicas e privadas combinadas entre as partes, como nome, papel ou permissões.
Qual a diferença entre HS256 e RS256?
São algoritmos de assinatura. O HS256 é simétrico (HMAC com SHA-256): usa a mesma chave secreta para assinar e verificar, então quem verifica também poderia forjar tokens. O RS256 é assimétrico (RSA com SHA-256): assina com uma chave privada e verifica com a chave pública, o que permite distribuir a verificação sem expor a chave de assinatura. RS256 é comum quando vários serviços validam o mesmo token; HS256, em sistemas mais simples.
O que é o ataque do algoritmo none?
É uma falha clássica em que o atacante troca o header do JWT para o algoritmo none, removendo a assinatura, e um servidor mal configurado aceita o token sem verificar. A defesa é fixar no servidor o algoritmo esperado (por exemplo, só RS256) e rejeitar none. Confiar no algoritmo declarado pelo próprio token é um erro conhecido, listado pela OWASP.
Um JWT pode ser revogado antes de expirar?
Por natureza, não. Um JWT assinado é válido até o exp: o servidor consegue verificá-lo sem consultar banco, então também não sabe, sozinho, que ele foi revogado. As saídas são usar exp curto (minutos), somar um refresh token e manter uma blocklist de tokens invalidados (por jti) para logout e troca de senha. Isso reintroduz um pouco de estado, mas fecha o buraco.
Onde devo guardar o JWT no navegador?
É um tema sensível, sem resposta única. localStorage é simples, mas o token fica exposto a XSS (qualquer script na página o lê). Cookie com HttpOnly e Secure protege contra leitura por JavaScript, mas exige defesa contra CSRF (SameSite, tokens anti-CSRF). A escolha depende da arquitetura e das proteções adotadas. Siga as recomendações da OWASP e use bibliotecas consolidadas.
Qual a diferença entre JWT e sessão tradicional?
Na sessão tradicional o servidor guarda o estado e entrega ao cliente só um id de sessão; para revogar, basta apagar a sessão. No JWT o estado vai dentro do token, assinado, e o servidor valida sem consultar armazenamento, o que escala bem entre serviços. O custo é a revogação difícil e o token maior. Sessão é simples de invalidar; JWT é simples de distribuir.
É seguro colar um JWT em uma ferramenta online?
Não com tokens reais e sensíveis. O payload não é cifrado: quem tem o token lê os dados e, se for um token de acesso válido, pode usá-lo como credencial. Use ferramentas que processam localmente, como o decodificador do ValorFinal, que não envia o token a servidor nenhum. Nunca cole tokens de produção em sites desconhecidos.
Quando é melhor não usar JWT?
Quando você precisa de revogação imediata e confiável (por exemplo, banir uma sessão na hora), quando uma sessão simples de servidor já resolve, ou quando o payload cresce demais e o token fica pesado em cada requisição. Nesses casos, sessão com id opaco costuma ser mais direta e segura. JWT brilha em cenários stateless e distribuídos, não em tudo.