Fundamentos de rate limiting
Un solo cliente puede hacer mil solicitudes por segundo. Nada en HTTP se lo impide, y tu servidor va a intentar responder cada una.
El rate limiting controla cuánto tráfico acepta un servicio. Es la diferencia entre un endpoint que sobrevive a una mala tarde y uno que se cae porque un solo script se entusiasmó de más.
Tres problemas que resuelve
Uso justo. Si un cliente acapara los recursos, todos los demás esperan. Un límite evita que un solo cliente consuma lo que necesita toda la base de usuarios, así el tráfico legítimo sigue recibiendo respuesta mientras se rechaza el bucle descontrolado de alguien más.
Seguridad. Un endpoint de login sin límite es una invitación a adivinar contraseñas, miles a la vez. Los límites hacen que la fuerza bruta sea tan lenta que se vuelve inútil, y frenan los ataques de denegación de servicio más simples.
Recursos. La sobrecarga vuelve lento un servicio antes de dejarlo inaccesible, y es la lentitud lo que hace que los usuarios se vayan. Limitar el rendimiento mantiene los tiempos de respuesta predecibles para todos los que siguen dentro del límite.
Los límites no son, por sí solos, una defensa contra DDoS
Un ataque de denegación de servicio distribuido llega desde miles de máquinas separadas, cada una pareciendo un cliente normal. Los límites por dirección apenas hacen mella en eso.
Responder a eso requiere algo por encima: filtrado geográfico, análisis de comportamiento, o un proveedor que se ponga delante de ti. El rate limiting es una capa, no la solución completa.
Limitar cuántas veces puede preguntar cualquiera es lo que hace que una app sea difícil de abusar y agradable para todos los demás al mismo tiempo.
Rechazar versus frenar
Dos controles relacionados que se usan indistintamente y se comportan de manera distinta.
| Rate limiting | Throttling | |
|---|---|---|
| Qué hace | Rechaza solicitudes que superan un límite | Frena las solicitudes a medida que se acerca el límite |
| Qué ve el cliente | Un error, normalmente 429 Too Many Requests | Una respuesta, más tarde de lo normal |
| Mejor para | Topes duros que quieres hacer cumplir | Suavizar picos de tráfico sin romper a los clientes |
El rate limiting rechaza al superar un límite. El throttling frena.
Ambos tienen su lugar, y se combinan: frenar las cosas a medida que sube el tráfico, rechazar directamente al superar un tope duro. Throttling cubre la segunda mitad en detalle.
Uno rompe la solicitud del cliente. El otro lo hace esperar. Cuál es más amable depende por completo de quién llama y por qué.
Contra qué se cuenta un límite
Un límite necesita algo contra qué contar. Cuatro candidatos, cada uno con distintas ventajas y desventajas:
- Dirección IP. Disponible en toda solicitud, incluso las anónimas, y compartida por todos los que están detrás de una red de oficina o un operador móvil.
- ID de usuario autenticado. Preciso y justo, pero solo existe después del login.
- Clave de API. Ideal para clientes automatizados, ya que una clave identifica exactamente a quien llama.
- Un claim dentro de un JWT. Útil cuando la identidad ya viaja en el token.
Identificar clientes consiste en elegir entre estas opciones. En resumen: el tráfico anónimo te deja solo con la dirección, y todo lo demás es mejor cuando está disponible.
Los límites también necesitan una ventana de tiempo. Por segundo, por minuto, por hora, y esa elección moldea el comportamiento tanto como el número mismo.
Todo límite de tasa es esas tres decisiones juntas, y cambiar cualquiera de ellas cambia lo que el límite realmente hace.
Ponlo a prueba
Una API tiene un solo límite: 1000 solicitudes por hora por dirección IP. Averigua qué es lo que no logra prevenir.
- Un usuario en la red de una universidad no puede usar la app durante el período de clases. ¿Por qué?
- Un atacante quiere hacer 10 000 solicitudes por hora. ¿Cuánto le cuesta eso?
- Un script envía las 1000 solicitudes en los primeros dos segundos de cada hora. ¿Eso está dentro del límite?
Compara tus respuestas
1. El límite cuenta la cosa equivocada. Todos en esa red comparten una sola dirección de salida, así que miles de personas terminan compartiendo un presupuesto de mil. La solución es contar por usuario autenticado cuando exista un usuario, y dejar el límite por dirección solo para el tráfico anónimo.
2. Diez direcciones. Los pools de proxies residenciales las venden por miles a un precio muy bajo. Los límites por dirección hacen que el abuso cueste algo; no lo hacen difícil. Esta es la misma razón por la que limitar por IP apenas afecta un ataque distribuido.
3. Completamente dentro del límite. Nada dice cómo deben repartirse las mil solicitudes, así que todas pueden llegar de una sola vez y el endpoint recibe un pico del que nunca estuvo protegido. Eso es lo que controla la duración de la ventana, y elegir una hora permite un pico que una ventana de un minuto jamás dejaría pasar.
Tres preguntas, tres debilidades distintas, y solo la tercera tiene que ver con el algoritmo. Las primeras dos tienen que ver con qué cuentas y cuán barato es reemplazarlo.
Hacia dónde va esto
Un límite necesita tres decisiones: cuántas solicitudes, en qué ventana, contadas contra quién. El algoritmo es la forma en que las llevas.
Los contadores de ventana fija son el más simple de esos algoritmos, y el pico que dejan pasar es justo lo que existe para arreglar cada algoritmo posterior.

