Autentikasi di Laravel tidak lagi sekadar urusan form login dan tabel users. Dalam praktik modern, pilihan stack autentikasi sangat dipengaruhi oleh bentuk aplikasi yang dibangun: server-rendered monolith, SPA dengan frontend terpisah, backend untuk mobile app, atau sistem dengan banyak panel admin dan banyak jenis pengguna. Di ekosistem Laravel saat ini, nama yang paling sering muncul adalah Breeze, Jetstream, Sanctum, session-based authentication, dan token API.

Masalahnya, banyak tim memilih paket berdasarkan template starter yang paling cepat jalan, bukan berdasarkan kebutuhan arsitektur jangka panjang. Akibatnya, proyek menjadi terlalu kompleks, model autentikasi tumpang tindih, atau keamanan implementasinya tidak konsisten.

Artikel ini membahas perbandingan teknis yang relevan untuk penggunaan Laravel saat ini: kapan memakai Breeze, kapan Jetstream masuk akal, kapan cukup session auth biasa, kapan Sanctum ideal untuk SPA atau mobile backend, dan kapan token API lebih cocok daripada cookie session. Fokusnya bukan sekadar “cara install”, tetapi mengapa suatu pendekatan cocok untuk konteks tertentu, beserta trade-off, implikasi keamanan, dan maintainability.

Memahami 5 Opsi Utama di Laravel

1. Session-based authentication

Ini adalah model autentikasi klasik web Laravel. Setelah login berhasil, server membuat session dan browser menyimpan cookie session. Setiap request berikutnya mengirim cookie tersebut sehingga server bisa mengenali user yang sedang login.

Pendekatan ini paling natural untuk aplikasi Laravel yang dirender dari server menggunakan Blade atau panel admin tradisional. Kelebihan utamanya adalah sederhana, aman jika dikonfigurasi benar, dan sangat cocok dengan middleware bawaan Laravel seperti auth, guest, proteksi CSRF, dan authorization policy.

Cocok untuk:

  • Aplikasi monolith berbasis Blade
  • Dashboard internal perusahaan
  • Admin panel tradisional
  • Aplikasi CRUD yang tidak memerlukan frontend terpisah

Kelebihan:

  • Implementasi paling sederhana
  • Proteksi CSRF sudah jelas polanya
  • DX tinggi untuk developer Laravel
  • Mudah dipadukan dengan middleware dan policy

Kekurangan:

  • Tidak ideal untuk mobile app native
  • Kurang fleksibel jika frontend dan backend benar-benar dipisah domain
  • Scaling lintas service lebih rumit jika arsitektur makin terdistribusi

2. Laravel Breeze

Breeze adalah starter kit autentikasi yang ringan. Ia memberi fondasi fitur umum seperti login, register, reset password, verifikasi email, dan tampilan awal yang sederhana. Secara konsep, Breeze bukan model autentikasi baru, melainkan bootstrap implementation dari auth Laravel yang sengaja dibuat minimal.

Breeze biasanya menjadi pilihan paling rasional saat Anda ingin memulai cepat tetapi tetap mempertahankan kontrol penuh terhadap struktur kode. Karena footprint-nya kecil, Breeze sangat cocok untuk tim yang ingin membangun sendiri lapisan UI, role system, atau alur onboarding tanpa harus membongkar banyak opini bawaan.

Cocok untuk:

  • Monolith Laravel baru
  • Aplikasi internal yang butuh auth standar
  • Tim yang ingin starter minimal dan mudah dimodifikasi
  • Proyek yang belum membutuhkan team management atau fitur ekstra kompleks

3. Laravel Jetstream

Jetstream adalah starter kit yang lebih opinionated dan lebih lengkap. Umumnya ia dipilih jika Anda memang membutuhkan fitur yang lebih tinggi level-nya, misalnya manajemen profil, session browser, verifikasi email, two-factor authentication, dan pada skenario tertentu fitur team management.

Jetstream sangat berguna jika kebutuhan produk memang mendekati fitur SaaS modern sejak awal. Namun, untuk aplikasi sederhana, Jetstream sering terasa terlalu berat karena membawa banyak keputusan arsitektur dan UI.

Cocok untuk:

  • Aplikasi SaaS dengan kebutuhan akun yang lebih matang
  • Produk multi-tenant ringan atau berbasis team
  • Tim yang ingin fitur auth lebih lengkap sejak awal

Trade-off utama: semakin banyak fitur siap pakai, semakin tinggi kompleksitas pemahaman dan kustomisasi.

4. Laravel Sanctum

Sanctum sering disalahpahami sebagai “paket auth untuk semua kasus”. Padahal Sanctum punya dua use case utama yang berbeda:

  • Autentikasi SPA berbasis cookie/session untuk frontend yang berkomunikasi ke Laravel via AJAX/fetch, biasanya dalam domain yang sama atau konfigurasi CORS yang terkendali.
  • API token personal untuk aplikasi mobile, integrasi pihak ketiga, atau klien non-browser.

