Rate Limiting en JavaScript (Node.js): Guía completa de la biblioteca express-rate-limit

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Rate Limiting en JavaScript (Node.js): Protección de API con express-rate-limit

En el desarrollo web moderno, proteger las aplicaciones del servidor contra cargas excesivas y ataques maliciosos es una tarea críticamente importante. Uno de los mecanismos de protección más efectivos es el rate limiting (limitación de la frecuencia de solicitudes). Este enfoque permite controlar la cantidad de solicitudes que un cliente (dirección IP, usuario o sesión) puede enviar al servidor en un período de tiempo determinado. En el ecosistema de Node.js y Express, la biblioteca más popular y confiable para implementar rate limiting es express-rate-limit.



¿Qué es el rate limiting y por qué es necesario?

El rate limiting es una técnica utilizada para gestionar el tráfico en la red. Previene el abuso de los recursos del servidor, protegiendo contra:

  • Ataques DoS/DDoS — solicitudes masivas con el objetivo de dejar el servidor fuera de servicio.
  • Ataques de fuerza bruta — adivinación de contraseñas o tokens de acceso.
  • Web scraping — recolección automática de datos de un sitio web.
  • Uso excesivo de la API — cuando un cliente consume más recursos de los debidos.

Sin rate limiting, su aplicación puede volverse vulnerable e inestable, especialmente al crecer la base de usuarios.



La biblioteca express-rate-limit

express-rate-limit es un middleware para Express.js que proporciona una forma sencilla y flexible de limitar solicitudes. Se integra en la cadena de procesamiento de solicitudes y rastrea automáticamente el número de accesos de cada cliente. La biblioteca admite varios almacenes (en memoria, Redis, MongoDB y otros), lo que la hace escalable para sistemas distribuidos.



Instalación

Para empezar, instale la biblioteca a través de npm:

npm install express-rate-limit


Uso básico

El ejemplo más simple es limitar todas las rutas de la aplicación a 100 solicitudes por hora desde una misma dirección IP:

const rateLimit = require('express-rate-limit');const express = require('express');const app = express();

// Creamos el limitadorconst limiter = rateLimit({ windowMs: 60 * 60 * 1000, // 1 hora max: 100, // máximo 100 solicitudes message: 'Demasiadas solicitudes desde su IP. Por favor, inténtelo más tarde.', standardHeaders: true, // Devuelve los encabezados estándar RateLimit-* legacyHeaders: false, // Desactiva los encabezados X-RateLimit-*});

// Aplicamos a todas las rutasapp.use(limiter);

app.get('/', (req, res) => { res.send('Página principal');});

app.listen(3000, () => { console.log('Servidor iniciado en el puerto 3000');});


Configuración para diferentes rutas

A menudo se requiere un límite diferente para varios endpoints. Por ejemplo, para la ruta de inicio de sesión se puede establecer un límite más estricto:

const rateLimit = require('express-rate-limit');

// Límite estricto para /api/loginconst loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutos max: 5, // 5 intentos de inicio de sesión message: { error: 'Demasiados intentos de inicio de sesión. Intente de nuevo en 15 minutos.', retryAfter: 15 }, keyGenerator: (req) => { // Usamos IP + nombre de usuario para un bloqueo más preciso return req.ip + req.body.username; }});

app.post('/api/login', loginLimiter, (req, res) => { // Lógica de autenticación res.send('Inicio de sesión exitoso');});

// Límite suave para la API públicaconst apiLimiter = rateLimit({ windowMs: 60 * 1000, // 1 minuto max: 30, // 30 solicitudes por minuto message: 'Límite de solicitudes a la API excedido.'});

app.use('/api/', apiLimiter);


Funcionalidades avanzadas

Almacenes personalizados

Por defecto, los datos se almacenan en la memoria del proceso. Para producción, se recomienda

Recommendations