Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 42 – API JavaScript, Node.js e Express – Rate Limiting – express-rate-limit

Imagem destacada da aula de API

Introdução (3 min)

Imagine um restaurante popular durante o horário de almoço. Se todos os clientes chegarem ao mesmo tempo, a cozinha ficará sobrecarregada, o serviço diminuirá e a experiência de todos será prejudicada. O Rate Limiting em APIs funciona de forma semelhante: controla o fluxo de solicitações para proteger o servidor de sobrecargas, garantindo disponibilidade e desempenho consistente para todos os usuários.

Em APIs modernas, o Rate Limiting é absolutamente essencial para prevenir ataques de negação de serviço (DoS), gerenciar recursos limitados e proporcionar uma experiência justa para todos. Nesta aula, você aprenderá a implementar Rate Limiting em suas APIs Express usando o middleware express-rate-limit.

Dentro do ecossistema Node.js/Express, o express-rate-limit se integra perfeitamente ao pipeline de requisições, interceptando-as antes que cheguem às suas rotas e aplicando as regras de limitação definidas.

Conceito Fundamental (7 min)

Rate Limiting, ou limitação de taxa, é uma técnica fundamental que restringe o número de solicitações que um cliente pode fazer a um servidor dentro de um período específico. Essa prática visa preservar a estabilidade e a segurança da API. Termos como “janela de tempo”, “limite de requisições” e “bucket” são frequentes nesse contexto. A “janela de tempo” define o período durante o qual o limite de requisições é aplicado, enquanto o “bucket” representa o contador de requisições para cada cliente.

Em cenários reais, o Rate Limiting é usado por gigantes da tecnologia como Google, Facebook e Twitter para proteger suas infraestruturas de abusos. Imagine um sistema de login: o Rate Limiting impede tentativas excessivas de login, mitigando ataques de força bruta. Essa prática se integra a firewalls, balanceadores de carga e caches para otimizar a performance e a segurança da aplicação.

Implementar Rate Limiting oferece inúmeras vantagens: previne o esgotamento de recursos, protege contra ataques DoS, garante a disponibilidade da API e melhora a experiência geral do usuário. A principal desvantagem reside na possível frustração de usuários legítimos que excedem o limite, o que requer configurações cuidadosas e mensagens de erro informativas.

Implementação Prática (10 min)

const express = require('express');
const rateLimit = require('express-rate-limit');

const app = express(); const port = 3000;

// Configurações específicas para HostGator Plano M (ajuste conforme necessário) const limiter = rateLimit({ windowMs: 15 60 1000, // Janela de 15 minutos max: 100, // Limite de 100 requisições por janela standardHeaders: true, // Retorna os headers padrão do Rate Limit legacyHeaders: false, // Desativa os headers antigos para maior clareza message: { status: 429, // Código de status HTTP para "Too Many Requests" message: "Muitas requisições. Por favor, tente novamente mais tarde." }, handler: (req, res, next, options) => { // Manipulador de erro customizado console.error("Rate limit excedido:", options.message); res.status(options.message.status).json(options.message); }

});

app.use('/api', limiter); // Aplica o limitador a todas as rotas /api

app.get('/api/users', (req, res) => { res.json([{ id: 1, nome: 'João' }, { id: 2, nome: 'Maria' }]); });

// Rota para testar o Rate Limiting app.get('/api/test', (req, res) => { res.send('Teste de Rate Limiting'); });

app.listen(port, () => { console.log(Servidor rodando em http://localhost:${port}); });

npm install express express-rate-limit
node index.js

Exercício Hands-On (5 min)

Desafio: Implemente Rate Limiting para a rota /api/produtos, permitindo apenas 50 requisições a cada 5 minutos.

Solução:

  • Crie um novo limitador com as configurações desejadas:
const productLimiter = rateLimit({
  windowMs: 5  60  1000,
  max: 50,
  message: { status: 429, message: "Limite de requisições excedido para /api/produtos." }
});

  • Aplique o limitador à rota /api/produtos:
app.use('/api/produtos', productLimiter);

  • Crie a rota /api/produtos:
app.get('/api/produtos', (req, res) => {
  res.json([{id:1, nome:"Camiseta"}, {id:2, nome:"Calça"}]);
});

Teste: Faça várias requisições rápidas para /api/produtos usando uma ferramenta como curl ou Postman. Após exceder o limite, você receberá a mensagem de erro configurada.

Troubleshooting: Verifique se o express-rate-limit está instalado corretamente e se as configurações do limitador estão sendo aplicadas à rota correta. Analise os logs do console para identificar possíveis problemas.

Próximos Passos: Explore configurações avançadas do express-rate-limit, como skip, keyGenerator e store, para personalizar ainda mais o comportamento do Rate Limiting.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas