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 →

6 Kesalahan SEO Fatal yang Sering Bikin Website Zonks

source image : https://www.freepik.com/free-vector/seo-analysis-isometric-composition-with-web-opt...

Baca Selengkapnya →

Jasa Pembuatan Website Sidoarjo

Jasa Pembuatan Website Sidoarjo Profesional & Terpercaya – Deby Sejahtera Di er...

Baca Selengkapnya →

Struktur Website yang Baik untuk SEO

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

Baca Selengkapnya →

TIPS #3 Tutorial CRUD Laravel dan AJAX (2 Part) - Part 2

Part 2: Implementasi AJAX di Frontend Bagian ini fokus pada interaksi AJA...

Baca Selengkapnya →

TIPS #2 Tutorial CRUD Laravel dan AJAX (2 Part) - Part 1

Tutorial CRUD Laravel dan AJAX (2 Part) Panduan step-by-step membuat CRUD (Create...

Baca Selengkapnya →

Jasa Pembuatan Website Surabaya

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

Baca Selengkapnya →