Rate Limiting membatasi jumlah request yang bisa dikirim client dalam periode waktu tertentu.
Mengapa penting:
- Mencegah abuse dan DDoS attack
- Menjaga performa server tetap stabil
- Memastikan fair usage antar pengguna
- Mengontrol biaya infrastructure
Algoritma umum:
- Token Bucket: setiap user punya "ember" berisi token. Setiap request mengambil 1 token. Token diisi ulang secara berkala.
- Sliding Window: hitung request dalam window waktu yang bergeser. Misal: max 100 request per 15 menit.
- Fixed Window: hitung request per periode tetap (misal per menit). Sederhana tapi bisa ada burst di pergantian window.
Implementasi dengan express-rate-limit:
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 menit
max: 100, // max 100 request per window
message: { error: "Too many requests, coba lagi nanti" },
});
app.use("/api/", limiter);
Rate Limit Headers:
X-RateLimit-Limit: 100 → max request per window
X-RateLimit-Remaining: 42 → sisa request
X-RateLimit-Reset: 1625097600 → kapan reset (Unix timestamp)
Status code 429 Too Many Requests:
{
"error": {
"code": "RATE_LIMITED",
"message": "Terlalu banyak request. Coba lagi dalam 10 menit.",
"retry_after": 600
}
}
Per-user vs Per-IP:
- Per-IP: sederhana, tapi banyak user bisa share 1 IP (NAT/proxy)
- Per-user: lebih akurat, tapi butuh autentikasi
- Kombinasi: per-IP untuk public endpoint, per-user untuk authenticated endpoint