Aula 14 - JWT e Proteção de Endpoints 🎫
Como manter um usuário "logado" em uma API stateless, sem o servidor guardar sessões em memória? A resposta é o JWT — vamos implementá-lo nesta aula.
😊 O Problema das Sessões Tradicionais
Antigamente, o servidor guardava uma "sessão" na memória para cada usuário logado. Isso não escala bem: com milhões de usuários, ou múltiplos servidores, o modelo quebra.
😊 A Solução: JWT (Stateless)
O JWT (JSON Web Token) é como um "crachá digital" assinado. O servidor não guarda nada — ele entrega o token, e o cliente o reapresenta em cada requisição.
Estrutura do JWT
Três partes separadas por pontos (.): 1. Header: algoritmo de assinatura usado. 2. Payload: dados do usuário (id, roles) — apenas codificado, não cifrado! 3. Signature: garante que o token não foi alterado.
📊 O Fluxo Completo de Autenticação com JWT
sequenceDiagram
participant C as Cliente
participant API as API Spring Boot
C->>API: POST /login (email, senha)
API->>API: Valida credenciais + gera JWT
API-->>C: Token JWT
C->>API: GET /produtos (Header Authorization: Bearer <token>)
API->>API: Valida assinatura do token
API-->>C: Dados protegidos 🧠 Gerando e Validando o Token
String token = Jwts.builder()
.setSubject(usuario.getEmail())
.claim("role", usuario.getRole())
.setExpiration(new Date(System.currentTimeMillis() + 3600_000)) // 1 hora
.signWith(SignatureAlgorithm.HS256, CHAVE_SECRETA)
.compact();
Caution
O payload do JWT não é secreto — qualquer um pode decodificá-lo e ler. Nunca coloque senhas ou dados sensíveis dentro do token.
🧠 Protegendo Endpoints com o Filtro JWT
O Spring Security intercepta cada requisição, extrai o token do header Authorization, valida a assinatura, e — se válido — autentica o usuário para aquela requisição.
📝 Exercícios Progressivos
- Básico: Por que o JWT é chamado de "stateless"?
- Básico: Quais as 3 partes de um token JWT?
- Intermediário: O que aconteceria se alguém tentasse alterar o
roledentro do payload do JWT? Por que a assinatura impede isso? - Intermediário: Por que nunca devemos colocar a senha do usuário dentro do payload do JWT?
- Desafio: Pesquise o que é um Refresh Token e por que ele complementa o Access Token de vida curta.
🚀 Mini-projeto: Implemente um endpoint POST /login que gera um JWT, e configure o Spring Security para exigir esse token em todos os endpoints de /produtos, exceto o de listagem pública.