Aula 09 - Segurança e Autenticação com JWT 🔐
Objetivo
Objetivo: Entender os conceitos de Autenticação e Autorização, aprender como funciona o padrão JWT (JSON Web Token) e como implementar um login seguro e sem estado (stateless).
1. Autenticação vs Autorização 🚦
Embora pareçam iguais, são processos diferentes: * Autenticação: "Quem é você?" (Validar e-mail e senha). * Autorização: "O que você pode fazer?" (Checar se você tem permissão de Admin, por exemplo).
2. O Problema das Sessões (Stateful) 🍪
Antigamente, o servidor guardava uma "sessão" na memória para cada usuário logado. * Problema: Se você tivesse 1 milhão de usuários, a memória do servidor estourava. * Problema 2: Se você tivesse dois servidores, o segundo não conheceria a sessão guardada no primeiro.
3. A Solução: JWT (Stateless) 🎫
O JWT (JSON Web Token) é como um "crachá digital". O servidor não guarda nada na memória. Ele entrega o crachá assinado para o usuário, e o usuário deve apresentar esse crachá em todas as próximas requisições.
Estrutura do JWT:
O token é composto por 3 partes separadas por pontos (.):
1. Header: Tipo do token e algoritmo de criptografia.
2. Payload: Os dados do usuário (ex: id, nome, permissões). Atenção: Não guarde senhas aqui, pois o payload é apenas codificado, não encriptado!
3. Signature: A "assinatura digital" que garante que o token não foi alterado.
4. O Fluxo do Login 🌊
- Cliente envia e-mail e senha.
- Servidor valida os dados no banco.
- Servidor gera um JWT usando uma "Chave Secreta" e envia para o cliente.
- Cliente armazena o token (geralmente no
localStorage). - Cliente envia o token no header
Authorizationem todas as rotas protegidas.
Fluxo de Login JWT (Mermaid)
sequenceDiagram
participant C as Cliente/App
participant S as Servidor/API
participant DB as Banco de Dados
C->>S: POST /login (email, senha)
S->>DB: Buscar usuário
DB-->>S: Usuário encontrado
S->>S: Assinar JWT (Secret)
S-->>C: Retorna Token (Crachá)
C->>S: GET /perfil (Header: Authorization: Bearer JWT)
S->>S: Validar Assinatura
S-->>C: Dados do Perfil
5. Implementando no Backend ⚡
Usamos bibliotecas como jsonwebtoken para assinar e validar os tokens.
// Gerando o token
const token = jwt.sign({ id: user.id }, 'CHAVE_SUPER_SECRETA', { expiresIn: '1d' });
🔒 Onde armazenar o JWT no Frontend?
No desenvolvimento Web, temos duas opções principais para guardar o token: * LocalStorage: Fácil de usar, mas vulnerável a ataques XSS (Cross-Site Scripting). * Cookies (HttpOnly): Mais seguros, pois o Javascript não consegue lê-los, protegendo contra roubo de token via script malicioso. Nunca guarde o JWT em texto simples ou em locais sem proteção de segurança mínima!
Verificando Token no Terminal
6. Mini-Projeto: Gerador de Tokens 🛠️
- Crie uma função
login(email, senha). - Se o e-mail for "admin@teste.com" e a senha "123456", gere um JWT com o payload
{ role: 'admin' }. - Defina que esse token deve expirar em apenas 1 hora (
1h).
7. Exercício de Fixação 🧠
- Por que o JWT é chamado de "Stateless" (Sem estado)?
- O que acontece se uma pessoa mal-intencionada mudar o
rolede 'user' para 'admin' dentro do Payload do JWT? Por que a assinatura (Signature) impede isso? - Qual o perigo de usar uma "Chave Secreta" muito Curta ou óbvia (ex: "123")?
Próxima Aula: Como proteger rotas específicas? Controle de Acesso (RBAC) e Permissões 🛡️