Limitation de débit
Limitez le nombre de requêtes qu'un même visiteur peut faire sur une période donnée.
La limitation de débit protège vos routes contre les abus : tentatives de connexion répétées, scraping, surcharge d'une API. Au-delà de la limite, la requête est refusée avec une réponse 429 et l'en-tête Retry-After.
Le problème
Sans limite, un même visiteur peut envoyer autant de requêtes qu'il le veut : essayer des milliers de mots de passe sur votre page de connexion, aspirer tout votre catalogue, saturer une API coûteuse, ou déclencher des centaines d'envois de SMS et d'e-mails depuis votre formulaire, que vous payez.
Ce qu'elle arrête
- les attaques par force brute et le test en masse d'identifiants volés ;
- le scraping massif de vos pages et de vos prix ;
- l'abus de formulaires : inscriptions en série, envois répétés de codes par SMS ;
- un client défaillant qui boucle sur votre API.
Quand l'utiliser
Sur les routes sensibles avec une limite stricte (connexion, inscription, mot de passe oublié, envoi de codes), et sur le reste de l'application avec une limite plus large.
Configuration
import { rateLimit } from "@zarex/express"; // ou le paquet de votre framework
rules: [rateLimit({ max: 100, window: "1m" })],Ici, chaque visiteur peut faire 100 requêtes par minute.
Options
| Option | Valeurs | Rôle |
|---|---|---|
max | de 1 à 1 000 000 | Obligatoire. Requêtes autorisées par fenêtre. |
window | "30s", "1m", "1h", "1d"… | Obligatoire. Durée de la fenêtre. |
algorithm | "FIXED_WINDOW" · "SLIDING_WINDOW" | Défaut "FIXED_WINDOW". La fenêtre glissante lisse les pics en début de fenêtre. |
characteristics | liste de noms | Ce qui identifie un visiteur. Défaut : son adresse IP. |
mode | "LIVE" · "DRY_RUN" · "OFF" | Défaut "LIVE". |
Limiter par utilisateur
Par défaut, un visiteur est identifié par son adresse IP. Sur les réseaux mobiles, de nombreux utilisateurs partagent souvent la même adresse : sur une route où l'utilisateur est connecté, mieux vaut limiter par compte.
app.use(
zarex({
key: process.env.ZAREX_KEY!,
rules: [
rateLimit({ max: 20, window: "1m", characteristics: ["userId"] }),
],
call: (req) => ({ characteristics: { userId: req.user?.id } }),
})
);Les valeurs fournies par call sont hachées (SHA-256) avant d'être envoyées à Zarex.
La bonne adresse IP
Une limite par IP n'a de sens que si Zarex voit la vraie adresse du visiteur. Derrière un proxy, vérifiez votre réglage : voir L'adresse IP du visiteur.