Rate limiting em Node.js: como proteger suas APIs contra sobrecarga e abusos sem afetar a UX
Sem limite de requisições, um script mal-intencionado (ou um bug no seu próprio app) derruba a API. Veja como aplicar rate limit no Node.js sem bloquear clientes legítimos.
Por Equipe We Codex3 min de leitura
Toda API pública vai, cedo ou tarde, receber mais requisições do que deveria. Às vezes é um ataque. Muitas vezes é um app com bug fazendo a mesma chamada em loop, ou um parceiro integrando sem cache. Sem rate limiting, a consequência é a mesma: servidor sobrecarregado, banco no limite e todos os clientes sofrendo por causa de um só.
O que é rate limiting
É definir quantas requisições um mesmo cliente pode fazer num intervalo de tempo — por exemplo, 100 por minuto por IP, ou 5 tentativas de login a cada 15 minutos. Passou do limite, a API responde 429 Too Many Requests em vez de processar.
O básico no Express
import rateLimit from 'express-rate-limit'
export const apiLimiter = rateLimit({
windowMs: 60_000, // 1 minuto
limit: 100, // requisições por janela
standardHeaders: 'draft-7',
legacyHeaders: false,
})
app.use('/api/', apiLimiter)Isso já protege bastante. Mas um único limite global raramente é o certo.
Limites diferentes para riscos diferentes
- Login e recuperação de senha: limites baixos, por IP e por conta. É a principal defesa contra força bruta (Ataques de força bruta no login: bloqueio progressivo sem punir o usuário honesto).
- Rotas de leitura: limites generosos; derrubar quem só está navegando prejudica a UX.
- Rotas caras (relatórios, exportações, chamadas a IA): limites por usuário autenticado, não por IP.
- Webhooks de parceiros: listas de permissão em vez de limite cego.
Os erros que mais vemos
- Limitar por IP atrás de proxy ou CDN sem configurar
trust proxy— todo mundo vira o mesmo IP e o limite bloqueia a empresa inteira. - Guardar contadores em memória com vários servidores: cada instância conta sozinha e o limite real vira 3x, 5x o planejado. A solução distribuída está em Rate limit distribuído com Redis: quando um servidor não basta.
- Responder 429 sem o cabeçalho
Retry-After, deixando o cliente sem saber quando tentar de novo.
O outro lado: a experiência de quem recebe o 429
Bloquear é metade do trabalho. A outra metade é o app reagir com elegância: mensagem clara, botão desabilitado com contagem regressiva e retentativa inteligente. Mostramos isso em Gerenciando o erro 429 Too Many Requests: exponential backoff e retry no cliente e, para apps, em Erro 429 no app: como avisar o usuário e tentar de novo sem travar.
Na We Codex, rate limit faz parte do pacote de Segurança Anti-Hacker de todo sistema que entregamos. Se a sua API ainda está exposta, fale com a gente.
- Node.js
- Rate Limit
- APIs
- Segurança
Resolver de vez, com quem faz isso todo dia
Quer saber quão exposto está o seu sistema hoje?
Este artigo mostra o caminho. A implementação sob medida — o detalhe que muda o resultado no seu caso — é o trabalho da We Codex, empresa de engenharia do grupo Wocom.
Continue lendo
Tudo sobre Segurança- Ler artigo
Segurança3 min
Ataques de força bruta no login: bloqueio progressivo sem punir o usuário honesto
Robôs testam milhares de senhas por hora na sua tela de login. Veja como bloquear ataques de força bruta sem trancar do lado de fora o cliente que só esqueceu a senha.
- Ler artigo
Segurança3 min
Rate limit distribuído com Redis: quando um servidor não basta
Com vários servidores, cada um conta as requisições sozinho e o limite real vira o dobro ou o triplo. Como fazer rate limiting distribuído com Redis.
- Ler artigo
Segurança3 min
Gerenciando o erro 429 Too Many Requests: exponential backoff e retry no cliente
Seu app recebe 429 e responde tentando de novo imediatamente — piorando tudo. Veja como implementar exponential backoff com jitter e dar um feedback decente ao usuário.