Estrangulamiento/Throttling para limitar peticiones de los clientes
Índice de contenido
- ¿Qué es el throttling en Laravel y para qué sirve?
- Por qué limitar las solicitudes mejora el rendimiento y la seguridad
- Cómo usar el middleware ThrottleRequests en tus rutas
- Entendiendo los parámetros (60,1)
- Qué ocurre cuando se supera el límite (errores 419 y 429)
- Límite por usuario, IP o plan de suscripción
- Integrar throttling con RouteServiceProvider
- Buenas prácticas y errores comunes
- Conclusión
- Preguntas frecuentes (FAQ)
Aprenderemos a limpiar la cantidad de solicitudes que puede realizar un cliente y no solo guardar cache de resultados en Laravel, lo cual, es particularmente útil para una Rest API, al momento de realizar consultas a la misma o nuestra aplicación web, con esto, podemos garantizar que no existan abusos en los cuales un usuario pueda realizar múltiples solicitudes en un cortó periodo de tiempo, por ejemplo:
Route::middleware('throttle:60,1')->group(function () {
// Your routes Here
});Con el código anterior, estamos indicando mediante el parámetro 60 y 1 que en un plazo de 1 minuto el usuario puede enviar 60 peticiones.
¿Qué es el throttling en Laravel y para qué sirve?
Cuando hablamos de throttling en Laravel, nos referimos al proceso de limitar el número de peticiones que un cliente puede realizar en un periodo de tiempo determinado.
Es una medida de control que evita abusos, protege recursos y mejora la estabilidad de tu aplicación.
En mi caso, aprendí que controlar las solicitudes no es solo cuestión de seguridad: también mejora la experiencia del usuario final, evitando bloqueos o caídas por exceso de tráfico.
Laravel simplifica esta tarea gracias a su middleware integrado ThrottleRequests, el cual permite definir fácilmente cuántas peticiones se permiten y cada cuánto tiempo.
Por qué limitar las solicitudes mejora el rendimiento y la seguridad
Usar rate limiting es una práctica esencial en APIs modernas.
Reduce el riesgo de ataques por fuerza bruta, bots o usuarios que intentan saturar tus recursos.
Cuando probé este middleware en una rifa online, noté que algunos usuarios intentaban enviar peticiones automáticas para aumentar sus posibilidades de ganar.
Con solo aplicar un límite de peticiones, el sistema se estabilizó y el servidor dejó de recibir tráfico abusivo.
Además, si ofreces planes de pago o servicios por suscripción, puedes asignar límites diferentes según el plan contratado, manteniendo la equidad entre usuarios.
Cómo usar el middleware ThrottleRequests en tus rutas
Laravel te permite aplicar el middleware directamente en tus rutas.
Por ejemplo:
Route::middleware('throttle:60,1')->group(function () {
// Tus rutas protegidas aquí
});Con este código indicamos que un usuario puede realizar hasta 60 peticiones por minuto.
Este valor suele ser suficiente para la mayoría de APIs estándar.
Entendiendo los parámetros (60,1)
El primer número (60) representa el número máximo de peticiones.
El segundo (1) indica el intervalo de tiempo en minutos.
Así, throttle:60,1 significa “60 peticiones por minuto”.
Puedes ajustar ambos valores según las necesidades de tu aplicación.
Qué significa esto básicamente aquí estamos indicando cuántas peticiones puede realizar el cliente en determinado tiempo y este determinado tiempo viene expresado en minutos por lo tanto en este ejemplo serían 60 peticiones (60 request) en un plazo de un minuto y eso viene siendo aquí prácticamente todo.
Qué ocurre cuando se supera el límite (errores 419 y 429)
Si el cliente excede el número de solicitudes permitidas, Laravel devuelve una respuesta de error, normalmente:
429 Too Many RequestsEn versiones previas, puede mostrarse un 419 Page Expired.
Usar RateLimiter y configureRateLimiting para límites personalizados
A partir de Laravel 8, puedes definir tus propios límites dinámicos con RateLimiter.
Esto se configura en el archivo RouteServiceProvider:
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
public function configureRateLimiting()
{
RateLimiter::for('api', function ($request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}Límite por usuario, IP o plan de suscripción
Una ventaja que aprovecho en mis proyectos es asignar límites distintos según el tipo de usuario.
Por ejemplo, un cliente con plan gratuito puede tener 30 peticiones por minuto, mientras que uno premium dispone de 200.
Integrar throttling con RouteServiceProvider
Desde ahí, puedes combinarlo con middlewares o políticas de autenticación, asegurando que cada grupo de usuarios reciba el trato que le corresponde.
- Casos de uso reales
Ejemplo 1: evitar abusos en sorteos o rifas online- Un pequeño sistema de rifa web, mientras más peticiones puedes enviar más posibilidades tiene de ganar y por lo tanto un cliente atacante puede enviar múltiples peticiones en poco tiempo; en poco tiempo mediante un robot que acaba de implementar o algo por el estilo simplemente para mejorar las posibilidades de de ganar el premio.
Gracias al throttling, el sistema bloqueó automáticamente esos intentos y mantuvo la competencia justa.
- Un pequeño sistema de rifa web, mientras más peticiones puedes enviar más posibilidades tiene de ganar y por lo tanto un cliente atacante puede enviar múltiples peticiones en poco tiempo; en poco tiempo mediante un robot que acaba de implementar o algo por el estilo simplemente para mejorar las posibilidades de de ganar el premio.
- Ejemplo 2: limitar peticiones según el plan de pago
- También lo aplico en servicios con planes de suscripción.
Cada plan tiene un número máximo de peticiones mensuales, lo cual ayuda a mantener una infraestructura estable y predecible; por ejemplo un mes 30 peticiones O 100 peticiones en un mes fue lo que pagó por lo tanto lo puedes también limitar de esa manera para que otra vez solamente puedas realizar esas 30 peticiones a un recurso protegido en ese mes. Esto lo puedes colocar en cualquier tipo de ruta ya sea las rutas que tengamos definido a nivel de web o a nivel de Api.
- También lo aplico en servicios con planes de suscripción.
- Ejemplo 3: proteger recursos sensibles en APIs públicas
- Si ofreces endpoints públicos (por ejemplo, para integradores externos), aplicar límites evita que terceros consuman en exceso tu API o provoquen caídas.
Buenas prácticas y errores comunes
Ajusta tus límites según el tipo de endpoint (consultas críticas vs. endpoints ligeros).
Usa cabeceras como Retry-After para indicar al cliente cuándo puede volver a intentar.
Si realizas pruebas de carga, no olvides excluir tus IPs o usuarios admin.
Evita usar el mismo límite para todas las rutas: personaliza.
En mis pruebas, descubrí que si el límite es demasiado bajo, el sistema genera falsas alertas; y si es demasiado alto, deja de cumplir su propósito.
Conclusión
El throttling en Laravel es una herramienta poderosa para mantener el equilibrio entre rendimiento, seguridad y experiencia de usuario.
Con unos pocos ajustes, puedes proteger tu API, optimizar el servidor y asegurar un uso justo de tus recursos.
Ya sea con el middleware ThrottleRequests o con reglas personalizadas en RateLimiter, la clave está en adaptar los límites al contexto de tu aplicación.
Preguntas frecuentes (FAQ)
¿ThrottleRequests y RateLimiter son lo mismo?
No. ThrottleRequests aplica límites fijos desde las rutas; RateLimiter te permite personalizarlos de forma dinámica por usuario, IP o plan.
¿Cómo ajustar el límite de peticiones por ruta?
Puedes hacerlo directamente en la ruta, por ejemplo:
Route::middleware('throttle:10,1') limita a 10 peticiones por minuto esa ruta específica.
¿Qué hacer si recibo un error “Too Many Requests”?
Significa que has superado el límite configurado.
Revisa el middleware, ajusta los valores o espera el tiempo indicado en la cabecera Retry-After.
El siguiente paso, es aprender a enviar correos electrónicos en Laravel.
Acepto recibir anuncios de interes sobre este Blog.
Descubre cómo implementar throttling en Laravel para limitar solicitudes a tus APIs, proteger recursos y mejorar el rendimiento. Incluye ejemplos, casos reales y buenas prácticas con ThrottleRequests y RateLimiter.