Limitar APIs: Algoritmos e Implementaciones

Security2026-09-20TryQuickToolBox

Tu API está bajo ataque. No por hackers sofisticados, sino por un simple script que golpea tus endpoints miles de veces por segundo, consumiendo recursos y degradando el servicio para usuarios legítimos. Sin limitación de tasa, un solo cliente con comportamiento incorrecto puede derribar toda tu aplicación. Esta guía explica los algoritmos principales y muestra implementaciones prácticas en Node.js y Nginx para proteger tu API.

Por qué es importante la limitación de tasa

La limitación de tasa controla cuántas solicitudes puede hacer un cliente en una ventana de tiempo determinada. Es tu primera línea de defensa contra:

Más allá de la seguridad, la limitación de tasa asegura un uso justo y te ayuda a hacer cumplir reglas de negocio, como planes de precios escalonados.

Algoritmos de limitación de tasa

Cuatro algoritmos dominan la limitación de tasa en APIs. Cada uno tiene ventajas y desventajas en precisión, uso de memoria y manejo de ráfagas.

1. Ventana fija

Cuenta las solicitudes en intervalos de tiempo fijos (por ejemplo, 100 solicitudes por minuto). Cuando la ventana se reinicia, el contador se reinicia.

2. Ventana deslizante

Registra las marcas de tiempo de cada solicitud y cuenta cuántas caen dentro de los últimos N segundos. Esto suaviza las ráfagas.

3. Token bucket

Un bucket contiene tokens. Los tokens se añaden a una tasa fija. Cada solicitud consume un token. Si el bucket está vacío, la solicitud se deniega.

4. Leaky bucket

Las solicitudes entran en una cola (bucket) y se procesan a una tasa constante. Si la cola está llena, las solicitudes se descartan.

AlgoritmoManejo de ráfagasMemoriaCaso de uso
Ventana fijaPobreBajaAPIs simples
Ventana deslizanteBuenaMediaPropósito general
Token bucketExcelenteMediaAPIs con tolerancia a ráfagas
Leaky bucketNingunoMediaSuavizar tráfico

Implementar limitación de tasa en Node.js

Implementaremos un limitador de tasa token bucket usando Express y Redis para estado distribuido. Redis es esencial cuando tienes múltiples instancias de servidor.

Paso 1: Instalar dependencias

npm install express redis

Paso 2: Crear el middleware del limitador de tasa

const redis = require('redis');
const client = redis.createClient();

async function tokenBucketLimiter(req, res, next) {
  const key = `rate_limit:${req.ip}`;
  const capacity = 10; // max tokens
  const refillRate = 1; // tokens per second

  const now = Date.now();
  const data = await client.hGetAll(key);
  let tokens = data.tokens ? parseFloat(data.tokens) : capacity;
  let lastRefill = data.lastRefill ? parseInt(data.lastRefill) : now;

  // Refill tokens based on elapsed time
  const elapsed = (now - lastRefill) / 1000;
  tokens = Math.min(capacity, tokens + elapsed * refillRate);

  if (tokens < 1) {
    return res.status(429).json({ error: 'Too many requests' });
  }

  tokens -= 1;
  await client.hSet(key, {
    tokens: tokens.toString(),
    lastRefill: now.toString()
  });
  await client.expire(key, 60); // auto-cleanup

  next();
}

app.use(tokenBucketLimiter);

Este middleware verifica y actualiza el conteo de tokens atómicamente. Para producción, usa transacciones de Redis o scripts Lua para evitar condiciones de carrera.

Implementar limitación de tasa en Nginx

Nginx ofrece limitación de tasa integrada con el módulo limit_req. Utiliza un algoritmo leaky bucket.

Paso 1: Definir una zona de límite de tasa

En el bloque http de nginx.conf:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

Esto crea una zona de 10MB llamada api que permite 10 solicitudes por segundo por IP.

Paso 2: Aplicar el límite

En tu bloque location:

location /api/ {
    limit_req zone=api burst=20 nodelay;
    proxy_pass http://backend;
}

burst=20 permite ráfagas cortas de hasta 20 solicitudes. nodelay procesa las solicitudes en ráfaga inmediatamente en lugar de ponerlas en cola.

Mejores prácticas para la limitación de tasa en APIs

Preguntas frecuentes

¿Cuál es la diferencia entre limitación de tasa y throttling?

La limitación de tasa bloquea las solicitudes que superan un umbral, mientras que el throttling las ralentiza (por ejemplo, mediante colas o retrasos). La limitación de tasa es binaria; el throttling es gradual.

¿Qué algoritmo de limitación de tasa debería usar?

Para la mayoría de las APIs, token bucket ofrece un buen equilibrio: permite ráfagas pero aplica una tasa promedio. Si necesitas un suavizado estricto, usa leaky bucket. Por simplicidad, la ventana fija funciona para APIs de bajo tráfico.

¿Cómo manejo la limitación de tasa para usuarios autenticados vs. anónimos?

Aplica límites más estrictos a usuarios anónimos (por ejemplo, por IP) y límites más generosos a usuarios autenticados (por ejemplo, por clave de API). También puedes implementar límites escalonados según planes de suscripción.

¿Listo para analizar el tráfico de tu API? Usa nuestro Analizador de Logs de Nginx para parsear logs, detectar violaciones de límites de tasa y optimizar tus umbrales.