Memperkuat Autentikasi Laravel berarti memastikan proses login tidak hanya benar secara teknis tapi juga tahan terhadap input jahat, percobaan brute force, dan penyalahgunaan sesi. Artikel ini langsung menampilkan cara kerja validasi login, penyesuaian rate limit per pengguna atau guard, serta audit dan monitoring percobaan abuse agar kontrol tetap dapat diuji dan dipertahankan.

1. Validasi Input Login untuk Mencegah Penyalahgunaan

Validasi login adalah garis pertahanan pertama. Buat FormRequest khusus agar setiap permintaan otentikasi melewati aturan konsisten—misalnya memastikan format email, panjang password, dan nilai tambahan seperti token perangkat atau recaptcha.

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LoginRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'email' => 'required|email:rfc,dns',
            'password' => 'required|string|min:8',
            'device_id' => 'sometimes|string|max:64',
            'g-recaptcha-response' => 'sometimes|string',
        ];
    }

    public function authorize(): bool
    {
        return true;
    }
}

Dalam controller otentikasi, gunakan LoginRequest untuk menjaga agar hanya data yang terverifikasi yang diproses. Selain itu, simpan metadata seperti user agent atau IP agar middleware audit dapat menganalisis konteks percobaan login.

2. Rate Limit dan Throttle Setelah Validasi

2.1 Throttle per Pengguna dan Guard

Laravel sudah menyediakan middleware ThrottleRequests. Untuk menyesuaikan throttle berdasarkan pengguna atau guard, turunkan kelas middleware agar memakai identifier yang relevan.

use Illuminate\Routing\Middleware\ThrottleRequests;

class DynamicLoginThrottle extends ThrottleRequests
{
    protected function resolveRequestSignature($request)
    {
        $guard = $request->route()->getName() === 'admin.login'
            ? 'admin' : 'web';

        $key = $request->ip() . '|' . $guard;

        if ($request->input('email')) {
            $key .= '|' . strtolower($request->input('email'));
        }

        return sha1($key);
    }
}

Di RouteServiceProvider atau routes/web.php, pasang middleware ini dengan batas terpisah:

Route::post('/login', [AuthController::class, 'authenticate'])
    ->middleware('throttle:5,1');

Route::post('/admin/login', [AdminAuthController::class, 'authenticate'])
    ->middleware('throttle:3,1');

Bisa juga menyuntikkan middleware melalui nama alias yang terdaftar di kernel.

2.2 Penyesuaian Parameter Throttle

Gunakan parameter rate limit yang konservatif untuk area sensitif, misalnya 3-5 percobaan per menit per kombinasi IP-email. Jika aplikasi menggunakan API token atau OAuth, pertimbangkan rate limit berdasarkan token client ID dan lingkungan (produksi/QA).

Gunakan RateLimiter::for di App\Providers\RouteServiceProvider agar aturan tersentral dan mudah diuji.

3. Audit dan Logging Percobaan Login

3.1 Struktur Audit

Buat tabel audit login untuk menyimpan percobaan mencurigakan. Misalnya migrasi berikut:

Schema::create('login_attempts', function (Blueprint $table) {
    $table->id();
    $table->string('email')->nullable();
    $table->ipAddress('ip_address');
    $table->string('user_agent')->nullable();
    $table->boolean('successful');
    $table->string('reason')->nullable();
    $table->timestamp('attempted_at')->useCurrent();
    $table->string('guard')->default('web');
});

Setiap kali autentikasi gagal atau berhasil, catat entri:

LoginAttempt::create([
    'email' => $request->input('email'),
    'ip_address' => $request->ip(),
    'user_agent' => $request->userAgent(),
    'successful' => $authenticated,
    'reason' => $authenticated ? 'ok' : 'invalid_password',
    'guard' => $guard,
]);

Hal ini membantu membedakan pola abuse, misalnya banyak percobaan dari satu IP terhadap banyak akun.

3.2 Monitoring dan Notifikasi

Bangun pemeriksaan rutin (misal job scheduler) untuk mendeteksi anomali: jumlah percobaan gagal per IP dalam 15 menit, atau banyak akun yang disasar oleh satu user agent.

  • Gunakan Laravel Notifications untuk kirim email/Slack saat threshold terlewati.
  • Catat status ke observability stack (misal log terstruktur ke ELK atau sink ke DataDog).
  • Jika sistem memerlukan respons otomatis, gunakan job queue untuk mengunci user sementara atau menambahkan CAPTCHA.

Notifikasi otomatis bisa memicu arah balikan dengan Security Team sehingga reaksi terhadap serangan lebih cepat.

4. Pengujian dan Observabilitas

Pengujian harus mencakup skrip percobaan abuse:

  • Gunakan PHPUnit atau Pest untuk mensimulasikan permintaan login berulang dari IP yang sama, memverifikasi bahwa rate limit diaktifkan.
  • Uji validasi dengan kombinasi input tidak valid (email, password, missing fields) agar tidak ada bypass.
  • Verifikasi audit tercatat saat login gagal dan sukses.

Untuk observabilitas produksi, aktifkan Laravel Telescope di environment pengembangan atau gunakan middleware logging terpusat. Pantau metrik rata-rata kesalahan 401/429 dan rate limit hits untuk melihat pola yang bisa menjadi indikator abuse.

5. Penutup

Memperkuat Autentikasi Laravel dengan validasi terstruktur, throttle yang disesuaikan, serta audit percobaan login menciptakan pertahanan berlapis yang dapat diuji dan dipantau. Pendekatan ini memberi tim keamanan visibilitas terhadap abuse sekaligus menjaga pengalaman pengguna dengan penyesuaian rate limit yang tepat.