Fungsi dan Cara Menggunakan Rate Limiting di Laravel
Dipublikasikan pada oleh Admin
Rate limiting adalah fitur penting dalam Laravel yang berfungsi untuk
membatasi jumlah permintaan (request) dari pengguna dalam periode waktu
tertentu. Dengan fitur ini, kita dapat melindungi aplikasi dari serangan
brute force, spam, dan beban berlebih pada server.
Rate limiting digunakan untuk mengontrol seberapa sering pengguna atau IP
address tertentu dapat mengakses route atau API endpoint dalam rentang waktu
tertentu. Misalnya, hanya mengizinkan 60 permintaan per menit. Jika
pengguna melebihi batas tersebut, Laravel akan mengembalikan respons
Laravel menyediakan beberapa komponen bawaan untuk mengatur rate limiting:
Biasanya didefinisikan di
Kode di atas membuat rate limiter bernama
Setelah limiter dibuat, hubungkan ke route menggunakan middleware:
Middleware
Jika tidak ingin membuat limiter terpisah, kamu bisa menggunakan format
langsung:
Kamu juga bisa memeriksa batas secara manual dalam controller:
Pendekatan ini cocok untuk membatasi tindakan tertentu seperti mengirim email
atau SMS.
Kamu dapat menyesuaikan aturan berdasarkan kondisi pengguna, misalnya:
Dengan aturan ini, pengguna premium memiliki batas upload lebih tinggi
dibandingkan pengguna biasa.
Laravel juga menyediakan fitur pembatasan untuk job dalam queue menggunakan
Redis:
Kode di atas memastikan hanya ada 10 job yang berjalan setiap 5 detik.
Jika pengguna melakukan lebih dari 5 percobaan login per menit, sistem akan
otomatis menolak permintaan dan mengembalikan kode 429.
Fungsi dan Cara Menggunakan Rate Limiting di Laravel
1. Apa Itu Rate Limiting?
HTTP 429 (Too Many Requests).
2. Fungsi dan Manfaat Rate Limiting
3. Komponen Utama Rate Limiting di Laravel
Limit::perMinute(60).
4. Cara Mengatur Rate Limiting
4.1 Menentukan Rate Limiter
App\Providers\RouteServiceProvider:
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Http\Request;
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
api yang
membatasi 60 request per menit berdasarkan user ID atau alamat IP.
4.2 Menggunakan Middleware Throttle
Route::middleware(['throttle:api'])->group(function () {
Route::get('/user', [UserController::class, 'index']);
});
throttle:api akan otomatis menggunakan aturan yang
telah kamu definisikan di limiter sebelumnya.
4.3 Menggunakan Parameter Langsung
Route::get('/limited', function () {
return 'OK';
})->middleware('throttle:10,1'); // Maksimum 10 request per menit
4.4 Menggunakan RateLimiter Secara Manual
use Illuminate\Support\Facades\RateLimiter;
$key = 'send-message:' . $user->id;
if (RateLimiter::tooManyAttempts($key, 5)) {
$seconds = RateLimiter::availableIn($key);
return response()->json(['message' => "Tunggu $seconds detik"], 429);
}
RateLimiter::hit($key, 60);
5. Membuat Rate Limiter Khusus
RateLimiter::for('uploads', function (Request $request) {
if ($request->user()?->isPremium()) {
return Limit::perMinute(200)->by($request->user()->id);
}
return Limit::perMinute(50)->by($request->ip());
});
6. Job Throttling (Batas untuk Queue)
Redis::throttle('send-mails')
->allow(10)
->every(5)
->then(function () {
// Jalankan job
}, function () {
// Jika melewati batas, coba lagi nanti
});
7. Contoh Implementasi Lengkap
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)->by($request->ip());
});
Route::post('/login', [AuthController::class, 'login'])
->middleware('throttle:login');
8. Tips dan Praktik Terbaik
X-RateLimit agar client tahu batasnya.RateLimiter::clear() jika aksi sudah
berhasil.