Rate Limiting en JavaScript (Node.js) : Guide complet de la bibliothèque express-rate-limit

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Rate Limiting en JavaScript (Node.js) : Protéger votre API avec express-rate-limit

Dans le développement web moderne, protéger les applications serveur contre une charge excessive et des attaques malveillantes est une tâche cruciale. L'un des mécanismes de protection les plus efficaces est le rate limiting (limitation du taux de requêtes). Cette approche permet de contrôler le nombre de requêtes qu'un client (adresse IP, utilisateur ou session) peut envoyer au serveur sur une période donnée. Dans l'écosystème Node.js et Express, la bibliothèque la plus populaire et fiable pour implémenter le rate limiting est express-rate-limit.



Qu'est-ce que le rate limiting et pourquoi est-il nécessaire ?

Le rate limiting est une technique utilisée pour gérer le trafic réseau. Elle empêche l'abus des ressources du serveur, protégeant contre :

  • Les attaques DoS/DDoS — des requêtes massives visant à mettre le serveur hors service.
  • Les attaques par force brute — le cassage de mots de passe ou de jetons d'accès.
  • \
  • Le web scraping — la collecte automatique de données depuis un site.
  • L'utilisation excessive d'une API — lorsqu'un seul client consomme plus de ressources que prévu.

Sans rate limiting, votre application peut devenir vulnérable et instable, surtout avec la croissance de la base d'utilisateurs.



La bibliothèque express-rate-limit

express-rate-limit est un middleware pour Express.js qui offre un moyen simple et flexible de limiter les requêtes. Il s'intègre dans la chaîne de traitement des requêtes et suit automatiquement le nombre d'accès de chaque client. La bibliothèque prend en charge différents stockages (en mémoire, Redis, MongoDB, etc.), ce qui la rend évolutive pour les systèmes distribués.



Installation

Pour commencer, installez la bibliothèque via npm :

npm install express-rate-limit


Utilisation de base

L'exemple le plus simple consiste à limiter toutes les routes de l'application à 100 requêtes par heure depuis une même adresse IP :

const rateLimit = require('express-rate-limit');const express = require('express');const app = express();

// Créer le limiteurconst limiter = rateLimit({ windowMs: 60 * 60 * 1000, // 1 heure max: 100, // maximum 100 requêtes message: 'Trop de requêtes depuis votre IP. Veuillez réessayer plus tard.', standardHeaders: true, // Retourne les en-têtes standard RateLimit-* legacyHeaders: false, // Désactive les en-têtes X-RateLimit-*});

// Appliquer à toutes les routesapp.use(limiter);

app.get('/', (req, res) => { res.send('Page d'accueil');});

app.listen(3000, () => { console.log('Serveur démarré sur le port 3000');});


Configuration pour différentes routes

Il est souvent nécessaire d'avoir des limitations différentes pour divers points de terminaison. Par exemple, pour la route de connexion, vous pouvez définir une limite plus stricte :

const rateLimit = require('express-rate-limit');

// Limite stricte pour /api/loginconst loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 5, // 5 tentatives de connexion message: { error: 'Trop de tentatives de connexion. Réessayez dans 15 minutes.', retryAfter: 15 }, keyGenerator: (req) => { // Utiliser l'IP + le nom d'utilisateur pour un blocage plus précis return req.ip + req.body.username; }});

app.post('/api/login', loginLimiter, (req, res) => { // Logique d'authentification res.send('Connexion réussie');});

// Limite souple pour l'API publiqueconst apiLimiter = rateLimit({ windowMs: 60 * 1000, // 1 minute max: 30, // 30 requêtes par minute message: 'Limite de requêtes à l'API dépassée.'});

app.use('/api/', apiLimiter);


Fonctionnalités avancées

Stockages personnalisés

Par défaut, les données sont stockées dans la mémoire du processus. Pour la production, il est recommandé

Recommendations