Que Es Rate Limiting?
Rate limiting controla cuantos requests un cliente puede hacer a una API dentro de una ventana de tiempo. Protege servidores del abuso, asegura uso justo y previene ataques de denegacion de servicio. Como tester, necesitas verificar que los rate limits estan correctamente implementados y que la API comunica los limites claramente.
Por Que Importa el Rate Limiting
Sin rate limiting, un solo cliente podria sobrecargar el servidor. Escenarios del mundo real incluyen:
- Un bug en una app movil enviando requests en loop infinito
- Un usuario malicioso intentando extraer todos los datos
- Una integracion mal configurada haciendo miles de llamadas por segundo
- Ataques de fuerza bruta a endpoints de autenticacion
Algoritmos de Rate Limiting
Ventana Fija (Fixed Window)
Cuenta requests dentro de intervalos fijos (ej., por minuto comenzando en :00). Simple de implementar pero permite rafagas en los limites de ventana.
Ventana Deslizante (Sliding Window)
Rastrea requests sobre una ventana de tiempo movil. Mas preciso que la ventana fija — si enviaste 80 requests en los ultimos 60 segundos, te quedan 20 sin importar los limites del reloj.
Token Bucket
Los tokens se agregan al bucket a una tasa fija. Cada request consume un token. Si el bucket esta vacio, el request se rechaza. El bucket tiene capacidad maxima, permitiendo rafagas.
Leaky Bucket
Los requests entran a una cola (bucket) y se procesan a tasa constante. Si el bucket se desborda, los nuevos requests se rechazan.
| Algoritmo | Manejo de Rafagas | Precision | Complejidad |
|---|---|---|---|
| Ventana Fija | Permite rafagas en limites | Baja | Baja |
| Ventana Deslizante | Previene rafagas | Alta | Media |
| Token Bucket | Rafagas controladas | Alta | Media |
| Leaky Bucket | Sin rafagas | Alta | Media |
Headers de Rate Limit
La mayoria de APIs comunican rate limits a traves de headers:
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 73
X-RateLimit-Reset: 1625097600
Retry-After: 30
| Header | Significado |
|---|---|
X-RateLimit-Limit | Requests maximos permitidos en la ventana |
X-RateLimit-Remaining | Requests restantes en la ventana actual |
X-RateLimit-Reset | Timestamp Unix cuando la ventana se reinicia |
Retry-After | Segundos a esperar antes de reintentar (en 429) |
Testing de Headers de Rate Limit
Para cada respuesta exitosa, verifica:
X-RateLimit-Limitesta presente y coincide con limites documentadosX-RateLimit-Remainingdecrementa en 1 con cada requestX-RateLimit-Resetes un timestamp futuro valido- Los valores son consistentes entre requests secuenciales
Testing de Aplicacion de Rate Limit
Test Basico de Aplicacion
Envia requests en sucesion rapida y verifica:
import requests
import time
url = "https://api.example.com/data"
headers = {"Authorization": "Bearer token"}
results = []
for i in range(110): # Exceder el limite de 100/min
response = requests.get(url, headers=headers)
results.append({
"request": i + 1,
"status": response.status_code,
"remaining": response.headers.get("X-RateLimit-Remaining")
})
# Verificar: primeros 100 deberian ser 200, resto 429
Escenarios de Test
| Escenario | Comportamiento Esperado |
|---|---|
| Uso normal dentro de limites | 200 con conteo correcto de remaining |
| Exactamente en el limite | 200 para el ultimo request permitido |
| Uno sobre el limite | 429 con header Retry-After |
| Despues de esperar el reset | 200 con limite completo restaurado |
| Diferentes endpoints | Pueden tener limites separados |
| Diferentes tokens auth | Cada usuario tiene sus propios limites |
| Sin autenticacion | Tipicamente limites mas estrictos por IP |
Test de Recuperacion de Rate Limit
Despues de alcanzar el limite:
- Verificar que 429 incluye
Retry-After - Esperar la duracion especificada
- Enviar otro request — deberia ser 200
- Verificar que
X-RateLimit-Remainingse reinicio
Limites por Endpoint vs. Globales
Algunas APIs tienen diferentes limites por endpoint:
- Autenticacion: 5 requests/minuto (mas estricto)
- Operaciones de lectura: 1000 requests/minuto
- Operaciones de escritura: 100 requests/minuto
- Busqueda: 30 requests/minuto
Testea que los limites se aplican por endpoint y no se mezclan entre rutas.
Bugs Comunes de Rate Limiting
| Bug | Como Detectarlo |
|---|---|
| Limites no aplicados | Enviar mas del limite — todos retornan 200 |
| Conteo remaining incorrecto | Rastrear X-RateLimit-Remaining entre requests |
| Tiempo de reset incorrecto | Verificar si el timestamp coincide con el comportamiento real |
| Sin Retry-After en 429 | Inspeccionar respuestas 429 |
| Limites se reinician en error | Causar un 400, verificar si el contador se reinicia |
Ejercicio Practico
- Testea limites de GitHub API: GitHub permite 60 requests/hora sin autenticacion. Envia requests a
https://api.github.com/usersy rastrea los headers de rate limit. - Mide la ventana: Determina si el rate limiter usa ventana fija o deslizante enviando rafagas en limites de ventana.
- Test de recuperacion: Alcanza el rate limit, espera el Retry-After y verifica la recuperacion.
- Documenta limites: Crea una tabla de todos los rate limits para una API de prueba.
Puntos Clave
- Rate limiting protege APIs del abuso — testearlo es critico para produccion
- Algoritmos comunes: ventana fija, ventana deslizante, token bucket y leaky bucket
- Siempre verifica que los headers de rate limit sean precisos y consistentes
- Testea el ciclo completo: uso normal, alcanzar el limite, recibir 429 con Retry-After y recuperacion
- Los limites por endpoint, por usuario y por IP pueden diferir — testea cada uno independientemente