Table of Contents
▼Banyak developer Laravel yang pernah duduk diam menatap layar, bingung antara dua pilihan: Laravel Sanctum atau Laravel Passport.
Keduanya sama-sama bisa mengamankan API. Keduanya resmi didukung Laravel. Tapi keduanya dirancang untuk kebutuhan yang sangat berbeda.
Salah pilih, dan kamu bisa menghabiskan waktu berjam-jam melakukan setup yang jauh lebih rumit dari seharusnya — atau sebaliknya, membangun sistem yang tidak cukup kuat untuk kebutuhan sebenarnya.
Artikel ini akan membantu kamu membuat keputusan yang tepat, berdasarkan skenario nyata, bukan teori semata.
Apa Bedanya Sanctum dan Passport Secara Konseptual
Sebelum membandingkan fitur, penting untuk memahami filosofi di balik masing-masing package.
Laravel Sanctum adalah solusi autentikasi ringan yang dirancang untuk tiga kebutuhan utama: SPA (Single Page Application), mobile app, dan API sederhana berbasis token.
Sanctum tidak mengimplementasikan OAuth2 secara penuh. Ia bekerja dengan dua mekanisme: session-based authentication untuk SPA yang berada di domain yang sama, dan plain API tokens yang disimpan di database untuk aplikasi mobile atau third-party sederhana.
Laravel Passport adalah implementasi OAuth2 server yang lengkap untuk Laravel.
Passport menggunakan library league/oauth2-server di balik layar dan mendukung semua grant type OAuth2 standar: Authorization Code, Client Credentials, Password Grant, hingga Implicit Grant.
Dengan kata lain, kalau Sanctum itu seperti kunci rumah yang simpel, Passport itu seperti sistem akses kartu magnetik hotel yang bisa dikonfigurasi per ruangan, per tamu, per waktu.
Kapan Pakai Sanctum: SPA, Mobile App, dan Token Sederhana
Sanctum adalah pilihan default yang tepat untuk sebagian besar proyek Laravel modern.
SPA dengan Domain yang Sama
Kalau kamu membangun frontend React, Vue, atau Next.js yang di-serve dari domain yang sama dengan Laravel backend-mu (atau subdomain-nya), Sanctum adalah jawabannya.
Sanctum menggunakan cookie-based session authentication di skenario ini. Tidak ada token yang disimpan di localStorage, sehingga lebih aman dari serangan XSS.
Setup-nya pun sangat sederhana:
// config/sanctum.php
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
Sanctum::currentApplicationUrlWithPort()
))),
// routes/api.php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Sangat bersih. Tidak ada overhead OAuth2 yang tidak kamu butuhkan.
Mobile App dan Token Sederhana
Untuk aplikasi mobile (Flutter, React Native, Android/iOS native), Sanctum menyediakan personal access tokens.
User login, server mengembalikan token, token disimpan di device, dan setiap request menggunakan token tersebut di header Authorization: Bearer.
// Controller Login
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
]);
$user = User::where('email', $request->email)->first();
if (! $user || ! Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Kredensial tidak valid.'], 401);
}
// Buat token dengan kemampuan (abilities) tertentu
$token = $user->createToken('mobile-app', ['orders:read', 'profile:update'])->plainTextToken;
return response()->json(['token' => $token]);
}
Token abilities di Sanctum mirip OAuth2 scopes, tapi jauh lebih ringan untuk diimplementasikan.
Ringkasan: Pakai Sanctum Kalau...
- Kamu membangun SPA yang satu domain dengan backend Laravel
- Kamu membuat API untuk aplikasi mobile buatanmu sendiri
- Kamu tidak perlu mengizinkan aplikasi pihak ketiga mengakses data user
- Kamu butuh setup cepat dan maintenance minimal
- Tim kamu belum familiar dengan alur OAuth2 yang kompleks
Kapan Pakai Passport: OAuth2 Server dan Third-party Integration
Passport baru menjadi pilihan relevan ketika proyekmu membutuhkan fitur yang memang hanya ada di OAuth2 penuh.
Kamu Membangun Platform yang Diakses Third-party
Bayangkan kamu membangun platform seperti Tokopedia atau marketplace SaaS.
Kamu ingin mengizinkan aplikasi lain (buatan developer lain) untuk mengakses data user dengan izin eksplisit dari user tersebut. Inilah inti dari OAuth2 Authorization Code Grant.
Dengan Passport, user bisa melihat layar "Izinkan aplikasi XYZ mengakses akun kamu?" — persis seperti "Login with Google" atau "Connect with Shopify".
// Registrasi OAuth Client untuk third-party
php artisan passport:client
Passport menangani seluruh alur: redirect ke authorization page, exchange authorization code dengan access token, hingga refresh token secara otomatis.
Machine-to-Machine Authentication (Client Credentials)
Kalau kamu memiliki beberapa microservice yang perlu saling berkomunikasi tanpa user di dalamnya, Passport mendukung Client Credentials Grant.
// routes/api.php
Route::middleware('client')->get('/internal-reports', function () {
return response()->json(['data' => 'laporan internal']);
});
Sanctum tidak memiliki mekanisme native untuk skenario ini.
Token Scopes yang Granular dan Terstandarisasi
Meskipun Sanctum punya "abilities", Passport menawarkan OAuth2 scopes yang terstandarisasi secara industri.
Ini penting kalau kamu ingin mengintegrasikan sistem autentikasi kamu dengan standar industri atau tool pihak ketiga yang mengharapkan implementasi OAuth2 yang proper.
// AuthServiceProvider.php
Passport::tokensCan([
'read-orders' => 'Melihat daftar pesanan',
'create-orders' => 'Membuat pesanan baru',
'manage-profile' => 'Mengubah profil pengguna',
'admin-access' => 'Akses penuh admin',
]);
Ringkasan: Pakai Passport Kalau...
- Kamu membangun platform API publik yang bisa diakses oleh developer/aplikasi lain
- Kamu membutuhkan Authorization Code flow (seperti "Login with Your Platform")
- Kamu punya skenario machine-to-machine tanpa user
- Compliance proyek mengharuskan implementasi OAuth2 yang terstandarisasi
- Kamu membangun ekosistem aplikasi (multiple client apps, satu authorization server)
Perbandingan Setup, Kompleksitas, dan Maintenance
Mari lihat perbedaan konkret dari sisi teknis.
Setup Awal
Sanctum:
composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Tambahkan HasApiTokens ke model User, dan daftarkan middleware. Selesai. Bisa berjalan dalam 10-15 menit.
Passport:
composer require laravel/passport
php artisan migrate
php artisan passport:install
Passport membuat beberapa tabel tambahan (oauth_clients, oauth_access_tokens, oauth_refresh_tokens, dll) dan memerlukan konfigurasi lebih lanjut untuk client management. Setup yang benar bisa memakan 1-2 jam lebih.
Tabel Database
Sanctum hanya membutuhkan satu tabel tambahan: personal_access_tokens.
Passport membutuhkan 5-7 tabel untuk menyimpan clients, authorization codes, access tokens, refresh tokens, dan scopes.
Performa
Sanctum secara umum lebih ringan karena tidak ada overhead OAuth2 server di setiap request.
Passport melakukan validasi JWT atau database lookup yang lebih kompleks, terutama kalau kamu menggunakan token yang disimpan di database (bukan JWT).
Maintenance Jangka Panjang
Sanctum hampir tidak butuh maintenance khusus. Token disimpan sederhana, mudah di-revoke, mudah di-audit.
Passport memerlukan rotasi keys secara berkala, manajemen OAuth clients yang aktif, dan pemantauan token yang lebih teliti.
Tabel Perbandingan Cepat
| Aspek | Sanctum | Passport |
|---|---|---|
| Kompleksitas Setup | Rendah | Tinggi |
| Tabel Database | 1 | 5-7 |
| OAuth2 Full Support | Tidak | Ya |
| SPA Cookie Auth | Ya | Tidak native |
| Third-party Access | Terbatas | Ya (full) |
| Machine-to-machine | Tidak | Ya |
| Performa | Lebih cepat | Lebih berat |
| Ukuran Tim Ideal | Solo - Medium | Medium - Enterprise |
Rekomendasi Final Berdasarkan Tipe Proyek
Setelah memahami perbedaan konseptual dan teknis, berikut rekomendasi berdasarkan tipe proyek yang paling umum di Indonesia.
Proyek Startup atau MVP
Gunakan Sanctum.
Di fase awal, kecepatan development adalah segalanya. Sanctum tidak menghambat kamu dengan complexity yang belum kamu butuhkan. Kalau nanti butuh OAuth2, migrasi bisa dilakukan belakangan.
Aplikasi Internal Perusahaan
Gunakan Sanctum.
Sistem HR, ERP internal, dashboard manajemen — semua ini tidak membutuhkan third-party OAuth2. Sanctum lebih dari cukup dan jauh lebih mudah di-maintain oleh tim internal.
Platform dengan Ekosistem Developer
Gunakan Passport.
Kalau kamu membangun sesuatu seperti marketplace, platform fintech, atau SaaS yang membuka API untuk developer lain, Passport adalah investasi yang tepat sejak awal.
Aplikasi Mobile (Flutter/React Native)
Gunakan Sanctum.
Untuk mobile app yang kamu buat sendiri, Sanctum personal access tokens adalah solusi yang paling efisien. Tidak perlu OAuth2 flow yang panjang.
Hybrid: Butuh Keduanya?
Ada kasus di mana kamu butuh Sanctum untuk frontend SPA dan mobile app internal, tapi juga butuh OAuth2 untuk partner integration.
Di skenario ini, kamu bisa menjalankan keduanya secara bersamaan di aplikasi Laravel yang sama. Sanctum untuk internal, Passport untuk external partners.
// Middleware untuk internal (Sanctum)
Route::middleware('auth:sanctum')->group(function () {
Route::get('/profile', [ProfileController::class, 'show']);
});
// Middleware untuk OAuth2 clients (Passport)
Route::middleware('auth:api')->group(function () {
Route::get('/partner/data', [PartnerDataController::class, 'index']);
});
Tapi ingat: menjalankan keduanya menambah kompleksitas. Lakukan ini hanya kalau memang benar-benar diperlukan.
Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.
Kesimpulan
Kalau harus disederhanakan dalam satu kalimat: Sanctum untuk aplikasi yang kamu kontrol sepenuhnya, Passport untuk ekosistem yang melibatkan pihak lain.
Sebagian besar proyek Laravel di Indonesia — baik startup, aplikasi bisnis, atau mobile app — akan lebih baik dimulai dengan Sanctum.
Jangan terjebak menginstal Passport hanya karena terasa "lebih enterprise" atau "lebih aman". Keamanan bukan soal seberapa kompleks tool-nya, tapi seberapa tepat kamu menggunakannya.
Pilih yang sesuai dengan kebutuhan nyata proyekmu hari ini, dan jangan ragu untuk bermigrasi atau menambah layer ketika skalamu benar-benar membutuhkannya.