preloader

Rate Limiting API: Pengertian dan Cara Menerapkannya

Ilustrasi rate limiting yang membatasi request ke server API

Bayangkan API Anda tiba-tiba menerima ribuan request dalam satu menit. Server melambat, database kewalahan, lalu aplikasi akhirnya tidak bisa diakses. Rate limiting adalah salah satu cara paling efektif untuk mencegah kejadian seperti itu. Dalam artikel ini, kita akan membahas pengertian, manfaat, algoritma, dan cara menerapkan rate limiting di aplikasi Anda.

Apa Itu Rate Limiting?

Rate limiting adalah teknik untuk membatasi jumlah request yang boleh dikirim seorang pengguna dalam rentang waktu tertentu. Misalnya, satu alamat IP hanya boleh mengirim 60 request per menit. Jika batas itu terlampaui, server menolak request berikutnya sampai jendela waktu berganti.

Server biasanya menolak dengan kode status HTTP 429 Too Many Requests. Kode ini memberi tahu klien bahwa ia harus menunggu sebelum mencoba lagi. Anda bisa membaca spesifikasinya di dokumentasi MDN tentang status 429.

Mengapa Rate Limiting Penting?

Banyak pengembang baru memikirkan rate limiting setelah server bermasalah. Padahal, fitur ini sebaiknya ada sejak awal. Berikut manfaat utamanya:

  • Mencegah brute force. Penyerang tidak bisa menebak password ribuan kali di endpoint login.
  • Melindungi performa server. Beban tetap stabil walau ada lonjakan traffic.
  • Menekan biaya infrastruktur. Request berlebihan tidak ikut menghabiskan resource dan tagihan cloud.
  • Menjaga keadilan antar pengguna. Satu klien yang agresif tidak mengganggu pengguna lain.
  • Mengurangi risiko scraping. Bot sulit mengambil data Anda secara massal.

Selain itu, OWASP memasukkan konsumsi resource tanpa batas sebagai risiko keamanan API. Anda bisa mempelajarinya di OWASP API Security Project.

Algoritma Rate Limiting yang Umum Dipakai

Ada beberapa algoritma untuk menerapkan rate limiting. Masing-masing punya kelebihan dan kekurangan.

1. Fixed Window

Algoritma ini menghitung request dalam jendela waktu tetap, misalnya setiap menit. Cara kerjanya sederhana dan hemat memori. Namun, klien bisa mengirim dua kali lipat batas di perbatasan dua jendela waktu.

2. Sliding Window

Sliding window menghitung request dalam rentang waktu yang terus bergeser. Hasilnya lebih akurat dan lebih adil daripada fixed window. Konsekuensinya, algoritma ini memakai memori lebih banyak.

3. Token Bucket

Setiap klien memiliki “ember” berisi token. Satu request memakai satu token, dan token terisi ulang secara berkala. Karena itu, token bucket mengizinkan lonjakan singkat tanpa melanggar batas rata-rata. Banyak layanan besar memilih algoritma ini.

4. Leaky Bucket

Request masuk ke antrean dan diproses dengan kecepatan tetap. Akibatnya, trafik keluar selalu stabil. Meski begitu, request yang melebihi kapasitas antrean akan dibuang.

Cara Menerapkan Rate Limiting

Sekarang kita masuk ke praktiknya. Anda bisa menerapkan rate limiting di tiga lapisan: aplikasi, web server, atau API gateway.

Rate Limiting di Laravel

Laravel sudah menyediakan fitur ini lewat middleware throttle. Pertama, definisikan limiter di AppServiceProvider:

php

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});

Kemudian, pasang middleware pada route:

php

Route::middleware('throttle:api')->group(function () {
    Route::get('/produk', [ProdukController::class, 'index']);
});

Dengan konfigurasi ini, pengguna login dihitung berdasarkan ID, sedangkan tamu dihitung berdasarkan IP.

Rate Limiting di Node.js (Express)

Untuk Express, gunakan paket express-rate-limit:

javascript

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

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 menit
  limit: 100,
  standardHeaders: true,
  legacyHeaders: false,
  message: { error: 'Terlalu banyak request, coba lagi nanti.' },
});

app.use('/api/', limiter);

Rate Limiting di Nginx

Jika Anda ingin membatasi traffic sebelum menyentuh aplikasi, Nginx bisa melakukannya:

nginx

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        limit_req_status 429;
    }
}

Parameter rate menentukan kecepatan rata-rata, sedangkan burst mengatur toleransi lonjakan.

Praktik Terbaik Rate Limiting

Agar rate limiting bekerja efektif, perhatikan hal-hal berikut:

  1. Bedakan batas per endpoint. Endpoint login perlu batas lebih ketat daripada endpoint baca data.
  2. Kirim header yang jelas. Gunakan Retry-After supaya klien tahu kapan boleh mencoba lagi.
  3. Gunakan identitas yang tepat. IP saja kurang akurat jika banyak pengguna berbagi satu jaringan.
  4. Simpan counter di Redis. Dengan begitu, batas tetap konsisten di banyak server.
  5. Pantau log 429. Lonjakan status ini bisa menjadi tanda serangan.
  6. Beri pengecualian untuk layanan tepercaya. Contohnya webhook dari payment gateway.

Kesalahan yang Sering Terjadi

Pertama, banyak tim menetapkan batas terlalu longgar sehingga fitur ini tidak berguna. Kedua, ada juga yang menetapkan batas terlalu ketat hingga pengguna sah ikut terblokir. Terakhir, sebagian pengembang lupa menguji rate limiting di lingkungan staging. Karena itu, lakukan uji beban sebelum rilis dan sesuaikan angkanya dengan pola penggunaan nyata.

Kesimpulan

Rate limiting adalah lapisan pertahanan dasar yang wajib ada pada setiap API. Teknik ini melindungi server dari penyalahgunaan, menjaga performa, dan menekan biaya. Mulailah dengan algoritma sederhana seperti fixed window, lalu tingkatkan ke token bucket atau sliding window saat kebutuhan bertambah. Dengan konfigurasi yang tepat, aplikasi Anda akan lebih aman dan stabil.

Apakah Anda sudah menerapkan rate limiting di proyek Anda? Bagikan pengalaman Anda di kolom komentar.

blogs.powercode.id

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *