Ratenbegrenzung
Regeln
- Verwende Token Bucket für API-Endpunkte, Sliding Window für Auth/Login-Routen
- Identifiziere Aufrufer zuerst über API-Key, Fallback auf IP – niemals nur mit IP bei authentifizierten Routen
- Gib
429 Too Many Requests mit Retry-After-Header (Sekunden) und X-RateLimit-Remaining-Header zurück
- Speichere Zähler in Redis (oder Upstash für Serverless) – niemals im lokalen Speicher bei Multi-Instanz-Bereitstellungen
- Setze sinnvolle Standardwerte: 100 req/min für allgemeine API, 5 req/min für Auth, 1000 req/min für Lesevorgänge
- Verwende
@upstash/ratelimit für Serverless – es kümmert sich nativ um Redis-Atomizität und Sliding Window
- Implementiere Ratenbegrenzung als Middleware – global anwenden, pro Route mit strengeren Limits überschreiben
- Für Next.js: Ratenbegrenzung in middleware.ts oder API-Route-Handlern, nicht in React-Komponenten
- Trenne Limits nach Tarifen: Free, Pro, Enterprise – speichere Tarif im JWT oder per Datenbankabfrage
- Protokolliere Ratenbegrenzungsereignisse mit Aufruferidentität – erkenne frühzeitig Missbrauchsmuster
Muster
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
analytics: true,
});
const { success, limit, remaining, reset } = await ratelimit.limit(identifier);
Zu vermeiden
- Ratenbegrenzung im lokalen Speicher in Serverless- oder Multi-Instanz-Setups – Zustand geht zwischen Aufrufen verloren
- Ratenbegrenzung nur auf Anwendungsebene – füge auch CDN/Edge-Limits hinzu (Cloudflare, Vercel)
- Blockieren legitimer Benutzer mit zu strengen Limits – starte großzügig, verschärfe basierend auf Daten
- Vergiss nicht, Webhooks und öffentliche Formularübermittlungen zu begrenzen