Limitação de Taxa
Regras
- Use token bucket para endpoints de API, sliding window para rotas de autenticação/login
- Identifique chamadores pela chave de API primeiro, com fallback para IP — nunca use apenas IP para rotas autenticadas
- Retorne
429 Too Many Requests com cabeçalho Retry-After (segundos) e X-RateLimit-Remaining
- Armazene contadores no Redis (ou Upstash para serverless) — nunca em memória para implantações multi-instância
- Defina padrões sensatos: 100 req/min para API geral, 5 req/min para autenticação, 1000 req/min para leituras
- Use
@upstash/ratelimit para serverless — ele lida com atomicidade do Redis e sliding window nativamente
- Implemente rate limiting como middleware — aplique globalmente, sobrescreva por rota com limites mais rigorosos
- Para Next.js: faça rate limiting em middleware.ts ou manipuladores de rota da API, não em componentes React
- Separe limites por camada: free, pro, enterprise — armazene a camada no JWT ou em consulta ao banco de dados
- Registre hits de rate limit com a identidade do chamador — detecte padrões de abuso cedo
Padrões
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
analytics: true,
});
const { success, limit, remaining, reset } = await ratelimit.limit(identifier);
Evite
- Rate limiting em memória em configurações serverless ou multi-instância — o estado é perdido entre invocações
- Rate limiting apenas na camada de aplicação — adicione limites na CDN/edge também (Cloudflare, Vercel)
- Bloquear usuários legítimos com limites excessivamente agressivos — comece permissivo, aperte com base em dados
- Esquecer de limitar webhooks e envios de formulários públicos