Rate Limiting et Throttling
Protection contre les abus et garantie de disponibilité
INTRODUCTION
1.1 Objectif du Document
Ce document décrit la stratégie complète de Rate Limiting et Throttling mise en place pour la plateforme REWAPP. Il détaille les mécanismes de protection contre les abus, les attaques par déni de service et la surcharge des systèmes, tout en garantissant une expérience utilisateur optimale pour les clients légitimes.
1.2 Définitions et Terminologie
Glossaire
| Terme | Définition |
|---|---|
Rate Limiting |
Limitation du nombre de requêtes autorisées sur une période donnée |
Throttling |
Ralentissement progressif des requêtes en cas de dépassement |
Burst |
Pic de requêtes autorisé temporairement au-delà de la limite normale |
Sliding Window |
Algorithme de fenêtre glissante pour le calcul des limites |
Token Bucket |
Algorithme de jetons pour autoriser les bursts contrôlés |
Backoff |
Délai d'attente exponentiel imposé après un dépassement |
DDoS |
Attaque par déni de service distribué |
WAF |
Web Application Firewall |
1.3 Documents de Référence
- 6.1 Document de Sécurité
- 6.2 Architecture de Sécurité
- 6.2.1 Authentification et Autorisation
- 6.2.2 Protection des Données (CSRF/XSS)
- 4.3 Architecture Backend API
- 4.5 Stack Technique Détaillé
VUE D'ENSEMBLE DE LA STRATÉGIE
2.1 Objectifs de Sécurité
La stratégie de Rate Limiting de REWAPP vise à :
- Protéger l'infrastructure contre les attaques DDoS et les abus
- Garantir une disponibilité de 99.9% du service
- Assurer une répartition équitable des ressources entre utilisateurs
- Prévenir les attaques par force brute sur l'authentification
- Protéger les endpoints sensibles (transactions, QR codes)
- Maintenir des temps de réponse API < 200ms
2.2 Principes Fondamentaux
Principes de Protection
| Principe | Description |
|---|---|
| Defense in Depth | Multiple couches de protection (WAF, Kong, Application) |
| Fail Secure | En cas de doute, refuser la requête |
| Graceful Degradation | Dégradation progressive plutôt que coupure brutale |
| Transparency | Headers informatifs pour les développeurs |
| Proportionality | Réponse proportionnelle à la menace détectée |
2.3 Architecture Globale
La protection Rate Limiting s'applique à trois niveaux :
Niveau 1 - Edge (AWS WAF + Shield)
Protection contre les attaques DDoS volumétriques et les requêtes malveillantes avant même d'atteindre l'infrastructure.
Niveau 2 - API Gateway (Kong)
Rate limiting applicatif avec compteurs Redis, gestion fine des quotas par utilisateur, IP et endpoint.
Niveau 3 - Application (NestJS)
Protection supplémentaire au niveau applicatif pour les endpoints critiques (authentification, transactions).
STRATÉGIES DE RATE LIMITING
3.1 Rate Limiting par Utilisateur
Chaque utilisateur authentifié dispose d'un quota de requêtes basé sur son identifiant unique (user_id extrait du JWT).
Identification de l'utilisateur
- Extraction du user_id depuis le token JWT validé
- Stockage du compteur dans Redis avec clé :
rate:user:{user_id} - TTL automatique aligné sur la fenêtre temporelle
Limites par Type d'Utilisateur
| Type Utilisateur | Limite | Période | Burst |
|---|---|---|---|
| Client App Mobile | 100 requêtes | Par minute | +20 (burst 5s) |
| Partenaire (Dashboard) | 200 requêtes | Par minute | +40 (burst 5s) |
| Admin | 500 requêtes | Par minute | +100 (burst 5s) |
| Super Admin | 1000 requêtes | Par minute | +200 (burst 5s) |
3.2 Rate Limiting par IP
Pour les requêtes non authentifiées ou en complément du rate limiting utilisateur.
Considérations NAT
- Détection des adresses IP partagées (entreprises, universités)
- Combinaison IP + User-Agent pour affiner l'identification
- Header X-Forwarded-For pour les requêtes via proxy/CDN
Limites par Type d'IP
| Type IP | Limite | Période | Burst |
|---|---|---|---|
| IP Standard | 1000 requêtes | Par minute | +100 (burst 10s) |
| IP Partenaire (Whitelist) | 5000 requêtes | Par minute | +500 (burst 10s) |
| IP Suspecte (Greylist) | 100 requêtes | Par minute | Aucun |
| IP Bloquée (Blacklist) | 0 requêtes | Permanent | N/A |
3.3 Rate Limiting par Endpoint
Certains endpoints critiques ont des limites spécifiques, plus restrictives que les limites globales.
Limites par Endpoint Critique
| Endpoint | Limite | Période | Justification |
|---|---|---|---|
POST /auth/login |
5 req | Par minute | Protection brute force |
POST /auth/register |
3 req | Par heure (IP) | Anti-spam inscription |
POST /auth/password/reset |
3 req | Par heure | Protection reset bombing |
POST /qr-codes/generate |
10 req | Par minute | QR = ressource coûteuse |
POST /qr-codes/scan |
30 req | Par minute | Partenaires scan intensif |
GET /transactions |
30 req | Par minute | Requêtes coûteuses BDD |
POST /withdrawals |
5 req | Par jour | Opération sensible |
3.4 Rate Limiting Global
Protection de l'infrastructure globale contre les pics de charge.
Seuils Globaux
| Métrique | Seuil | Action |
|---|---|---|
| Requêtes totales/seconde | 10 000 req/s | Mode dégradé |
| Requêtes authentifiées/seconde | 5 000 req/s | File d'attente |
| Requêtes API Gateway | 15 000 req/s | Scaling auto |
| CPU API Gateway > 80% | N/A | Throttling global |
CONFIGURATION ET SEUILS
4.1 Limites par Plateforme
Configuration par Plateforme
| Plateforme | Utilisateur | IP | Endpoint Critique |
|---|---|---|---|
| App Mobile iOS/Android | 100/min | 1000/min | Spécifique |
| Site Vitrine | 50/min | 500/min | Standard |
| Dashboard Partenaire | 200/min | 1000/min | Scan QR élevé |
| Dashboard Admin | 500/min | 2000/min | Élevé (bulk ops) |
| API Webhooks (Entrants) | N/A | 100/min | Validation signature |
4.2 Limites par Type d'Endpoint
Configuration par Opération
| Type | Lecture (GET) | Écriture (POST/PUT) | Suppression (DELETE) |
|---|---|---|---|
| Authentification | 50/min | 10/min | 5/min |
| Utilisateurs | 100/min | 20/min | 5/min |
| Transactions | 50/min | 10/min | N/A |
| Points | 100/min | 10/min | N/A |
| QR Codes | 20/min | 10/min | N/A |
| Partenaires | 100/min | 20/min | 5/min |
| Campagnes | 50/min | 10/min | 5/min |
| Statistiques | 30/min | N/A | N/A |
4.3 Configuration par Environnement
Paramètres par Environnement
| Paramètre | Développement | Staging | Production |
|---|---|---|---|
| Rate Limit Utilisateur | Désactivé | 500/min | 100/min |
| Rate Limit IP | Désactivé | 5000/min | 1000/min |
| Rate Limit Endpoint | Désactivé | x5 prod | Standard |
| Throttling Adaptatif | Désactivé | Warning | Enforce |
| Pénalités | Désactivé | Réduites | Standard |
| DDoS Protection | Basique | Standard | Avancé |
4.4 Burst Allowance
Le mécanisme de Burst permet des pics temporaires au-delà de la limite normale pour accommoder les comportements légitimes (ouverture d'app, rafraîchissement de page).
Configuration Token Bucket
- Bucket Size : 120% de la limite par minute
- Refill Rate : Limite / 60 tokens par seconde
- Burst Window : 5 secondes maximum
Exemple pour utilisateur standard (100/min)
- Bucket : 120 tokens maximum
- Refill : 1.67 tokens/seconde
- Burst autorisé : 20 requêtes en 5 secondes
THROTTLING ADAPTATIF
5.1 Mécanismes de Détection
Le throttling adaptatif analyse le comportement en temps réel pour identifier les patterns anormaux :
Patterns de Détection
| Pattern | Indicateur | Action |
|---|---|---|
| Burst répétés | > 3 bursts en 5 min | Réduction burst 50% |
| Requêtes échouées | > 50% erreurs 4xx | Throttle progressif |
| Vitesse anormale | > 10 req/sec soutenu | Délai +100ms |
| Endpoints sensibles | Tentatives répétées login | Captcha + délai |
| Pattern DDoS | Même payload répété | Blocage temporaire |
5.2 Niveaux de Réponse
Niveau 0 - Normal
Fonctionnement standard, pas de restriction supplémentaire
Niveau 1 - Surveillance (Warning)
Log des comportements suspects • Pas d'impact utilisateur • Alerte équipe monitoring
Niveau 2 - Ralentissement (Soft Throttle)
Délai artificiel : 100-500ms par requête • Réduction du burst allowance de 50% • Notification utilisateur possible
Niveau 3 - Limitation (Hard Throttle)
Réduction des quotas de 50% • Délai artificiel : 1-2 secondes • Alerte équipe sécurité
Niveau 4 - Blocage Temporaire
Blocage complet pendant 5-30 minutes • Captcha obligatoire pour débloquer • Investigation automatique
5.3 Algorithmes Utilisés
Sliding Window Log
Utilisé pour les limites précises par utilisateur.
- Stocke le timestamp de chaque requête
- Calcul exact du nombre de requêtes dans la fenêtre
- Consommation mémoire : O(n) où n = nombre de requêtes
Sliding Window Counter
Utilisé pour les limites par IP (compromis précision/performance).
- Combine compteur courant et précédent avec pondération
- Estimation : (count_previous × overlap) + count_current
- Consommation mémoire : O(1)
Token Bucket
Utilisé pour la gestion des bursts.
- Tokens régénérés à taux constant
- Autorise des pics si tokens disponibles
- Implémentation Redis avec MULTI/EXEC
IMPLÉMENTATION TECHNIQUE
6.1 Stack Technique
Composants Techniques
| Composant | Technologie | Version | Rôle |
|---|---|---|---|
| API Gateway | Kong |
3.4+ | Rate limiting principal |
| Cache/Compteurs | Redis |
7+ | Stockage compteurs distribués |
| Application | NestJS |
10.x | Rate limiting secondaire |
| Edge Protection | AWS WAF |
- | Protection DDoS, règles WAF |
| DDoS Shield | AWS Shield |
Standard | Protection volumétrique |
6.2 Architecture Kong API Gateway
Configuration Kong Rate Limiting Plugin :
Configuration Kong
| Paramètre | Valeur | Description |
|---|---|---|
policy |
redis | Backend de stockage des compteurs |
redis_host |
elasticache.rewapp.internal | Cluster Redis ElastiCache |
redis_port |
6379 | Port standard Redis |
redis_password |
{secret} | Via Variables CapRover |
redis_database |
1 | Database dédiée rate limiting |
fault_tolerant |
true | Continuer si Redis indisponible |
hide_client_headers |
false | Afficher headers X-RateLimit-* |
minute |
100 | Limite par minute (utilisateur) |
identifier |
consumer | Identifier par consumer (user) |
Fallback sans Redis
- Bascule vers compteur local en mémoire
- Limite conservatrice appliquée
- Alerte OPS immédiate
- Durée maximale fallback : 5 minutes
6.3 Compteurs Redis
Structure des clés Redis :
rate:user:{user_id}:minute → Compteur par minute utilisateur
rate:ip:{ip_hash}:minute → Compteur par minute IP
rate:endpoint:{path_hash}:{user_id}:minute → Compteur endpoint spécifique
rate:global:second → Compteur global par seconde
penalty:{user_id}:level → Niveau de pénalité actuel
blacklist:ip:{ip_hash} → IP blacklistée
Configuration Redis
- Cluster mode avec 3 shards minimum
- Réplication pour haute disponibilité
- Eviction policy : volatile-ttl
- Maxmemory : 512MB dédié rate limiting
Script Lua pour atomicité :
-- Incrémentation atomique avec TTL
local current = redis.call('INCR', KEYS[1])
if current == 1 then
redis.call('EXPIRE', KEYS[1], ARGV[1])
end
return current
6.4 Headers HTTP de Réponse
Headers standards retournés sur chaque réponse API :
Headers Rate Limit
| Header | Description | Exemple |
|---|---|---|
X-RateLimit-Limit |
Limite totale de la fenêtre | 100 |
X-RateLimit-Remaining |
Requêtes restantes | 45 |
X-RateLimit-Reset |
Timestamp Unix reset fenêtre | 1732800000 |
Retry-After |
Secondes avant retry (si 429) | 30 |
X-RateLimit-Policy |
Politique appliquée | user-standard |
Exemple de réponse avec headers :
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1732800060
Content-Type: application/json
GESTION DES DÉPASSEMENTS
7.1 Réponses HTTP Standards
Code 429 - Too Many Requests
{
"statusCode": 429,
"error": "Too Many Requests",
"message": "Vous avez dépassé le nombre de requêtes autorisées. Veuillez réessayer dans 30 secondes.",
"retryAfter": 30,
"limit": 100,
"remaining": 0,
"resetAt": "2025-11-24T15:00:00Z"
}
Code 503 - Service Unavailable (Surcharge globale)
{
"statusCode": 503,
"error": "Service Temporarily Unavailable",
"message": "Le service est temporairement surchargé. Veuillez réessayer dans quelques instants.",
"retryAfter": 60
}
7.2 Système de Pénalités
Les dépassements répétés entraînent des pénalités progressives :
Niveaux de Pénalité
| Niveau | Déclencheur | Pénalité | Durée |
|---|---|---|---|
| 1 | 3 dépassements en 1h | Limite réduite de 25% | 1 heure |
| 2 | 5 dépassements en 1h | Limite réduite de 50% | 2 heures |
| 3 | 10 dépassements en 1h | Limite réduite de 75% | 6 heures |
| 4 | 20 dépassements en 24h | Blocage temporaire | 24 heures |
| 5 | Comportement malveillant | Blocage permanent | Investigation |
Réinitialisation des pénalités
- Décrémentation automatique après période sans incident
- Reset complet après 7 jours sans dépassement
- Reset manuel possible par admin (cas support)
7.3 Whitelist et Exceptions
Whitelist IP (Partenaires Premium)
- Partenaires avec abonnement Premium
- Limites multipliées par 5
- Pas de pénalités automatiques
- Support prioritaire
Whitelist User-Agent (Services internes)
- Webhooks partenaires bancaires (Budget Insight)
- Services de monitoring (health checks)
- Jobs batch nocturnes
Procédure d'ajout whitelist
-
1
Demande via ticket support
-
2
Validation équipe sécurité
-
3
Ajout dans Kong + Redis
-
4
Monitoring renforcé 7 jours
-
5
Validation définitive
CAS D'USAGE SPÉCIFIQUES REWAPP
8.1 API d'Authentification
ENDPOINTS CRITIQUES
Protection renforcée contre brute force
Endpoints Authentification
| Endpoint | Limite | Fenêtre | Pénalité Échec |
|---|---|---|---|
POST /auth/login |
5 tentatives | 1 minute | +30s délai par échec |
POST /auth/register |
3 inscriptions | 1 heure (IP) | Captcha obligatoire |
POST /auth/password/reset |
3 demandes | 1 heure | Notification email |
POST /auth/2fa/verify |
3 tentatives | 5 minutes | Blocage 15 min |
POST /auth/refresh |
20 refresh | 1 heure | Token révoqué |
Protection brute force login
- Délai exponentiel : 0s, 30s, 60s, 120s, 300s
- Après 5 échecs : Captcha obligatoire
- Après 10 échecs : Blocage compte 30 minutes
- Notification email au propriétaire du compte
8.2 Génération QR Code
QR Code = 60 secondes de validité
Ressource coûteuse nécessitant une protection spécifique
Configuration QR Code
| Paramètre | Valeur | Justification |
|---|---|---|
| Limite utilisateur | 10/minute | QR valide 60s, pas besoin de spam |
| Limite par jour | 100/jour | Usage normal : 1-5 QR/jour |
| Cooldown après génération | 5 secondes | Évite double-génération accidentelle |
| QR simultanés actifs | 1 maximum | Un seul QR valide à la fois |
Comportement
- Génération d'un nouveau QR → Annulation automatique du précédent
- Rate limit atteint → Message explicatif avec countdown
- Tentative de génération pendant cooldown → HTTP 429 + Retry-After: 5
8.3 Scan QR Code (Partenaires)
Le Dashboard Partenaire a des besoins spécifiques pour le scan QR en situation de rush.
Configuration Scan Partenaire
| Paramètre | Valeur | Justification |
|---|---|---|
| Limite partenaire | 60/minute | Rush hour restaurant |
| Limite par device | 30/minute | Multiple devices possibles |
| Burst autorisé | +20 en 10s | Pic momentané accepté |
Protection anti-replay
- Chaque QR code a un ID unique (UUID v4)
- Stockage Redis des QR scannés (TTL 5 min)
- Tentative re-scan → HTTP 409 Conflict + message explicite
8.4 Transactions Bancaires
OPÉRATIONS SENSIBLES - Double protection
Les transactions bancaires nécessitent une sécurité renforcée
Endpoints Bancaires
| Endpoint | Limite | Fenêtre | Contrôle Supplémentaire |
|---|---|---|---|
POST /withdrawals |
5 demandes | 24 heures | 2FA obligatoire |
GET /transactions/history |
30 requêtes | 1 minute | Cache 30 secondes |
POST /bank-accounts/link |
3 liaisons | 24 heures | Vérification identité |
Virements bancaires
- Maximum 5 demandes de virement par jour
- Montant cumulé maximum : 500€/jour (configurable)
- 2FA obligatoire pour chaque demande
- Délai artificiel de 3 secondes (anti-fraud check)
- Notification email + push systématique
MONITORING ET ALERTING
9.1 Métriques Collectées
Métriques Rate Limiting
| Métrique | Type | Agrégation | Rétention |
|---|---|---|---|
rate_limit_requests_total |
Counter | Par endpoint, user, IP | 30 jours |
rate_limit_exceeded_total |
Counter | Par endpoint, user, IP | 90 jours |
rate_limit_remaining |
Gauge | Par user | 1 jour |
throttle_level |
Gauge | Par user, global | 7 jours |
penalty_applied |
Counter | Par user, niveau | 90 jours |
blocked_requests |
Counter | Par IP, raison | 90 jours |
9.2 Dashboards de Supervision
Dashboard Temps Réel (Grafana)
- Requêtes par seconde globales
- Taux de 429 (rate limited)
- Top 10 utilisateurs par volume
- Top 10 IP par volume
- Endpoints les plus sollicités
- Niveau de throttle global
Dashboard Sécurité (Kibana)
- Tentatives de brute force
- IP suspectes détectées
- Patterns d'attaque identifiés
- Corrélation géographique
Dashboard Business
- Impact rate limiting sur utilisateurs
- Corrélation avec plaintes support
- Évolution des quotas utilisés
9.3 Alertes Automatiques
Configuration Alertes
| Alerte | Seuil | Canal | Priorité |
|---|---|---|---|
| Taux 429 > 5% | 5% requêtes | Slack #ops | Warning |
| Taux 429 > 15% | 15% requêtes | PagerDuty | Critical |
| Utilisateur bloqué (niveau 4+) | Tout blocage | Slack #security | High |
| Pattern DDoS détecté | Score > 80 | PagerDuty + Slack | Critical |
| Redis rate limit indisponible | Fallback activé | PagerDuty | Critical |
| Top user dépasse 10x limite | Volume anormal | Slack #security | High |
PROTECTION DDoS
10.1 Couches de Protection
Architecture de Protection DDoS
| Couche | Technologie | Type de Protection |
|---|---|---|
| 1 - DNS | Route 53 | Anycast, health checks |
| 2 - Edge | CloudFront | Cache, filtering |
| 3 - WAF | AWS WAF | Rules, IP sets, rate-based rules |
| 4 - Shield | AWS Shield Standard | Volumétrique (Layer 3/4) |
| 5 - API Gateway | Kong | Applicatif (Layer 7) |
| 6 - Application | NestJS | Logique métier |
10.2 AWS Shield et WAF
AWS Shield Standard (inclus)
- Protection automatique contre les attaques DDoS Layer 3/4
- Mitigation en temps réel
- Pas de coût supplémentaire
AWS WAF Rules
Configuration WAF
| Règle | Type | Action | Seuil |
|---|---|---|---|
AWSManagedRulesCommonRuleSet |
Managed | Block | - |
AWSManagedRulesKnownBadInputsRuleSet |
Managed | Block | - |
AWSManagedRulesSQLiRuleSet |
Managed | Block | - |
RateBased-IP |
Custom | Block | 2000 req/5min |
GeoBlock-HighRisk |
Custom | Block | Liste pays |
IPReputationList |
Custom | Block | Threat intelligence |
10.3 Réponse aux Incidents
Procédure d'escalade DDoS :
Niveau 1 - Détection automatique (0-5 min)
WAF rate-based rules activées • Alertes automatiques Slack + PagerDuty • Scaling horizontal déclenché
Niveau 2 - Intervention équipe (5-15 min)
Analyse du pattern d'attaque • Ajustement rules WAF si nécessaire • Communication équipe produit
Niveau 3 - Escalade AWS (15+ min)
Contact AWS Support (Business ou Enterprise) • Activation Shield Advanced si nécessaire • Mitigation avancée
Post-incident
- Analyse forensique complète
- Mise à jour des règles WAF
- Documentation et retour d'expérience
PROCÉDURES OPÉRATIONNELLES
11.1 Ajustement des Seuils
Les seuils peuvent être ajustés selon les besoins business ou la croissance.
Critères d'ajustement
- Croissance utilisateurs > 20%/mois → Révision des seuils
- Taux de 429 > 2% en nominal → Seuils trop bas
- Incidents de sécurité → Seuils plus restrictifs
- Événements promotionnels → Seuils temporairement augmentés
Procédure de modification
-
1
Création ticket avec justification
-
2
Analyse impact par équipe tech
-
3
Validation équipe sécurité
-
4
Déploiement staging + tests 24h
-
5
Déploiement production (off-peak)
-
6
Monitoring renforcé 7 jours
11.2 Gestion des Incidents
Incident type : Utilisateur légitime bloqué
- Support identifie le cas via ticket
- Vérification absence de comportement malveillant
- Reset pénalités si légitime
- Communication utilisateur
- Analyse root cause
- Ajustement si pattern récurrent
Incident type : Attaque en cours
- Alerte automatique reçue
- Identification du vecteur d'attaque
- Mise en place contre-mesures
- Communication interne (Slack #incident)
- Suivi jusqu'à mitigation complète
- Post-mortem sous 48h
11.3 Communication Utilisateur
Messages utilisateur en cas de rate limit :
App Mobile
"Vous effectuez trop d'actions. Veuillez patienter quelques secondes."
Dashboard Partenaire
"Limite de requêtes atteinte. Réessayez dans X secondes."
Erreur critique
"Notre service est temporairement surchargé. Nous travaillons à résoudre le problème."
CONCLUSION
12.1 Récapitulatif
La stratégie de Rate Limiting et Throttling de REWAPP assure :
- Protection multicouche : AWS WAF/Shield + Kong + Application
- Limites adaptées : 100 req/min utilisateur, 1000 req/min IP
- Flexibilité : Burst allowance, whitelist, configuration par environnement
- Transparence : Headers HTTP informatifs pour les développeurs
- Résilience : Fallback en cas de panne Redis
- Monitoring : Dashboards temps réel et alertes automatiques
- Conformité : Protection des endpoints sensibles (auth, transactions)
12.2 Points Clés
12.3 Références
Documents complémentaires :
- 6.1 Document de Sécurité
- 6.2 Architecture de Sécurité
- 4.3 Architecture Backend API
- 4.5 Stack Technique Détaillé
- 10.3 Procédures de Monitoring et Alerting