Pular para conteúdo

Solução 11 - Refresh Token e Segurança Avançada 🏗️

Navegação

← Exercício 11 | Próxima Solução →

🟢 Respostas Fáceis

1. Access Tokens de Vida Curta

Resposta 1

Por que Access Tokens têm vida curta (15min-1h):

- **Limitação de danos**: Se comprometido, expira rapidamente
- **Redução de superfície de ataque**: Menos tempo para ser explorado
- **Facilita revogação**: Usuário fica "deslogado" naturalmente
- **Melhor auditoria**: Força re-validação frequente

```javascript
// ✅ Estratégia típica
const accessToken = jwt.sign(payload, secret, { expiresIn: '15m' });  // Curto
const refreshToken = jwt.sign(payload, secret, { expiresIn: '7d' });  // Longo
```

2. Biblioteca Helmet

Resposta 2

Helmet.js - Segurança de Headers HTTP:

```javascript
const helmet = require('helmet');
app.use(helmet());

// Remove headers que expõem informações
// X-Powered-By: Express → (removido)
// Server: nginx/1.18.0 → (ocultado)
// Adiciona headers de segurança automáticos
```

🟡 Respostas Médias

3. CORS - Segurança do Navegador

Resposta 3

CORS é proteção do BROWSER, não do servidor:

```bash
# ✅ cURL funciona SEM CORS
curl -X GET https://api.exemplo.com/dados
# → 200 OK (servidor responde normalmente)

# ❌ Browser bloqueia SEM CORS
fetch('https://api.exemplo.com/dados')
# → CORS error (browser bloqueia a resposta)
```

**Servidor sempre processa** - browser que decide mostrar ou não.

4. Fluxo 401 + Refresh Token

Resposta 4

mermaid sequenceDiagram Frontend->>API: GET /data (token expirado) API-->>Frontend: 401 Token expirado Frontend->>Auth: POST /refresh (refresh token) Auth-->>Frontend: Novo access token Frontend->>API: GET /data (novo token) API-->>Frontend: 200 OK + dados

5. Headers Sensíveis (Helmet)

Resposta 5

3 Informações que Helmet oculta:

1. **X-Powered-By**: Express.js versão específica
2. **Server**: Tecnologia e versão do servidor
3. **X-Sourcemap**: Localização dos source maps

🔴 Resposta Desafio

6. Segurança do Refresh Token

Resposta 6

Por que Refresh Token é mais seguro:

- **Escopo limitado**: Só serve para renovar tokens
- **Armazenamento seguro**: httpOnly cookies
- **Rotation**: Muda a cada uso
- **Revogação**: Pode ser invalidado no servidor

**Armazenamento: Cookies httpOnly** vs LocalStorage
- ✅ Cookies: XSS não consegue acessar
- ❌ LocalStorage: JS pode ler (vulnerável a XSS)

**Refresh Token Rotation:**
```javascript
// A cada refresh, gerar novo refresh token
app.post('/refresh', (req, res) => {
    const oldRefresh = req.cookies.refreshToken;

    // Invalidar token antigo
    await blacklistToken(oldRefresh);

    // Gerar novo par
    const newAccessToken = generateAccessToken(user);
    const newRefreshToken = generateRefreshToken(user);

    res.cookie('refreshToken', newRefreshToken, { httpOnly: true });
    res.json({ accessToken: newAccessToken });
});
```

!!! tip "Dicas para Próximos Estudos" - Implemente Token Blacklisting para logout seguro - Configure CSP Headers para proteção XSS - Use HSTS para forçar HTTPS

Navegação

← Exercício 11 | Próxima Solução →