Ini penting: jika Anda membangun SPA yang berjalan dekat dengan backend Laravel, Sanctum sangat nyaman karena tetap memanfaatkan cookie session yang aman dan tidak perlu Anda menyimpan bearer token di browser secara manual.

Namun jika Anda membangun mobile app native atau integrasi service-to-service, biasanya yang digunakan adalah mode token API dari Sanctum.

5. Token API

Istilah “token API” di sini mengacu pada autentikasi stateless menggunakan bearer token. Implementasinya bisa memakai Sanctum personal access tokens atau solusi lain yang sesuai kebutuhan sistem. Model ini tidak bergantung pada cookie session browser.

Pendekatan token lebih cocok untuk klien non-browser, API publik/privat, mobile app, dan integrasi backend-to-backend. Tetapi ia membawa tanggung jawab lebih besar pada manajemen token: issuance, expiration, revocation, scope/ability, rotasi, dan pelacakan penyalahgunaan.

Kapan Memilih yang Mana Berdasarkan Jenis Aplikasi

Monolith Laravel berbasis Blade

Untuk aplikasi monolith tradisional, session auth + Breeze biasanya adalah pilihan terbaik. Anda mendapatkan alur login yang stabil, middleware yang natural, dan kustomisasi yang mudah. Jika butuh 2FA, session browser management, atau fitur akun yang lebih lengkap, pertimbangkan Jetstream.

Jangan langsung memakai token API jika seluruh aplikasi diakses lewat browser dan dirender oleh Laravel. Itu hanya menambah kompleksitas tanpa manfaat berarti.

SPA dengan frontend terpisah

Jika Anda memiliki frontend SPA yang berkomunikasi intensif ke backend Laravel, pilihan yang paling sehat sering kali adalah Sanctum dengan cookie-based SPA authentication, selama arsitektur domain dan CORS memungkinkan. Dengan pola ini, browser tetap menggunakan cookie HTTP-only sehingga risiko paparan token di JavaScript lebih rendah dibanding menyimpan token di localStorage.

Namun bila SPA berada di domain yang benar-benar terpisah, melibatkan banyak klien, atau Anda ingin backend benar-benar stateless, maka model bearer token API bisa lebih cocok. Konsekuensinya, Anda harus merancang mitigasi terhadap XSS, token leakage, dan refresh/revocation flow dengan serius.

Backend untuk mobile app

Untuk mobile app native, token API hampir selalu lebih tepat daripada session auth. Mobile client tidak bekerja seperti browser tradisional dan tidak cocok bergantung pada cookie session/CSRF flow web. Di sini Sanctum personal access tokens adalah opsi yang cukup praktis untuk banyak aplikasi internal maupun produk skala kecil-menengah.

Pastikan Anda memikirkan:

  • Masa berlaku token
  • Kemampuan mencabut token per-device
  • Pencatatan device name dan last used time
  • Scope/ability token bila endpoint berbeda level aksesnya

Multi-panel admin atau banyak guard

Untuk sistem yang memiliki beberapa panel, misalnya admin, operator, customer, dan partner, keputusan paling penting bukan starter kit-nya, tetapi desain guard, provider, authorization, dan boundary antar panel.

Dalam banyak kasus, Anda tetap bisa memakai session auth sebagai fondasi, lalu menambahkan beberapa guard sesuai kebutuhan. Breeze cocok jika Anda ingin implementasi panel secara manual dan terkontrol. Jetstream tidak otomatis menjadi solusi terbaik hanya karena fitur lebih banyak.

Kesalahan umum pada sistem multi-panel adalah memakai satu tabel user, satu guard, lalu membedakan semua akses hanya dengan if role di controller. Itu cepat rusak. Jika domain bisnis memang berbeda jauh, pertimbangkan pemisahan guard, route group, middleware, bahkan panel yang berbeda secara UI maupun namespace.

Implikasi Keamanan yang Perlu Dipahami

Cookie session vs bearer token

Cookie session unggul untuk aplikasi browser karena dapat dibuat HTTP-only dan tidak perlu dipegang oleh JavaScript. Ini mengurangi dampak kebocoran token akibat praktik frontend yang buruk. Namun Anda wajib memahami CSRF dan memastikan middleware serta konfigurasi domain/cookie benar.

Bearer token lebih fleksibel untuk API dan mobile, tetapi bila disimpan secara sembarangan di browser, ia rentan dicuri melalui XSS. Karena itu, bearer token bukan otomatis “lebih modern” atau “lebih aman”; ia hanya cocok untuk konteks yang tepat.

Common mistakes

  • Menyimpan token API di localStorage tanpa mitigasi XSS yang memadai
  • Menggunakan Sanctum SPA auth tetapi salah konfigurasi domain stateful, CORS, atau cookie
  • Mencampur route web dan API tanpa boundary middleware yang jelas
  • Tidak memisahkan authorization dari authentication
  • Tidak menyediakan mekanisme revoke token saat device hilang atau akun dicurigai disalahgunakan

