Dhal puede limitar por IP, ruta, usuario, tenant o clave API. Esto evita depender únicamente de la IP en APIs autenticadas y sistemas multi-tenant.
{
"rateLimit": {
"enabled": true,
"store": "memory",
"keyBy": ["ip", "route"],
"default": { "windowSeconds": 60, "max": 120 },
"routes": {
"/api/search": { "windowSeconds": 60, "max": 30 }
}
}
}Los componentes disponibles son ip, route, userId, tenantId y apiKeyId. Credential stuffing también admite userAgent.
| Caso | Clave sugerida |
|---|---|
| Endpoint público | ip, route |
| Acción autenticada | userId, route |
| Cuota de tenant | tenantId, route |
| Integración API | apiKeyId, route |
| Login | ip, route, opcionalmente userAgent |
Cabeceras de identidad
{
"identity": {
"headers": {
"userId": ["x-dhal-user-id", "x-user-id"],
"tenantId": ["x-dhal-tenant-id", "x-tenant-id"],
"apiKeyId": ["x-dhal-api-key-id", "x-api-key-id"]
}
}
}Confía solo en cabeceras eliminadas y reescritas por tu autenticación o gateway. No aceptes identidades proporcionadas directamente por clientes públicos.
Perfil por ruta
{
"routes": {
"/api/export": {
"mode": "block",
"rateLimit": {
"enabled": true,
"windowSeconds": 3600,
"max": 10,
"keyBy": ["tenantId", "userId"]
}
}
}
}Almacenamiento
La memoria es adecuada para desarrollo, pruebas y un único proceso. Cada proceso mantiene contadores independientes.
Un almacenamiento personalizado implementa RateLimitStore.consume(). En producción horizontal usa RedisRateLimitStore o una implementación compartida con operaciones atómicas y expiración equivalente.