Dhal peut limiter par IP, route, utilisateur, tenant ou clé API. Cela évite de dépendre uniquement de l’IP dans les API authentifiées et les systèmes multi-tenant.
{
"rateLimit": {
"enabled": true,
"store": "memory",
"keyBy": ["ip", "route"],
"default": { "windowSeconds": 60, "max": 120 },
"routes": {
"/api/search": { "windowSeconds": 60, "max": 30 }
}
}
}Composants disponibles : ip, route, userId, tenantId et apiKeyId. Le credential stuffing accepte aussi userAgent.
| Cas | Clé conseillée |
|---|---|
| Endpoint public | ip, route |
| Action authentifiée | userId, route |
| Quota tenant | tenantId, route |
| Intégration API | apiKeyId, route |
| Connexion | ip, route, éventuellement userAgent |
En-têtes d’identité
{
"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"]
}
}
}Ne faites confiance qu’aux en-têtes supprimés puis réécrits par votre couche d’authentification ou votre passerelle. N’acceptez pas directement les identités fournies par le client.
Profil de route
{
"routes": {
"/api/export": {
"mode": "block",
"rateLimit": {
"enabled": true,
"windowSeconds": 3600,
"max": 10,
"keyBy": ["tenantId", "userId"]
}
}
}
}Le stockage mémoire convient au développement, aux tests et à un processus unique. En production horizontale, utilisez RedisRateLimitStore ou une implémentation partagée atomique avec expiration.