Untuk memperkuat lapisan otentikasi Laravel, fokus pertama adalah memastikan validasi auth dan session saling berkoordinasi dengan konfigurasi cookie yang benar dan pemeriksaan input yang tegas. Bila laravel menangani sesi sensitif, kombinasi validasi, penegakan cookie secure, dan mekanisme deteksi penyalahgunaan mencegah serangan seperti credential stuffing dan session hijacking.

Koordinasi Validasi Auth dan Session Secure

Pastikan guard dan middleware auth tidak hanya mengandalkan autentikasi, tetapi juga validasi input dan konfigurasi session. Gunakan Validator::validate() dengan rules eksplisit pada controller login, kemudian periksa kesesuaian guard sebelum memanggil Auth::login(). Contoh:

public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => ['required', 'email'],
        'password' => ['required'],
        'otp' => ['required', 'digits:6'],
    ]);

    if (! $this->guard()->attempt([$credentials['email'], $credentials['password']])) {
        throw ValidationException::withMessages(['email' => 'Kredensial tidak valid']);
    }

    session()->regenerate();

    return redirect()->intended('/dashboard');
}

Selalu panggil session()->regenerate() setelah login berhasil untuk mencegah fixation. Pada file config/session.php, aktifkan cookie yang aman dan HttpOnly serta gunakan 'same_site' => 'lax' atau 'strict' untuk mengurangi risiko CSRF. Pastikan juga menggunakan environment var SESSION_DRIVER yang mendukung keamanan (misalnya redis). Contoh pengaturan:

'secure' => env('SESSION_SECURE_COOKIE', true),
'http_only' => true,
'same_site' => 'lax',
'domain' => env('SESSION_DOMAIN', null),

Uji dengan browser (atau curl) untuk memastikan header Set-Cookie memuat flag tersebut. Jangan lupa menyamakan SESSION_DOMAIN dan konfigurasi load balancer jika memakai subdomain.

Deteksi Hijacking dan Pemulihan Session

Anda bisa menyimpan fingerprint session (IP, user agent hash) saat login dan membandingkan pada setiap request sensitif. Implementasi sederhana:

protected function booted()
{
    $this->middleware(function ($request, $next) {
        $fingerprint = hash('sha256', $request->ip().$request->userAgent());
        if (session('fingerprint') && session('fingerprint') !== $fingerprint) {
            Auth::logout();
            session()->invalidate();
            return redirect()->route('login')->withErrors('Session dicurigai dibajak.');
        }
        session(['fingerprint' => $fingerprint]);
        return $next($request);
    });
}

Gunakan rate limiter (Laravel Throttle) untuk membatasi percobaan, dan tulis log event di tabel audit (lihat bagian audit) untuk pemulihan. Bila deteksi terjadi, kirim pemberitahuan ke tim keamanan untuk segera menonaktifkan session atau memaksa reset password.

Rotasi APP_KEY dan Secret dengan Zero Downtime

Rotasi APP_KEY harus dilakukan secara terkoordinasi agar tidak memvalidasi token lama. Pendekatan praktis:

  1. Gunakan key lama dan baru secara paralel. Simpan APP_KEY_PREVIOUS di environment.
  2. Perbarui config/app.php untuk memeriksa fallback key ketika decrypt gagal.
  3. Stocken cache konfigurasi: jalankan php artisan config:cache setelah update.

Contoh pengecekan fallback:

protected function getApplicationKey()
{
    return config('app.key') ?: env('APP_KEY_PREVIOUS');
}

Dalam proses deployment, roll out key baru ke satu instance terlebih dahulu dan biarkan instance lain memakai key lama hingga semua siap. Sinkronkan rotasi secret dari layanan pihak ketiga (misalnya OTP provider) dengan mengatur config/services.php untuk membaca dari key yang sama. Selalu lakukan backup database laravel sebelum rotasi, dan verifikasi queue/workers ikut memuat key baru (restart queue worker).

Rate Limit Login dan OTP

Laravel ThrottleRequests bisa dikustomisasi untuk login. Tambahkan middleware di route auth:

Route::post('login', [LoginController::class, 'login'])->middleware('throttle:login,10,1');

Atur rate limiter di App\\Providers\\RouteServiceProvider:

RateLimiter::for('login', function (Request $request) {
    return Limit::perMinute(5)->by($request->ip().$request->input('email'));
});

Untuk OTP, gunakan cache store terdistribusi (Redis) dan simpan hitungan percobaan per nomor. Reset hitungan saat OTP valid, dan tambahkan waktu tunggu eksponensial jika terlalu banyak gagal. Berikan respon API standard (429) supaya klien dapat menampilkan pesan yang tepat.

Audit Log dan Monitoring untuk Respon Abuse

Buat tabel audit seperti auth_activity_logs dengan kolom: user_id, event, ip_address, user_agent, metadata. Setiap event penting (login gagal, token refresh, invalid session) harus dicatat.

Integrasikan monitoring dengan tools seperti Laravel Telescope, Sentry, atau Prometheus untuk memantau:

  • Lonjakan error auth
  • Peningkatan rate limit
  • Coba login berulang tanpa keberhasilan

Atur alert agar bila threshold terlampaui, sistem mengaktifkan mitigasi otomatis (misalnya memaksa semua token refresh, men-trigger queue job pembersihan session). Gunakan webhook pada tool monitoring untuk memanggil endpoint internal yang men-disable akun sementara.

Kesimpulan

Dengan mengorkestrasi validasi auth, konfigurasi session aman, deteksi hijacking, rotasi secret tanpa downtime, rate limit login/OTP, dan audit bersama monitoring, lapisan otentikasi Laravel menjadi lebih tangguh. Pastikan setiap lapisan diuji secara otomatis dan log monitoring terus terpantau agar strategi anti-abuse tetap efektif.