Dalam mengembangkan aplikasi web modern, menjaga keamanan dan performa sistem menjadi prioritas utama. Salah satu fitur unggulan di Laravel yang mendukung hal ini adalah fitur Rate Limiting. Fitur ini memungkinkan kita para developer untuk mengontrol jumlah request yang dapat dilakukan ke aplikasi dalam waktu tertentu.
Apa itu Rate Limiting?
Rate Limiting atau juga dikenal Rate Limiter adalah mekanisme untuk membatasi jumlah HTTP Request yang dapat dilakukan oleh pengguna atau alamat IP ke suatu endpoint dalam periode waktu tertentu. Tujuannya adalah untuk mencegah penyalahgunaan sumber daya, melindungi aplikasi dari cyber attack seperti brute force, dan menjaga performa server agar tetap optimal.
Di Laravel 12, fitur Rate Limiting telah ditingkatkan dengan kemampuan yang lebih fleksibel, termasuk dukungan untuk pembatasan request per detik, tidak hanya per menit seperti pada versi sebelumnya.
Bagaimana Rate Limiting Bekerja?
Laravel 12 menyediakan middleware bawaan bernama throttle
yang mempermudah penerapan Rate Limiting. Middleware ini memungkinkan kita untuk menentukan batas jumlah permintaan dan durasi waktu dengan pendeketan yang sederhana. Berikut adalah cara kerja dasar rate limiting di Laravel:
- Rate Limiting dapat diterapkan berdasarkan alamat IP, ID pengguna, atau kombinasi lainnya.
- Developer menentukan jumlah maksimum permintaan yang diizinkan dalam periode waktu tertentu, misalnya 60 request per menit.
- Laravel menggunakan sistem cache untuk melacak jumlah permintaan dan waktu kedaluwarsa.
- Jika batas request terlampaui, Laravel akan mengembalikan respons HTTP 429 (Too Many Requests) secara otomatis.
Implementasi Rate Limiting di Laravel 12
Berikut adalah langkah-langkah implementasi Rate Limiting di Laravel 12:
- Throttle Middleware
Cara paling sederhana yaitu menggunakan middleware throttle
pada route.
Route::post('/login-process', [LoginController::class, 'process'])->middleware('throttle:10,1');
// group route
Route::middleware('throttle:10,1')->group(function () {
// Routes
});
Kode diatas akan membatasi HTTP Request untuk login menjadi 10 request per menit.
- Custom Rate Limiter
Jika memang membutuhkan kostumisasi pada Rate Limiter, kita bisa membuat kostumisasi tersebut melalui file /bootstrap/app.php
atau AppServiceProvider.php
pada method boot
.
- bootstrap/app.php
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
apiPrefix: '/api', // set prefix api routes
then: function () {
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
)
->create();
- AppServiceProvider.php
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
Setelah itu definisikan ke middleware pada route.
use Illuminate\Support\Facades\Route;
Route::middleware('throttle:api')->group(function () {
// Routes
});
Semua route yang berawalan /api
akan dibatasi 60 request per menit berdasarkan ID penguna atau alamat IP.
- Custom Error Message
Jika pengguna melampaui batas request, maka akan mendapatkan response 429 Too Many Request. Kita bisa melakukan kostumisasi pesan error tersebut pada file /bootstrap/app.php
.
use Illuminate\RateLimiting\TooManyRequestsException;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
apiPrefix: '/api', // set prefix api routes
then: function () {
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
)
->withMiddleware()
->withExceptions(function (Exceptions $exceptions) {
$exceptions->render(function (TooManyRequestsException $e) {
return response()->json([
'message' => 'Rate limit reached. Please wait a moment before trying again.'
], 429);
});
})
->create();
Best Practices Menggunakan Rate Limiting
Agar implementasi Rate Limiting efektif, berikut beberapa tips yang dapat diikuti:
- Tentukan batas permintaan yang sesuai dengan jenis endpoint. Misalnya, endpoint login mungkin memerlukan batasan lebih ketat (contoh: 10 permintaan per menit) dibandingkan endpoint publik.
- Gunakan Redis untuk Skalabilitas: Redis adalah pilihan ideal untuk menyimpan data rate limiting karena kecepatan dan efisiensinya.
- Pastikan pesan error yang ditampilkan mudah dipahami oleh pengguna, sehingga mereka tahu kapan bisa mencoba lagi.
- Gunakan tools seperti Laravel Telescope atau log server untuk memantau pola permintaan dan menyesuaikan konfigurasi rate limiting jika diperlukan.
Baca Artikel Terkait Laravel Telescope
Kesimpulan
Rate Limiting pada Laravel 12 adalah fitur yang sangat powerful untuk menjaga keamanan dan performa dalam aplikasi yang kita kembangkan. Dengan middleware throttle
dan API RateLimiter
, kita dapat dengan mudah mengatur batasan permintaan sesuai kebutuhan, mulai dari batasan sederhana hingga konfigurasi kustom yang kompleks. Fitur ini tidak hanya mudah diterapkan, tetapi juga memberikan dampak besar dalam melindungi aplikasi dari cyber attack dan memastikan pengalaman pengguna yang optimal.
Terimakasih