Descubra o que é JWT, como funciona, sua estrutura, diferenças em relação a sessões, e quando usar. Veja dicas de segurança e os melhores cenários para implementar JWT em APIs, microsserviços e aplicativos móveis. Aprenda também sobre access token, refresh token e os principais riscos a evitar.
JWT token é uma das formas mais populares de autenticação em aplicações web modernas. Ele é amplamente utilizado em APIs, aplicativos móveis e serviços com arquitetura de microsserviços, pois permite a autorização sem a necessidade de armazenar sessões no servidor.
No passado, era necessário que o servidor mantivesse uma sessão para cada usuário, mas com o JWT tudo funciona de forma diferente: todas as informações necessárias são transmitidas junto com cada requisição. Isso torna o sistema mais rápido, fácil de escalar e mais prático para serviços distribuídos.
Neste artigo, vamos explicar o que é um JWT token, como funciona, sua estrutura e as principais diferenças em relação às sessões tradicionais.
JWT token é uma sequência especial de caracteres que armazena informações sobre o usuário e serve para identificá-lo sem precisar guardar dados no servidor. A sigla JWT significa JSON Web Token.
Em termos simples, é como um "passe digital" que você recebe ao fazer login. Em vez de consultar o banco de dados a cada requisição, o servidor apenas verifica o token e entende quem você é e quais permissões possui.
O JWT é bastante utilizado em aplicações web modernas, aplicativos móveis e APIs. Exemplos de uso:
A principal ideia do JWT é que todos os dados ficam dentro do próprio token, não no servidor. Isso facilita o escalonamento e agiliza o sistema.
Um token normalmente se parece com uma sequência longa separada por pontos, por exemplo:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Apesar de parecer um conjunto aleatório de caracteres, ele contém:
Importante: o JWT não criptografa os dados, apenas os codifica. Assim, o conteúdo pode ser lido, mas não modificado sem invalidar a assinatura.
JWT tornou-se popular porque permite implementar autenticação sem sessões, dispensando o armazenamento de estado do usuário no servidor - todas as informações já estão no token.
O funcionamento do JWT token se baseia numa ideia simples: o servidor emite o token uma vez e, a partir daí, apenas o valida a cada requisição, sem guardar o estado do usuário.
Vamos ao passo a passo:
Authorization: Bearer <token>
O servidor não armazena informações do usuário entre as requisições, pois tudo o que precisa já está no token. Por isso, o JWT é chamado de abordagem stateless (sem estado).
Esse mecanismo é ideal para:
O JWT também costuma ser usado em conjunto com OAuth - saiba mais no artigo Como funciona o OAuth 2.0: autenticação sem senha e segurança dos seus dados.
O JWT token é formado por três partes separadas por pontos:
header.payload.signature
Cada parte é codificada em Base64, então, embora pareça uma string aleatória, possui uma estrutura legível.
Contém informações sobre o tipo do token e o algoritmo de assinatura.
{
"alg": "HS256",
"typ": "JWT"
}
A principal seção do token, onde ficam os dados.
{
"userId": 123,
"role": "admin",
"exp": 1712345678
}
O payload pode conter:
Atenção: o payload não é criptografado, apenas codificado. Qualquer um pode lê-lo.
A parte mais importante, que protege o token de falsificações. Ela é gerada a partir do:
Se alguém tentar modificar os dados do token, a assinatura não vai bater, e o servidor rejeitará a requisição.
No fim, o JWT é mais do que uma simples string - é um container autossuficiente com dados e proteção. O servidor não precisa consultar o banco para saber quem é o usuário, pois todas as informações já estão no token.
Ao usar JWT, é comum confundir dois conceitos: autenticação e autorização. Eles se complementam, mas têm funções distintas.
É o processo de confirmar a identidade do usuário. Ou seja, o sistema responde: "quem é você?".
Exemplo:
É nesse momento que normalmente o JWT token é criado.
Vem depois: o sistema responde "o que você pode fazer?".
Essas permissões são armazenadas no JWT, geralmente no payload (campo role, por exemplo).
Ou seja, o JWT une os dois processos: confirma a identidade e guarda as permissões.
Importante: o JWT em si não faz autenticação, apenas armazena o resultado da verificação feita previamente.
Para entender a vantagem do JWT, é essencial comparar com o modelo clássico de sessões.
Após o login:
A cada requisição:
Ou seja, o servidor mantém o estado do usuário.
No lugar do armazenamento no servidor:
O servidor apenas valida o token, sem buscar dados no banco.
Resumo: o JWT é indicado para flexibilidade e escalabilidade, enquanto sessões oferecem mais controle e simplicidade de gestão.
Na prática, o JWT raramente é usado sozinho. O padrão mais seguro envolve dois tokens: access token e refresh token, equilibrando segurança e usabilidade.
É o token principal, utilizado em cada requisição. Características:
Se for roubado, o invasor só terá acesso por pouco tempo.
Token auxiliar, usado para renovar o access token. Características:
O uso combinado resolve o problema: access token para segurança e refresh token para praticidade.
O refresh token deve ser armazenado em cookie com flag HttpOnly, inacessível via JavaScript e protegido contra ataques XSS.
Essa abordagem é padrão em sistemas de autenticação modernos.
O JWT é seguro - desde que seja implementado corretamente. Erros comuns podem abrir brechas sérias.
A principal proteção do JWT é a assinatura:
O JWT não pode ser adivinhado, mas pode ser roubado. Se um invasor obtiver o token:
E o servidor não conseguirá distinguir entre o legítimo e o invasor.
O JWT é uma ferramenta poderosa, mas não serve para todos os casos. Veja onde ele realmente se destaca:
O JWT é ideal pois:
O JWT é indicado para sistemas escaláveis, APIs e aplicações front-end modernas, mas não é uma solução universal.
O JWT token é uma solução moderna de autenticação, permitindo dispensar o armazenamento de sessões no servidor. Ele carrega todas as informações necessárias consigo e é protegido por assinatura, tornando o sistema rápido e escalável.
Vimos neste artigo:
O JWT é excelente para APIs, aplicativos móveis e microsserviços, mas pode ser exagerado em projetos simples.
Em resumo: JWT é sinônimo de praticidade e escalabilidade, enquanto sessões representam controle e simplicidade.
A escolha depende dos objetivos, arquitetura e exigências de segurança do seu projeto.