Rate Limiting in JavaScript (Node.js): API-Schutz mit express-rate-limit
In der modernen Webentwicklung ist der Schutz von Serveranwendungen vor übermäßiger Belastung und böswilligen Angriffen eine kritische Aufgabe. Einer der effektivsten Schutzmechanismen ist das Rate Limiting (Anfragebegrenzung). Dieser Ansatz ermöglicht es, die Anzahl der Anfragen zu kontrollieren, die ein Client (IP-Adresse, Benutzer oder Sitzung) innerhalb eines bestimmten Zeitraums an den Server senden kann. Im Ökosystem von Node.js und Express ist die beliebteste und zuverlässigste Bibliothek zur Implementierung von Rate Limiting express-rate-limit.
Was ist Rate Limiting und warum wird es benötigt?
Rate Limiting ist eine Technik zur Steuerung des Netzwerkverkehrs. Sie verhindert den Missbrauch von Serverressourcen und schützt vor:
- DoS/DDoS-Angriffen — massiven Anfragen, die den Server lahmlegen sollen.
- Brute-Force-Angriffen — dem Durchprobieren von Passwörtern oder Zugriffstoken.
- Web Scraping — dem automatischen Sammeln von Daten von einer Website.
- Übermäßiger API-Nutzung — wenn ein einzelner Client mehr Ressourcen verbraucht als zulässig.
Ohne Rate Limiting kann Ihre Anwendung anfällig und instabil werden, insbesondere bei wachsender Benutzerbasis.
Die Bibliothek express-rate-limit
express-rate-limit ist eine Middleware für Express.js, die eine einfache und flexible Möglichkeit zur Anfragebegrenzung bietet. Sie wird in die Anfrageverarbeitungskette eingebunden und verfolgt automatisch die Anzahl der Zugriffe jedes Clients. Die Bibliothek unterstützt verschiedene Speicher (im Arbeitsspeicher, Redis, MongoDB und andere), was sie für verteilte Systeme skalierbar macht.
Installation
Installieren Sie die Bibliothek zunächst über npm:
npm install express-rate-limitGrundlegende Verwendung
Das einfachste Beispiel ist die Begrenzung aller Routen der Anwendung auf 100 Anfragen pro Stunde von einer IP-Adresse:
const rateLimit = require('express-rate-limit');const express = require('express');const app = express();
// Limiter erstellenconst limiter = rateLimit({ windowMs: 60 * 60 * 1000, // 1 Stunde max: 100, // maximal 100 Anfragen message: 'Zu viele Anfragen von Ihrer IP. Bitte versuchen Sie es später erneut.', standardHeaders: true, // Gibt Standard-Header RateLimit-* zurück legacyHeaders: false, // Deaktiviert X-RateLimit-* Header});
// Auf alle Routen anwendenapp.use(limiter);
app.get('/', (req, res) => { res.send('Startseite');});
app.listen(3000, () => { console.log('Server läuft auf Port 3000');});Konfiguration für verschiedene Routen
Häufig sind unterschiedliche Begrenzungen für verschiedene Endpunkte erforderlich. Beispielsweise kann für die Login-Route ein strengeres Limit festgelegt werden:
const rateLimit = require('express-rate-limit');
// Strenges Limit für /api/loginconst loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 Minuten max: 5, // 5 Anmeldeversuche message: { error: 'Zu viele Anmeldeversuche. Versuchen Sie es in 15 Minuten erneut.', retryAfter: 15 }, keyGenerator: (req) => { // Verwendet IP + Benutzername für genauere Sperrung return req.ip + req.body.username; }});
app.post('/api/login', loginLimiter, (req, res) => { // Authentifizierungslogik res.send('Anmeldung erfolgreich');});
// Weiches Limit für die öffentliche APIconst apiLimiter = rateLimit({ windowMs: 60 * 1000, // 1 Minute max: 30, // 30 Anfragen pro Minute message: 'API-Anfragelimit überschritten.'});
app.use('/api/', apiLimiter);Erweiterte Funktionen
Benutzerdefinierte Speicher
Standardmäßig werden Daten im Arbeitsspeicher des Prozesses gespeichert. Für die Produktion empfehlen
Auch in der Bibliothek
Konfiguration von C++-Anwendungen: Bibliotheken und Werkzeuge für flexible Einstellungen
Aufgabenwarteschlangen in Kotlin: Coroutines, Flow und Bibliotheken für die Hintergrundverarbeitung
CameraX für Kotlin: Komplettes Tutorial mit Beispielen
Arbeiten mit XML in Swift: Parsen, Erstellen und Verarbeiten von Daten (iOS/macOS)