API Rate Limiting: Cara Kerja, Algoritma, dan Contoh Implementasi

API rate limiting adalah teknik yang digunakan untuk membatasi jumlah permintaan (requests) yang dapat dilakukan oleh klien ke sebuah server API dalam rentang waktu tertentu. Mekanisme ini berfungsi untuk mencegah penyalahgunaan layanan, serangan DDoS, serta menjaga kestabilan infrastruktur backend dari lonjakan trafik yang tidak terduga.

Ketika batas (limit) terlampaui, server biasanya akan merespons dengan kode status HTTP 429 Too Many Requests. Pembatasan ini dapat diterapkan berdasarkan alamat IP, kunci API (API Key), atau token autentikasi pengguna.

Algoritma Rate Limiting Populer

Dalam arsitektur perangkat lunak modern, terdapat beberapa pendekatan algoritma yang umum digunakan untuk mengatur lalu lintas permintaan API. Setiap algoritma memiliki karakteristik performa dan penggunaan memori yang berbeda.

Algoritma Kelebihan Kekurangan
Token Bucket Memungkinkan lonjakan trafik (burst) dalam batas wajar, penggunaan memori efisien. Sedikit lebih kompleks dalam implementasi konkurensi tinggi.
Leaky Bucket Mengalirkan trafik secara konstan dan rata, menghindari lonjakan mendadak. Permintaan bisa tertunda (queue delay) jika trafik masuk terlalu cepat.
Fixed Window Counter Sangat mudah dipahami dan diimplementasikan menggunakan penyimpanan key-value. Mengalami masalah lonjakan di batas jendela waktu (spike at window boundary).
Sliding Window Log Akurat tanpa masalah lonjakan di batas waktu. Konsumsi memori tinggi karena harus menyimpan setiap timestamp permintaan.

Contoh Implementasi Sederhana dengan Node.js

Berikut adalah contoh implementasi rate limiting dasar menggunakan pustaka express-rate-limit pada kerangka kerja Express.js untuk membatasi jumlah permintaan dari satu IP.

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

const app = express();

// Konfigurasi pembatas laju
const limiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 menit
    max: 100, // Batasi setiap IP hingga 100 permintaan per windowMs
    message: 'Terlalu banyak permintaan dari IP ini, silakan coba lagi setelah 15 menit.',
    standardHeaders: true, // Kembalikan info rate limit pada header `RateLimit-*`
    legacyHeaders: false, // Nonaktifkan header `X-RateLimit-*`
});

// Terapkan pembatas ke semua rute API
app.use('/api/', limiter);

app.get('/api/data', (req, res) => {
    res.json({ message: 'Akses data berhasil.' });
});

app.listen(3000, () => {
    console.log('Server berjalan pada port 3000');
});

Header HTTP Standar untuk Rate Limiting

Server yang menerapkan pembatasan laju umumnya menyertakan informasi status pada header HTTP balasan agar klien dapat menyesuaikan pengiriman permintaan berikutnya:

  • RateLimit-Limit: Jumlah maksimum permintaan yang diizinkan dalam jendela waktu tertentu.
  • RateLimit-Remaining: Sisa kuota permintaan yang tersedia dalam jendela waktu saat ini.
  • RateLimit-Reset: Waktu dalam format detik atau timestamp ketika kuota akan diatur ulang (reset).

Praktik Terbaik Penerapan Rate Limiting

Agar sistem pembatasan berjalan efektif dan tidak merusak pengalaman pengguna (user experience), pertimbangkan beberapa langkah berikut:

  1. Gunakan penyimpanan terdistribusi seperti Redis jika aplikasi berjalan di banyak instance server (cluster/microservices).
  2. Berikan batas yang lebih longgar untuk pengguna terautentikasi (memiliki API key) dibandingkan pengguna anonim.
  3. Sertakan dokumentasi yang jelas mengenai batas kuota pada spesifikasi API publik Anda.