Sessão, JWT e OAuth2
As três formas mais comuns de identificar o usuário a cada pedido, com as trocas de cada uma.
Autenticação e autorização
Os dois termos andam juntos e respondem perguntas diferentes:
- Autenticação: quem é você? O sistema confere uma prova de identidade, como senha, código ou chave.
- Autorização: o que você pode fazer? Com a identidade conhecida, o sistema decide se a ação é permitida.
Este tópico trata da primeira pergunta e de como a resposta acompanha cada pedido. A segunda tem um tópico próprio na trilha.
O problema: o HTTP esquece
O usuário digita e-mail e senha uma vez. O sistema confere e responde que está tudo certo. No pedido seguinte, o servidor já não sabe quem é aquela pessoa, porque o HTTP não guarda memória entre pedidos.
Toda forma de login na web resolve o mesmo problema: depois de conferir a senha, o servidor entrega ao cliente uma credencial, e o cliente a envia em cada pedido seguinte. As soluções diferem no que essa credencial contém e em onde fica o estado do login.
| Onde fica o estado | O que o cliente guarda | |
|---|---|---|
| Sessão | No servidor | Um identificador aleatório |
| Token assinado (JWT) | Dentro do próprio token | O token inteiro, com os dados do usuário |
Sessão: o servidor lembra
Depois do login, o servidor cria um registro de sessão (quem é o usuário, quando entrou, quando expira) e o guarda na memória, no banco ou num Redis. O cliente recebe apenas o identificador desse registro, num cookie:
HTTP/1.1 200 OK
Set-Cookie: sessao=k3J9xQ2mZ8...; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=86400O navegador devolve o cookie sozinho em cada pedido ao mesmo site:
GET /pedidos HTTP/1.1
Cookie: sessao=k3J9xQ2mZ8...O servidor procura o identificador no armazenamento e descobre quem é o usuário. O identificador em si não significa nada: é um valor aleatório e longo, impossível de adivinhar.
Como o estado está no servidor, encerrar um login é imediato: apaga-se o registro, e o cookie passa a apontar para o nada.
Token assinado: o cliente carrega a prova
No modelo com token, o servidor monta um documento com os dados do usuário, assina esse documento com uma chave que só ele conhece e o entrega ao cliente. O formato mais usado é o JWT (JSON Web Token): três partes em Base64, separadas por pontos.
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiIsImV4cCI6MTc3MzE1MDAwMH0.Xk2...
cabeçalho conteúdo assinaturaDecodificado, o conteúdo é um JSON comum:
{
"sub": "42",
"papel": "cliente",
"iss": "https://api.loja.com.br",
"aud": "loja-web",
"exp": 1773150000
}O cliente envia o token no cabeçalho Authorization:
GET /pedidos HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...O servidor confere a assinatura e a validade e confia no conteúdo, sem consultar banco nenhum. Qualquer servidor que tenha a chave consegue validar o token. Essa é a grande vantagem do modelo.
O preço aparece na hora de cortar um acesso. O token vale até o horário em exp, e o servidor não guarda lista nenhuma para consultar. Se o usuário trocar a senha ou um token vazar, ele continua aceito até vencer, a menos que você crie um mecanismo de revogação, o que traz de volta uma consulta a cada pedido.
Cookie e cabeçalho não são concorrentes
Uma confusão comum é tratar "cookie" e "JWT" como alternativas. Cookie é um meio de transporte; JWT e identificador de sessão são conteúdos.
- Um JWT pode viajar dentro de um cookie.
- Um identificador de sessão pode viajar no cabeçalho
Authorization.
O que muda com o transporte é a exposição a ataques:
| Transporte | Envio | Risco principal | Proteção |
|---|---|---|---|
Cookie HttpOnly | Automático pelo navegador | Um site malicioso dispara pedidos usando o cookie da vítima (CSRF) | SameSite, token anti-CSRF |
| Cabeçalho, com token guardado pelo JavaScript | Manual, pelo código da página | Um script injetado na página lê e rouba o token (XSS) | Evitar XSS; tokens de vida curta |
Um cookie com HttpOnly não pode ser lido por JavaScript nenhum, nem por um script injetado. Por isso, em aplicações web, a recomendação geral é guardar a credencial num cookie HttpOnly, Secure e SameSite, e não no localStorage.
OAuth2 e OpenID Connect: delegar
As duas soluções anteriores resolvem o login no seu próprio sistema. O OAuth2 resolve outro problema: permitir que um aplicativo acesse dados do usuário em outro serviço, sem receber a senha dele.
O exemplo clássico é um aplicativo de agenda que quer ler o seu calendário do Google. Em vez de pedir a sua senha do Google, ele redireciona você ao Google. Você faz login lá e autoriza o acesso ao calendário. O Google devolve ao aplicativo um token de acesso limitado: só leitura, só o calendário, por algumas horas. Você pode revogar essa permissão a qualquer momento, sem trocar a senha.
O OAuth2 sozinho diz o que o aplicativo pode acessar, mas não diz quem o usuário é. O OpenID Connect (OIDC) é uma camada sobre o OAuth2 que acrescenta essa informação, num token de identidade. É o que existe por trás dos botões "Entrar com Google", "Entrar com a Microsoft" e do login corporativo das empresas.
| Pergunta que responde | Resultado | |
|---|---|---|
| OAuth2 | Este aplicativo pode acessar o quê, em nome do usuário? | Token de acesso |
| OpenID Connect | Quem é o usuário que acabou de entrar? | Token de identidade, mais o de acesso |
Por que isso importa quando a IA escreve o código
Um assistente gera um login funcional em minutos, quase sempre com JWT e quase sempre com os mesmos pontos fracos:
- O token fica no
localStorage, ao alcance de qualquer script injetado na página. - O token vale por dias, e não existe forma de cortar o acesso de um usuário demitido.
- A validação confere a assinatura, mas não o emissor, o público nem o algoritmo.
- Dados sensíveis vão dentro do token, achando que ele é criptografado.
- O próprio sistema implementa cadastro, senha, recuperação e segundo fator, quando um provedor pronto resolveria com menos risco.
O próximo nível compara as soluções e mostra como escolher entre elas.
Prompts para aprofundar
Ao abrir no ChatGPT ou no Claude, o prompt é enviado ao serviço escolhido pela URL e também fica copiado na sua área de transferência.
Autenticação em cinco minutos
Explique em no máximo cinco minutos de leitura como um site lembra quem eu sou depois que faço login, para alguém que programa mas nunca implementou autenticação. Cubra só o essencial: por que o HTTP precisa de uma credencial em cada pedido, a diferença entre sessão no servidor e token JWT, e o que são OAuth2 e o botão "Entrar com Google". Use um exemplo do dia a dia. No final, me faça três perguntas curtas para eu verificar se entendi, e corrija as minhas respostas.
Do login ao pedido seguinte
Quero entender como funciona a autenticação na web, desde o formulário de login até os pedidos seguintes. Aja como um mentor de backend. Pergunte primeiro qual é a minha experiência e em qual linguagem eu trabalho. Depois, conduza assim, uma etapa por vez, com uma pergunta de verificação ao fim de cada uma: 1. Por que o servidor esquece quem eu sou entre um pedido e outro. 2. Como funciona uma sessão: o que o servidor guarda, o que vai no cookie e o que o navegador faz com ele. Mostre os cabeçalhos HTTP reais. 3. Como funciona um JWT: as três partes, o que a assinatura garante e o que ela não garante. Decodifique um token de exemplo comigo. 4. A diferença entre o meio de transporte (cookie ou cabeçalho Authorization) e o conteúdo (identificador de sessão ou token). No final, peça que eu explique com minhas palavras por que é difícil cortar o acesso de um usuário que tem um JWT válido, e corrija o que estiver impreciso.
OAuth2 e OpenID Connect sem mistério
Quero entender OAuth2 e OpenID Connect sem decorar siglas. Explique usando um caso concreto: um aplicativo de agenda que precisa ler o meu calendário de outro serviço, e depois o botão "Entrar com Google" de um site qualquer. Cubra: 1. O problema que o OAuth2 resolve e por que entregar a senha ao aplicativo seria pior. 2. Os papéis: usuário, aplicativo, servidor de autorização e servidor de recursos. 3. O fluxo de código de autorização passo a passo, com os redirecionamentos e as chamadas reais, e o papel do PKCE. 4. O que o OpenID Connect acrescenta e a diferença entre token de acesso e token de identidade. 5. Por que os fluxos implícito e de senha deixaram de ser recomendados. Faça uma pergunta de verificação depois de cada parte e espere a minha resposta antes de continuar.
Os ataques que a autenticação precisa evitar
Explique os principais ataques contra a autenticação de uma aplicação web e como cada solução se comporta diante deles. Para cada ataque, descreva como ele acontece com um exemplo concreto e qual é a defesa: 1. Roubo de token por XSS, e a diferença entre guardar o token no localStorage e num cookie HttpOnly. 2. CSRF, e o papel do atributo SameSite e dos tokens anti-CSRF. 3. Fixação de sessão. 4. Token forjado por validação incompleta (algoritmo none, troca de algoritmo, segredo fraco). 5. Tentativas de senha em massa e preenchimento com senhas vazadas de outros sites. Depois, me descreva três configurações de login e pergunte quais desses ataques cada uma deixa aberta. Corrija as minhas respostas.