RESTForge

Rate Limit

Pembatasan jumlah request per endpoint atau per IP

Rate Limiting adalah mekanisme pembatasan jumlah request yang diterima server dari satu IP address dalam periode waktu tertentu. Fitur ini melindungi API dari penyalahgunaan seperti brute force, scraping berlebihan, atau lonjakan request yang tidak terkendali.

Referensi Cepat (Quick Reference)

PropertiNilai
AktivasiRATE_LIMIT_ENABLED=true di file .env
Store (single mode)In-memory
Store (cluster mode)Redis
HTTP response saat limit tercapai429 Too Many Requests
Response headersX-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, Retry-After
Endpoint yang dilindungiSemua endpoint di bawah path /api
Graceful degradationJika store error, request tetap diteruskan

Konfigurasi (Configuration)

config/production.env
RATE_LIMIT_ENABLED=true
RATE_LIMIT_WINDOW_MS=60000
RATE_LIMIT_MAX_REQUESTS=100
ParameterDefaultSatuanKeterangan
RATE_LIMIT_ENABLEDfalseMengaktifkan fitur rate limiting
RATE_LIMIT_WINDOW_MS60000msPeriode waktu untuk menghitung jumlah request per IP
RATE_LIMIT_MAX_REQUESTS100requestJumlah maksimal request yang diizinkan per IP dalam satu window

Contoh Konfigurasi (Configuration Examples)

SkenarioWindowMax Requests
Development60000 (1 menit)1000
API Internal (traffic sedang)60000 (1 menit)200
API Publik (proteksi ketat)60000 (1 menit)60

Store Berdasarkan Mode Server (Store by Server Mode)

Mode ServerStoreKeterangan
Single modeIn-memoryCounter disimpan di memory process, Redis tidak diperlukan
Cluster modeRedisCounter di-share antar worker agar rate limiting akurat secara global

Pada cluster mode tanpa Redis, setiap worker memiliki counter sendiri sehingga satu IP bisa melewati batas dengan faktor jumlah worker. Redis memastikan counter global yang akurat.

Rate limiting, cache, dan distributed lock adalah tiga fitur yang independen. Ketiganya menggunakan Redis sebagai backend (pada kondisi tertentu), tetapi tidak saling bergantung.

Response Headers

Rate limiter menambahkan header informatif di setiap response:

HeaderKeteranganContoh
X-RateLimit-LimitJumlah maksimal request per window100
X-RateLimit-RemainingSisa request yang diizinkan dalam window ini87
X-RateLimit-ResetWaktu (detik) sampai window di-reset45
Retry-AfterWaktu tunggu sebelum retry, hanya muncul saat 42945

Contoh Response Normal (200 OK)

HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 45

Contoh Response Rate Limited (429)

{
    "success": false,
    "error": "Too Many Requests",
    "message": "Rate limit exceeded. Please try again later.",
    "retryAfter": 45
}

Cara Kerja (How It Works)

Request Masuk

  ├── Rate limit aktif?
  │     ├── Tidak → Request langsung diteruskan
  │     └── Ya → Identifikasi client IP → Increment counter di store
  │               ├── Counter ≤ maxRequests → Set headers → Teruskan request
  │               └── Counter > maxRequests → HTTP 429 + Retry-After header

  └── Store error? → Log warning, request tetap diteruskan (graceful degradation)

Rate limiter menggunakan fixed window counter. Setiap IP memiliki counter yang di-reset setelah window berakhir. Pada cluster mode, counter disimpan di Redis menggunakan Lua script atomic (INCR + EXPIRE dalam satu operasi).

Pemecahan Masalah (Troubleshooting)

MasalahPenyebabSolusi
Rate limit tidak aktifRATE_LIMIT_ENABLED tidak di-set atau falseSet RATE_LIMIT_ENABLED=true di file .env
Server menolak start (cluster mode)Redis tidak dapat diaksesPeriksa REDIS_HOST dan REDIS_PORT
Request tetap diterima melebihi limitRedis down setelah startup (graceful degradation)Periksa dan pulihkan koneksi Redis
Header X-RateLimit-* tidak munculRate limit tidak aktif atau module belum di-generate ulangVerifikasi konfigurasi dan generate ulang module

Langkah Selanjutnya (Next Steps)

On this page