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 →

Struktur Website yang Baik untuk SEO

Apa itu Struktur Website? Struktur website adalah susunan halaman dan hubungan an...

Baca Selengkapnya →

Cara Membuat Website Tanpa Coding untuk Pemula dan Profesional

Cara Membuat Website Tanpa Coding untuk Pemula dan Profesional dengan WordPress ...

Baca Selengkapnya →

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 →

Jasa Pembuatan Website Surabaya

Jasa Pembuatan Website Surabaya Profesional – Deby Sejahtera Surabaya sebagai kota ...

Baca Selengkapnya →

Perkenalkan Usahamu kepada Dunia

Pendahuluan Di era digital saat ini, kehadiran online merupakan salah satu ...

Baca Selengkapnya →

cara mengatasi deadlock dalam transaksi database di Laravel

Cara Mengatasi Deadlock dalam Transaksi Database di Laravel Deadlock dalam da...

Baca Selengkapnya →