‫Instructor: En esta lección, implementemos la limitación de
‫velocidad para evitar que la
‫misma IP realice demasiadas solicitudes a nuestra API
‫y eso nos ayudará a prevenir ataques
‫como denegación de servicio o ataques de fuerza bruta.
‫Entonces, ese limitador de velocidad se implementará
‫como una función de middleware global.
‫Entonces, básicamente, lo que va a hacer el limitador
‫de velocidad es contar la cantidad de solicitudes provenientes de una
‫IP y luego, cuando
‫hay demasiadas solicitudes, bloquear estas solicitudes, ¿de acuerdo?
‫Entonces tiene sentido implementar eso en un middleware
‫global, entonces, lo hacemos en la aplicación. js.
‫Entonces, no hemos usado este en mucho tiempo, y
‫el limitador de velocidad que
‫vamos a usar es un paquete npm llamado Express Rate Limit.
‫Así que instalemos eso.
‫npm i express-rate-limit, de acuerdo.
‫Y luego, aquí en la parte superior de
‫nuestra aplicación, llamémoslo rateLimit y luego requerimos el expreso y
‫en realidad ya está aquí. Entonces, el código VS toma este
‫nombre de nuestro paquete. json archivo.
‫De acuerdo, y este nombre que
‫le di aquí generalmente proviene de la documentación.
‫Entonces, si lo hacen así en la
‫documentación, bueno, entonces esa es la forma que yo sigo también.
‫Bien, ahora usemos este middleware
‫aquí en la parte superior de nuestros middlewares globales,
‫escribamos eso aquí, global.
‫Y empezamos creando un limitador.
‫Entonces limitador, y lo hacemos llamando
‫a la función rateLimit que acabamos de definir allí.
‫Entonces, rateLimit es una función que
‫recibe un objeto de opciones, ¿de acuerdo?
‫Y aquí, básicamente, podemos
‫definir cuántas solicitudes por IP vamos a permitir
‫en un cierto período de tiempo.
‫Entonces podemos especificar la propiedad max, que voy
‫a establecer en 100, y luego también la ventana, entonces
‫la ventana de tiempo, ¿de acuerdo?
‫Entonces, lo que quiero permitir aquí es
‫básicamente, 100 solicitudes por hora.
‫Y esto aquí en realidad se llama milisegundos de ventana.
‫De acuerdo, entonces queremos una hora, es
‫decir, 60 minutos, por 60 por segundos, por 1,000 por milisegundos.
‫Muy bien, de nuevo, lo que
‫hará es permitir 100 solicitudes de la misma IP en una hora.
‫De acuerdo, y si ese límite
‫es cruzado por una determinada IP, recibirán un mensaje de error.
‫Y aquí ahora podemos especificar ese mensaje.
‫Demasiadas solicitudes de esta IP, inténtelo de
‫nuevo en una hora, de acuerdo, así que necesitamos encontrar
‫un equilibrio que
‫funcione mejor para nuestra aplicación.
‫Por ejemplo, si está creando
‫una API, que realmente necesita muchas solicitudes para una IP, entonces,
‫por supuesto, este número aquí debería ser mayor.
‫Así que no sigas ciegamente lo que acabo de
‫poner aquí, sino adáptalo a tu propia aplicación
‫para que no lo
‫inutilice debido a este limitador, ¿de acuerdo?
‫De todos modos, este limitador que acabamos de crear es
‫básicamente una función de middleware, ¿de acuerdo?
‫Entonces, rateLimit es una función que, basada
‫en nuestros objetos, creará una función de middleware, que
‫ahora podemos usar usando app. Úselo como lo hicimos antes.
‫Y podemos hacerlo simplemente así.
‫Pero lo que realmente queremos es
‫básicamente limitar el acceso a nuestra ruta API.
‫Entonces, podemos especificar eso
‫aquí, recuerde que podemos hacer eso con middleware.
‫Entonces, básicamente queremos aplicar este limitador solo a
‫una API de barra, ¿de acuerdo?
‫Y eso afectará a todas las
‫rutas que básicamente comienzan con esto, su aplicación, así
‫que la API de barra diagonal, genial.
‫Así que volvamos a nuestra pestaña principal aquí.
‫Guárdelo, y ahora intentemos esto y hagámoslo aquí con
‫el más simple, así
‫que obtenga todos los recorridos, luego aquí está nuestro resultado y
‫ahora lo que quiero mostrarles son estos encabezados aquí.
‫Entonces, nuestro limitador de velocidad crea
‫estos dos encabezados para que RateLimit-Limit y RateLimit-Remaining, ¿de acuerdo?
‫Entonces comenzamos con 100 tal como lo
‫definimos, y ahora nos
‫queda 99, porque ya hicimos una solicitud, ¿verdad?
‫Entonces, ¿qué pasa si hacemos otro?
‫Hagámoslo con Get Tour, por ejemplo, y no
‫hay tour con ese ID,
‫pero eso no importa, lo que importa
‫aquí es que el resto ahora se ha reducido a 98.
‫Y si lo intentamos de
‫nuevo, verá que ha bajado aún más a 97, ¿de acuerdo?
‫Y de hecho aquí abajo, también tenemos el reinicio.
‫Entonces, básicamente, la marca de tiempo donde se restablece, ¿está bien?
‫Entonces esa ventana de una hora que especificamos antes.
‫Bien, ahora, si entre esto, nuestra aplicación se reinicia, así
‫que para hacer eso, simplemente guardaré.
‫Veamos qué pasa entonces, está bien, así que lo enviaré
‫de nuevo, y ahora estamos
‫de regreso comenzando desde el principio básicamente.
‫De acuerdo, nuestra aplicación no puede fallar durante este tiempo
‫porque, de lo contrario,
‫eso básicamente restablecerá el límite también, ¿de acuerdo?
‫Ahora, intentemos ver el mensaje de error,
‫así que reduciré este máximo a solo tres, ¿de acuerdo?
‫Y guárdelo aquí, envíe esta solicitud, y en nuestros encabezados ahora
‫vemos que
‫solo nos quedan dos, probemos con otro y ahora
‫queda cero, así que este probablemente fue el
‫último, veamos el cuerpo, así que esta
‫vez, todavía tengo datos, pero
‫si ahora lo intentamos de nuevo, obtendremos un error.
‫Muchas solicitudes de esta IP.
‫Y luego establecerá automáticamente
‫el código de estado en 429, lo que significa demasiadas solicitudes.
‫De acuerdo, y nuevamente, esto nos ayudará a tratar
‫de prevenir la denegación de servicio y también los ataques de fuerza
‫bruta donde un atacante intenta
‫adivinar la contraseña de algún usuario, básicamente
‫usando como su nombre lo dice, fuerza bruta.
‫Bien, eso es una limitación de API,
‫bastante sencillo de implementar con este
‫paquete Express Rate Limit.