La limitación de velocidad es una estrategia que puede utilizar para controlar el tráfico en una red. Limita la cantidad de solicitudes que un usuario puede realizar dentro de un período de tiempo específico.
Existen varios algoritmos de limitación de velocidad, cada uno con sus propias compensaciones. Un método simple y popular es rastrear las direcciones IP de las solicitudes y verificar cuánto tiempo transcurre entre las solicitudes. Luego, el sistema puede rechazar una solicitud si su dirección IP excede la cantidad de solicitudes permitidas por el límite.
Este enfoque de limitación de velocidad es fácil de construir en una aplicación NodeJS-Express, con solo unos pocos pasos.
Paso 1: Configuración de un entorno de desarrollo
Primero, deberá crear e inicializar una aplicación Express.
Comience creando un directorio de proyecto ejecutando:
mkdir express-aplicación
Luego ingrese a ese directorio ejecutando:
discos compactos express-aplicación
A continuación, inicialice npm, el administrador de paquetes de nodos, y crear un paquete.json archivo en su aplicación ejecutando:
npm inicializar -y
los -y bandera creará su paquete.json archivo con todas las configuraciones predeterminadas.
A continuación, deberá instalar algunas dependencias. Las dependencias requeridas para este tutorial son:
- ExpressJS: ExpressJS es un marco NodeJS que proporciona un conjunto sólido de funciones para aplicaciones web y móviles. Simplifica el proceso de creación de aplicaciones backend con NodeJS.
- Límite de tasa expresa: Express rate limit es un middleware de limitación de velocidad para ExpressJS. Limita las solicitudes repetidas a API públicas y/o puntos finales, como restablecimientos de contraseña, inicios de sesión de usuarios, etc.
Instale las dependencias requeridas ejecutando:
npm Instalar en pc exprés exprés-tarifa-límite
Paso 2: Creación de una aplicación Express
Deberá crear un servidor Express básico que escuche las solicitudes que se realizan a su aplicación.
Primero, crea un índice.js archivo en el directorio raíz de su proyecto. Este será el archivo de entrada para su aplicación.
A continuación, agregue el siguiente código a su índice.js expediente:
// índice.js
constante expresar = requerir("Rápido");
constante aplicación = expreso();
constante puerto = proceso.env. PUERTO || 3000
app.escucha (puerto, () => {
consola.Iniciar sesión(`Aplicación ejecutándose en el puerto ${puerto}`);
});
Este código importa Rápido y crea una aplicación Express llamando a express() y almacenando su valor de retorno en el aplicación variable. Luego escucha el tráfico en el puerto 3000 llamando al escuchar método en el aplicación objeto.
Paso 3: Creación de controladores de ruta
A continuación, cree algunos controladores de ruta en los que pueda implementar la solución de limitación de velocidad.
Primero, cree una carpeta, rutas, en el directorio raíz de su proyecto ejecutando:
rutas mkdir
Crear un archivo, rutas.js, dentro de su carpeta de rutas y agregue el siguiente código:
constante expresar = requerir("Rápido");
constante enrutador = expreso. enrutador();enrutador.get("/", (requerido, res) => {
res.send({mensaje: "Hola, esta es una solicitud GET" });
});enrutador.post("/add-demo", (requerido, res) => {
res.status (201).send({mensaje: "Recurso creado con éxito" });
});enrutador.poner("/update-demo", (requerido, res) => {
res.status (201).send({mensaje: "Recurso actualizado correctamente" });
});
módulo.exportaciones = enrutador;
Este código importa Rápido, llama al enrutador método en Rápido, y almacena el valor en una variable, enrutador. los enrutador El método le permite crear manejadores de ruta modulares y montables. Puede crear controladores de ruta para un OBTENER solicitud de "/", a CORREO solicitud de "/add-demo”, y un PONER solicitud de "/update-demo”. Finalmente, exporte el enrutador variable.
A continuación, importe el enrutador variable en su índice.js expediente:
// índice.js
constante rutas = requerir("./rutas/rutas");
Luego, utilícelo como un middleware en su archivo index.js:
// índice.js
aplicaciónusar(rutas);
Asegúrese de colocar el bloque de código arriba antes del app.escuchar llamar.
Paso 4: Implementación de la limitación de velocidad
Primero, crea un “software intermedio” carpeta en el directorio raíz de su proyecto ejecutando:
mkdir software intermedio
Luego crea un archivo llamado “rate-limiter.js” dentro del directorio de middleware. Agregue el siguiente código a este archivo:
// rate-limiter.js
constante limitador de tasa = requerir("express-rate-limit");constante limitador = rateLimiter({
máx.: 5,
ventanaMS: 10000, // 10 segundos
mensaje: "Puedes'No hacer más solicitudes en este momento. Vuelva a intentarlo más tarde",
});
módulo.exportaciones = limitador
los limitador de tasa La función toma un objeto de configuración con las condiciones para limitar el número de solicitudes.
Las propiedades en el objeto de configuración anterior son:
- máximo: Esta propiedad siempre debe ser una número o una función que devuelve un número. Representa el número máximo de solicitudes que un usuario puede realizar dentro de un período de tiempo específico. Si esta propiedad no se establece en el objeto de configuración, el valor predeterminado es 5.
- windowsMS: Esta propiedad siempre debe ser un número. Representa el lapso de tiempo en el que se permiten varias solicitudes en milisegundos. Si esta propiedad no se establece en el objeto de configuración, el valor predeterminado es 60000 milisegundos (un minuto).
- mensaje: Esta propiedad puede ser una cuerda, un objeto JSON o cualquier otro valor compatible con Respuesta de Express.send método. Si esta propiedad no se establece en el objeto de configuración, el valor predeterminado es “Demasiadas solicitudes. Por favor, inténtelo de nuevo más tarde."
La función luego verificará si hay solicitudes repetidas a su aplicación. Si un usuario supera el límite (máximo, 5) dentro del plazo (ventanaMS, 10s), bloqueará la solicitud. También arrojará un error de "Demasiadas solicitudes" con un código de estado de 429.
Finalmente, importe la función de limitador en su índice.js y aplíquelo como un middleware global en su aplicación. Haga esto colocando app.use (limitador) por encima del middleware de rutas. Esto aplica la solución de limitación de velocidad a todas las rutas de su aplicación.
aplicaciónusar(limitador);
Rutas específicas de limitación de velocidad
También puede aplicar la limitación de velocidad a rutas específicas. Puede configurarlos por separado para rechazar solicitudes realizadas en un período de tiempo diferente, mostrar un mensaje diferente, etc.
Por ejemplo, suponga que está implementando una ruta de inicio de sesión de usuario en su aplicación. Es posible que deba agregar una configuración de limitación de velocidad para la ruta de inicio de sesión que difiera de la configuración utilizada por las otras rutas.
Primero, tendrás que eliminar limitador como un middleware de nivel de aplicación y aplicarlo porque no hay un sistema de filtro de middleware integrado en ExpressJS. Entonces, incluso si agrega una solución de limitación de velocidad específica a una ruta, el middleware global aún se ejecutará en esa ruta.
A continuación, cree una nueva configuración de limitación de velocidad en su rate-limiter.js archivo y exportarlo.
constante signInLimiter = rateLimiter({
máx: 3,
ventanaMS: 10000, //10 segundos
mensaje: "Demasiados intentos de inicio de sesión. Vuelva a intentarlo más tarde."
})
módulo.exportaciones = {
limitador,
signInLimiter
}
los signInLimiter objeto de configuración tiene un número diferente de máximo solicitudes y un mensaje de error diferente del limitador de velocidad general.
Por último, actualice su enrutador.js archivo con el bloque de código a continuación:
// enrutador.js
constante expresar = requerir("Rápido");
constante enrutador = expreso. enrutador();
constante {limitador, signInLimiter} = requerir(../middleware/limitador de velocidad")enrutador.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({mensaje: "Hola, esta es una solicitud GET" });
});enrutadorusar(limitador)
enrutador.post("/post", (requerido, res) => {
res.status (201).send({mensaje: "Recurso creado con éxito" });
});enrutador.poner("/put", (requerido, res) => {
res.status (201).send({mensaje: "Recurso actualizado correctamente" });
});
módulo.exportaciones = enrutador;
En el bloque de código anterior, importó limitador y signInLimiter. Entonces aplicaste signInLimiter como un limitador de velocidad específico a la “/sign-in" ruta.
Finalmente, colocando router.use (limitador) sobre el resto de las rutas, aplicó limiter como limitador de velocidad para el resto de las rutas.
La importancia de la limitación de velocidad
La limitación de velocidad reduce la tensión en su servidor web al evitar tener que procesar demasiadas solicitudes a la vez. Reduce la actividad de los bots, lo protege de los ataques de denegación de servicio (DoS) y previene los ataques de fuerza bruta.