RateLimiter Facade dan Throttle Laravel
Definisi
RateLimiter adalah facade Laravel untuk membatasi jumlah aksi dalam jendela waktu (misal 5 percobaan login tiap 1 menit). Ia menyimpan counter di cache (biasanya Redis/array). throttle middleware memakai mekanisme ini untuk membatasi request HTTP per IP/key.
Kapan dipakai
- Batasi percobaan login, reset password, OTP, API call per user.
- Lindungi endpoint dari abuse/brute force.
- Untuk throttling HTTP sederhana, cukup pakai middleware
throttledi route; untuk logika kustom (misal per-user), pakai facadeRateLimiterlangsung.
Cara kerja
Throttle middleware di route
Route::post('/login', [AuthController::class, 'login'])
->middleware('throttle:5,1'); // 5 request per 1 menitPakai facade RateLimiter
use Illuminate\Support\Facades\RateLimiter;
$key = 'login:' . $request->ip();
if (RateLimiter::tooManyAttempts($key, 5)) {
$seconds = RateLimiter::availableIn($key);
return response("Coba lagi dalam $seconds detik", 429);
}
// ... proses login ...
RateLimiter::hit($key); // tambah 1
// kalau gagal: RateLimiter::clear($key);Respon 429 otomatis dengan header
return response()->json(['msg' => 'too many'], 429)
->header('Retry-After', RateLimiter::availableIn($key));Struktur alur
Loading diagram...
Contoh custom key per user
$key = 'otp:' . $user->id;
RateLimiter::hit($key, 60); // window 60 detikCatatan implementasi
- Key harus unik dan stabil (IP, user id, kombinasi). Jangan pakai data acak.
- Pilih cache store yang persisten antar node (Redis) bila aplikasi di banyak server;
arraydriver tidak share. throttlemiddleware menerimamaxAttempts, decayMinutesatau named limiter diRouteServiceProvider.RateLimiter::clear($key)saat aksi berhasil (login sukses) agar counter reset.
Kesalahan umum
- Key acak/berubah: throttle tidak pernah kehitung, abuse lolos.
- Driver array di multi-server: counter tidak sinkron.
- Lupa clear saat sukses: user terkunci padahal sudah benar.
- Decay terlalu kecil: user legit ikut keblokir.