Limite requests simultâneos usando um middleware
Explicação em um Parágrafo
A limitação de taxa deve ser implementada em seu aplicativo para proteger um aplicativo Node.js de ser sobrecarregado por muitas solicitações ao mesmo tempo. A limitação de taxa é uma tarefa que é melhor executada com um serviço projetado para essa tarefa, como o nginx, mas também é possível com o pacote rate-limiter-flexible ou com um middleware de aplicação, como express-rate-limiter para aplicações Express.js.
Exemplo de código: aplicativo Node.js puro com rate-limiter-flexible
const http = require('http');
const redis = require('redis');
const { RateLimiterRedis } = require('rate-limiter-flexible');
const redisClient = redis.createClient({
enable_offline_queue: false,
});
// Máximo de 20 requisições por segundo
const rateLimiter = new RateLimiterRedis({
storeClient: redisClient,
points: 20,
duration: 1,
blockDuration: 2, // bloqueia por 2 segundos se consumir mais de 20 pontos por segundo
});
http.createServer((req, res) => {
rateLimiter.consume(req.socket.remoteAddress)
.then((rateLimiterRes) => {
// Alguma lógica de aplicação aqui
res.writeHead(200);
res.end();
})
.catch(() => {
res.writeHead(429);
res.end('Too Many Requests');
});
}
}).listen(3000);
Você pode encontrar mais exemplos na documentação.
Exemplo de código: Express middleware de limitação de taxa para determinadas rotas
Usando o pacote do npm express-rate-limiter
var RateLimit = require('express-rate-limit');
// importante se por trás de um proxy para garantir que o IP do cliente seja passado para req.ip
app.enable('trust proxy');
var apiLimiter = new RateLimit({
windowMs: 15*60*1000, // 15 minutes
max: 100,
});
// aplicam-se apenas a requests iniciados por /user/
app.use('/user/', apiLimiter);
O que Outros Blogueiros Dizem
De NGINX blog:
A limitação de taxa pode ser usada para fins de segurança, por exemplo, para retardar ataques de adivinhação de senha de força bruta. Ele pode ajudar a proteger contra ataques DDoS, limitando a taxa de solicitação de entrada a um valor típico para usuários reais e (com logs) identificar os URLs segmentados. Mais geralmente, ele é usado para proteger servidores de aplicativos upstream de serem sobrecarregados por muitas solicitações do usuário ao mesmo tempo.