Debugging tip penting

Jika login SPA dengan Sanctum gagal, periksa hal berikut sebelum menyalahkan paketnya:

  1. Apakah domain frontend termasuk dalam konfigurasi stateful?
  2. Apakah cookie dikirim oleh browser?
  3. Apakah CORS mengizinkan credentials?
  4. Apakah request login dan request API berjalan pada origin/protokol yang konsisten?
  5. Apakah middleware auth:sanctum dipasang pada endpoint yang tepat?

Decision Matrix: Pilih Stack Berdasarkan Kebutuhan

KonteksRekomendasiAlasanCatatan
Monolith Blade sederhanaBreeze + session authRingan, cepat, mudah dirawatPaling efisien untuk mayoritas aplikasi internal
Monolith dengan fitur akun lebih lengkapJetstream + session authFitur seperti 2FA dan session management sudah tersediaPastikan kompleksitasnya memang dibutuhkan
SPA dekat dengan backend LaravelSanctum SPA authMenggunakan cookie/session, cocok untuk browserPerlu konfigurasi CORS, cookie, dan domain yang benar
Mobile backendSanctum token APIStateless, cocok untuk klien non-browserRancang revoke, expiry, dan ability token
Integrasi pihak ketiga / API privatToken APIFleksibel untuk service dan client beragamButuh governance token yang disiplin
Multi-panel adminSession auth + guard/authorization yang jelasBoundary akses lebih penting daripada starter kitJangan andalkan role check acak di controller

Contoh Arsitektur Singkat

Arsitektur 1: Monolith bisnis internal

Stack: Laravel + Blade + Breeze + session auth.

Kenapa cocok: Tim backend bisa bergerak cepat, tidak perlu memelihara frontend terpisah, dan keamanan browser mengikuti pola Laravel yang paling matang.

routes/web.php
Route::middleware('auth')->group(function () {
    Route::get('/dashboard', DashboardController::class);
    Route::resource('/projects', ProjectController::class);
});

Arsitektur 2: SPA dashboard + API Laravel

Stack: Frontend SPA + Laravel API + Sanctum SPA auth.

Kenapa cocok: Browser tetap memakai cookie session, sementara frontend mendapatkan pengalaman SPA. Cocok jika frontend dan backend masih dalam kontrol domain yang sama atau setidaknya lingkungan deployment yang bisa diatur dengan baik.

routes/api.php
Route::middleware('auth:sanctum')->get('/me', function (Request $request) {
    return $request->user();
});

Arsitektur 3: Mobile app + backend API

Stack: Laravel API + Sanctum personal access tokens.

Kenapa cocok: Mobile app membutuhkan autentikasi stateless dan kemampuan revoke token per-device.

// setelah kredensial tervalidasi
$token = $user->createToken($request->device_name, ['orders:read', 'orders:write']);

return response()->json([
    'token' => $token->plainTextToken,
    'user' => $user,
]);

Dengan pendekatan ini, Anda bisa mencabut token perangkat tertentu tanpa memutus seluruh sesi user.

Panduan Praktis Memilih dengan Cepat

  • Jika aplikasi Anda server-rendered, mulai dari Breeze. Naik ke Jetstream hanya jika fitur tambahannya benar-benar dipakai.
  • Jika aplikasi Anda adalah browser SPA, evaluasi dulu apakah Sanctum cookie-based bisa dipakai. Ini sering lebih aman dan lebih sederhana daripada bearer token di browser.
  • Jika klien Anda adalah mobile app atau integrasi API, gunakan token API, dan rancang lifecycle token dengan serius.
  • Jika Anda punya banyak panel dan jenis user, fokuslah pada guard, middleware, policy, dan struktur route, bukan sekadar memilih starter kit.

Kesimpulan

Tidak ada satu solusi autentikasi Laravel yang paling benar untuk semua aplikasi. Breeze unggul sebagai fondasi ringan untuk mayoritas monolith. Jetstream cocok bila Anda memang membutuhkan fitur akun yang lebih lengkap dan siap menerima opini framework yang lebih kuat. Sanctum sangat relevan untuk dua hal: SPA berbasis cookie/session dan token API untuk klien non-browser. Sementara itu, session auth tetap menjadi pilihan terbaik untuk banyak aplikasi web tradisional, dan token API paling masuk akal untuk mobile serta integrasi.

Aturan praktisnya sederhana: pilih model autentikasi yang paling dekat dengan bentuk klien Anda, serendah mungkin kompleksitasnya, dan sejelas mungkin boundary keamanannya. Dalam jangka panjang, keputusan auth yang baik bukan yang terlihat paling modern, melainkan yang paling mudah dijelaskan, diuji, diamankan, dan dirawat oleh tim Anda.