Pular para conteúdo

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

  1. Básico: Por que o JWT é chamado de "stateless"?
  2. Básico: Quais as 3 partes de um token JWT?
  3. Intermediário: O que aconteceria se alguém tentasse alterar o role dentro do payload do JWT? Por que a assinatura impede isso?
  4. Intermediário: Por que nunca devemos colocar a senha do usuário dentro do payload do JWT?
  5. 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.