Fungsi dan Cara Menggunakan Rate Limiting di Laravel

Dipublikasikan pada oleh Admin

Website Custom vs Template

Fungsi dan Cara Menggunakan Rate Limiting di Laravel

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.

1. Apa Itu Rate Limiting?

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 HTTP 429 (Too Many Requests).

2. Fungsi dan Manfaat Rate Limiting

  • Mencegah penyalahgunaan API dan serangan DDoS.
  • Melindungi fitur login dari percobaan brute force.
  • Menjaga performa dan stabilitas server.
  • Membatasi penggunaan API berdasarkan level pengguna (free/premium).
  • Memberi pengalaman yang adil bagi seluruh pengguna.

3. Komponen Utama Rate Limiting di Laravel

Laravel menyediakan beberapa komponen bawaan untuk mengatur rate limiting:

  • RateLimiter Facade – digunakan untuk mendefinisikan aturan pembatasan.
  • Limit Class – digunakan untuk menentukan berapa banyak request yang diizinkan, misalnya Limit::perMinute(60).
  • Middleware ThrottleRequests – middleware bawaan yang memeriksa apakah request masih dalam batas.
  • Cache Driver – tempat Laravel menyimpan data hit rate limit.

4. Cara Mengatur Rate Limiting

4.1 Menentukan Rate Limiter

Biasanya didefinisikan di 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());
    });
}
  

Kode di atas membuat rate limiter bernama api yang membatasi 60 request per menit berdasarkan user ID atau alamat IP.

4.2 Menggunakan Middleware Throttle

Setelah limiter dibuat, hubungkan ke route menggunakan middleware:


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

Middleware throttle:api akan otomatis menggunakan aturan yang telah kamu definisikan di limiter sebelumnya.

4.3 Menggunakan Parameter Langsung

Jika tidak ingin membuat limiter terpisah, kamu bisa menggunakan format langsung:


Route::get('/limited', function () {
    return 'OK';
})->middleware('throttle:10,1'); // Maksimum 10 request per menit
  

4.4 Menggunakan RateLimiter Secara Manual

Kamu juga bisa memeriksa batas secara manual dalam controller:


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);
  

Pendekatan ini cocok untuk membatasi tindakan tertentu seperti mengirim email atau SMS.

5. Membuat Rate Limiter Khusus

Kamu dapat menyesuaikan aturan berdasarkan kondisi pengguna, misalnya:


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());
});
  

Dengan aturan ini, pengguna premium memiliki batas upload lebih tinggi dibandingkan pengguna biasa.

6. Job Throttling (Batas untuk Queue)

Laravel juga menyediakan fitur pembatasan untuk job dalam queue menggunakan Redis:


Redis::throttle('send-mails')
    ->allow(10)
    ->every(5)
    ->then(function () {
        // Jalankan job
    }, function () {
        // Jika melewati batas, coba lagi nanti
    });
  

Kode di atas memastikan hanya ada 10 job yang berjalan setiap 5 detik.

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');
  

Jika pengguna melakukan lebih dari 5 percobaan login per menit, sistem akan otomatis menolak permintaan dan mengembalikan kode 429.

8. Tips dan Praktik Terbaik

  • Gunakan cache driver seperti Redis untuk performa lebih baik.
  • Berikan batas berbeda untuk user premium dan user biasa.
  • Gunakan header X-RateLimit agar client tahu batasnya.
  • Hindari batas terlalu ketat agar pengguna sah tidak terblokir secara tidak sengaja.
  • Reset percobaan dengan RateLimiter::clear() jika aksi sudah berhasil.

← cara mengatasi deadlock dalam transaksi database di Laravel Implementasi JWT (JSON Web Token) di Laravel →

cara agar jualan laris manis utamanya untuk warga Sidoarjo

Ingin Bisnis di Sidoarjo Laris Manis? Ini Rahasia yang Wajib Anda Ketahui Di Sidoarjo, persaing...

Baca Selengkapnya →

Panduan dan tips agar website muncul di pencarian Google

Panduan dan Tips Agar Website Muncul di Pencarian Google Memiliki website saj...

Baca Selengkapnya →

Capek Follow Up Klien Sendiri? Saatnya Punya Sistem yang Kerja Otomatis! | Deby Sejahtera

Kenapa banyak peluang hilang? Respon lambat → calon pelangg...

Baca Selengkapnya →

Fungsi Landing Page dalam Website

Dalam dunia digital marketing, landing page memiliki peran yang sangat penting. Halaman ini bi...

Baca Selengkapnya →

9 Alat Content Marketing untuk Memaksimalkan Strategi Konten - Bag 1

9 Alat Content Marketing yang Bisa Kamu Gunakan Content marketing tidak hanya soal ...

Baca Selengkapnya →

Bangun Bisnis Modern: Website Custom, Kasir Pintar & CRM Cerdas

Pendahuluan Di era persaingan bisnis yang semakin ketat, digitalisasi bukan s...

Baca Selengkapnya →