Limitación de Velocidad
Reglas
- Usa token bucket para los endpoints de API, ventana deslizante para las rutas de autenticación/inicio de sesión
- Identifica a los llamantes primero por clave de API, luego por IP — nunca solo IP para rutas autenticadas
- Devuelve
429 Too Many Requests con el encabezado Retry-After (segundos) y el encabezado X-RateLimit-Remaining
- Almacena los contadores en Redis (o Upstash para serverless) — nunca en memoria para despliegues multi-instancia
- Establece valores predeterminados sensibles: 100 req/min para API general, 5 req/min para autenticación, 1000 req/min para lecturas
- Usa
@upstash/ratelimit para serverless — maneja la atomicidad de Redis y la ventana deslizante de forma nativa
- Implementa la limitación de velocidad como middleware — aplícalo globalmente, anula por ruta con límites más estrictos
- Para Next.js: limita la velocidad en middleware.ts o en los manejadores de rutas de API, no en componentes de React
- Separa los límites por nivel: gratuito, profesional, empresarial — almacena el nivel en JWT o mediante búsqueda en base de datos
- Registra los aciertos de limitación de velocidad con la identidad del llamante — detecta patrones de abuso temprano
Patrones
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);
Qué Evitar
- Limitación de velocidad en memoria en configuraciones serverless o multi-instancia — el estado se pierde entre invocaciones
- Limitar la velocidad solo en la capa de aplicación — añade límites también en el CDN/edge (Cloudflare, Vercel)
- Bloquear usuarios legítimos con límites demasiado agresivos — comienza permisivo, ajusta según los datos
- Olvidar limitar la velocidad en webhooks y envíos de formularios públicos