Laravel Rate Limiting Throttling Policies API Access
Definisi
Throttling/rate limiting membatasi jumlah request yang boleh masuk dalam jendela waktu tertentu. Policies adalah otorisasi deklaratif untuk menentukan apakah user boleh melakukan aksi pada resource tertentu. Keduanya sering dipakai bersama untuk mengamankan API.
Kapan dipakai
- Throttle: lindungi endpoint dari abuse, brute force, atau traffic berlebih (login, API publik, upload).
- Policy: otorisasi bisnis ("user boleh edit post ini?") yang lebih terstruktur dari gate mentah.
- Gabungkan keduanya di route API: throttle cegah flood, policy cegah akses tidak berhak.
Cara kerja
Throttle middleware
Route::middleware('throttle:60,1')->group(function () {
Route::post('/api/orders', [OrderController::class, 'store']);
});Artinya: maksimal 60 request per 1 menit per user/IP.
Named limiter
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::for('api', function ($request) {
return Limit::perMinute(100)->by($request->user()?->id ?: $request->ip());
});Lalu pakai throttle:api.
Policy
// app/Policies/PostPolicy.php
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}Daftarkan lewat Gate::policy atau AuthServiceProvider. Pakai di controller:
$this->authorize('update', $post);Struktur alur
Loading diagram...
Contoh kombinasi
Route::post('/api/posts/{post}', function (Request $request, Post $post) {
$request->user()->can('update', $post); // otomatis via authorize
// throttle sudah di level route group
});Catatan implementasi
- Gunakan
by()agar limit per-user, bukan cuma per-IP (IP bisa dipakai bersama banyak user). - Return
Limit::perMinute(n)->response(fn () => response('slow down', 429))untuk pesan custom. - Policy lebih baik dari gate mentah untuk resource spesifik karena otomatis resolve model dan type-hint.
Kesalahan umum
- Hanya throttle tanpa policy: request lolos flood tapi user akses data orang lain.
- Hanya policy tanpa throttle: endpoint rawan abuse meski aksesnya sah.
- Limit per-IP di belakang proxy/shared: banyak user kelihatan satu IP, batas mudah terpicu. Pakai user id bila login.
- Lupa
authorizedipanggil: controller tetap jalan padahal seharusnya diblokir. - Rate limit key tabrakan: dua route pakai limiter sama dengan key sama, saling memotong kuota.