Belajar Laravel #10: Authentication — Guard, Hash, dan Alur Login

Hari ini saya masuk ke materi yang paling sering ditanya orang saat pertama belajar Laravel: authentication. Selama ini saya cuma tahu login itu “masukin email dan password, terus masuk”. Ternyata di balik itu ada konsep yang menarik: guard, provider, sampai cara Laravel menyimpan password dengan aman. Jujur, agak pusing di awal — tapi setelah saya bedah pelan-pelan, polanya masuk akal.

Autentikasi itu soal “membuktikan siapa kamu”

Saya suka mengibaratkan autentikasi seperti masuk ke kantor. Kamu datang ke lobby, tunjukkan kartu identitas (email + password), lalu satpam memverifikasi datamu ke database karyawan. Kalau cocok, kamu diberi “tanda pengenal” untuk dipakai selama di dalam gedung — di Laravel, tanda pengenal itu disimpan di session (kalau pakai web) atau dikirim sebagai token (kalau API). Ini berarti autentikasi sebenarnya dua langkah: verifikasi identitas lalu menjaga identitas itu tetap dikenali di request berikutnya.

Guard dan Provider: pasangan yang wajib dipahami

Dua istilah ini yang bikin saya bingung paling lama. Sekarang saya catat begini:

  • Guard = cara menentukan bagaimana pengguna dibuktikan dan disimpan di tiap request. Guard web memakai session + cookie; guard sanctum memakai token untuk API.
  • Provider = sumber data identitasnya, yaitu dari mana pengguna diambil. Default: tabel users lewat model App\Models\User.

Di file config/auth.php, Laravel memetakan keduanya. Jadi kalau suatu saat aplikasi saya pakai login dari tabel admin atau API eksternal, saya cukup ganti provider-nya — guard-nya bisa tetap sama. Buat saya yang baru belajar, ini artinya framework-nya memang didesain untuk diganti-ganti bagiannya tanpa membongkar semuanya.

Kenapa password tidak pernah disimpan “polos”

Sebelumnya saya sempat mikir: “kenapa tidak simpan password apa adanya saja?” Lalu saya sadar — kalau database bocor, semua password user langsung terbaca. Solusinya: simpan hash, hasil satu arah dari password. Hash tidak bisa dibalik jadi password asli, tapi bisa dicek ulang: hash(password yang dimasukkan) dibandingkan dengan hash di database.

Di Laravel cukup pakai facade Hash. Default algoritmanya bcrypt, dan secara berkala Laravel bisa “meng-upgrade” hash ke algoritma yang lebih kuat saat user login (fitur needsRehash). Saya baru paham sekarang kenapa artikel-artikel selalu bilang “jangan pernah simpan password plaintext”. Ini yang saya catat:

use Illuminate\Support\Facades\Hash;

// Menyimpan password saat registrasi
$user = User::create([
    'name' => $request->name,
    'email' => $request->email,
    'password' => Hash::make($request->password),
]);

// Mengecek password saat login
if (Hash::check($request->password, $user->password)) {
    // password benar
}

Perhatikan: tidak ada satu pun kode di atas yang pernah melihat isi password aslinya setelah disimpan. Hash::make menghasilkan string acak yang berbeda tiap kali — jadi dua user dengan password sama tetap punya hash berbeda. Itu justru bagus, kata saya, karena menyulitkan penyerang yang memakai daftar hash umum.

Breeze: scaffolding login/register yang siap pakai

Kalau “membangun dari nol” terasa berat, Laravel punya paket resmi bernama Breeze — semacam kerangka awal login, register, lupa password, dan verifikasi email, lengkap dengan halaman Blade-nya. Saya sendiri merasa ini cara tercepat untuk melihat bentuk asli auth Laravel tanpa menulis semuanya manual:

composer require laravel/breeze --dev
php artisan breeze:install blade
php artisan migrate
npm install && npm run dev

Setelah itu route /login, /register, dan /dashboard langsung tersedia. Breeze bukan satu-satunya pilihan — ada Jetstream yang lebih lengkap (two-factor authentication, team) — tapi untuk belajar, Breeze lebih ramah karena kodenya minim dan mudah dibaca. Ini berarti bagi saya: sebelum saya paham auth dari nol, saya bisa pelajari implementasi resmi yang sudah benar, lalu memodifikasinya.

Alur login yang saya gambar sendiri

Sampai di sini saya coba rangkum alur login dalam satu gambar, supaya kepalaku tidak cuma menyimpan potongan-potongan istilah:

Diagram alur login Laravel: request, middleware, guard, session
Alur login Laravel: request masuk, kredensial dicek, identitas disimpan di session.

Inti dari gambar itu: Auth::attempt adalah pintu masuknya — ia menerima kredensial, mengeceknya lewat guard, lalu membuat “identitas” di session. Setelah sukses, jangan lupa regenerasi session ID ($request->session()->regenerate()) untuk mencegah session fixation. Detail kecil seperti ini yang dulu tidak pernah saya sadari sebelum belajar Laravel.

use Illuminate\Support\Facades\Auth;

if (Auth::attempt($credentials, $remember)) {
    $request->session()->regenerate();
    return redirect()->intended('/dashboard');
}

return back()->withErrors([
    'email' => 'Kredensial tidak cocok.',
]);

Yang saya catat hari ini

  • Autentikasi = verifikasi identitas + menjaga identitas tetap dikenali (session/token).
  • config/auth.php mengatur pasangan guard (cara buktikan) dan provider (sumber data).
  • Password wajib di-hash (bcrypt lewat facade Hash); jangan pernah simpan plaintext.
  • Breeze = scaffolding resmi untuk mulai cepat; bagus untuk belajar sebelum membangun custom.
  • Setelah login sukses, regenerasi session ID untuk keamanan.

Materi ini terasa berat saat pertama dibaca, tapi begitu saya pecah jadi “guard, provider, hash, session”, semuanya jadi puzzle yang nyambung. Episode berikutnya saya ingin lanjut ke gate & policy — soal siapa boleh mengakses apa setelah login. Sampai ketemu di catatan berikutnya!

Sumber

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses