Bayangkan kamu masuk ke rumah sakit tanpa ada satu pun petugas yang menanyakan identitasmu. Siapa saja bisa membuka rekam medis, mengubah diagnosis, bahkan menghapus data kunjungan. Ngeri, kan? Itulah yang terjadi pada aplikasi web tanpa sistem masuk. Di artikel ke-13 seri Pemrograman Web D4 MIK ini, kamu akan membangun login PHP session dari nol: registrasi user, login, proteksi halaman, sampai logout. Semuanya kamu praktikkan langsung di XAMPP dengan studi kasus klinik dan data pasien fiktif. Hasil akhirnya: hanya petugas yang punya akun yang bisa membuka halaman data pasien.
Artikel ini mengunci Sub-CPMK 9 (CPMK 4): kamu mampu menerapkan authentication, validasi, dan perlindungan dasar pada aplikasi web pengelolaan data kesehatan.
Login PHP Session: Cara Kerja Authentication di Balik Layar
Protokol HTTP itu pelupa. Setiap kali browser meminta halaman, server menganggapnya pengunjung baru. Jadi setelah kamu berhasil login di login.php, server tidak otomatis ingat kamu waktu kamu pindah ke dashboard.php. Di sinilah session bekerja.
Anggap saja loket pendaftaran rumah sakit. Setelah petugas memeriksa identitasmu, kamu dikasih gelang pasien bernomor unik. Di setiap ruangan, perawat cukup melihat gelang itu tanpa menanyakan KTP lagi. Dalam PHP, gelang itu adalah session ID yang disimpan browser dalam cookie bernama PHPSESSID. Catatan isinya (kamu siapa) disimpan di server, bukan di browser.
Authorization = menentukan boleh apa kamu (dibahas di Artikel 14).
Alur login PHP session: verifikasi password → simpan penanda di
$_SESSION → cek penanda itu di setiap halaman terlindungi.BROWSER SERVER (PHP) |-- POST login.php ---------->| cek username, password_verify() |<-- Set-Cookie: PHPSESSID ---| $_SESSION["user_id"] = 5 |-- GET dashboard.php ------->| cookie dibawa, session dikenali |<-- halaman dashboard -------| |-- GET logout.php ---------->| session_destroy() |<-- redirect ke login.php ---|
Disimpan di browser. Pengguna bisa melihat dan mengubahnya. Cocok untuk hal ringan, misalnya preferensi tampilan. Jangan simpan data sensitif di sini.
Datanya disimpan di server. Browser hanya memegang ID-nya. Cocok untuk status login, nama petugas, dan penanda hak akses.
$_SESSION tidak pernah dikirim ke browser. Yang dikirim hanya session ID. Karena itu pengguna tidak bisa mengubah dirinya sendiri dari “petugas biasa” menjadi “admin” lewat browser. Tapi kalau ID itu dicuri, orang lain bisa menyamar jadi kamu. Makanya nanti kita pakai session_regenerate_id().Praktik 1: Registrasi User untuk Login PHP Session
Sebelum ada yang bisa login, harus ada akun. Kita buat aplikasi mini “Klinik Sehat Sentosa” (nama fiktif). Ikuti langkahnya berurutan, ya.
klinik_auth di C:\xampp\htdocs\. Semua file di artikel ini disimpan di folder itu dengan Sublime Text.http://localhost/phpmyadmin, pilih tab SQL, tempel kode berikut, lalu klik Kirim.users muncul di database db_klinik dengan 5 kolom.password sengaja dibuat VARCHAR(255). Dokumentasi resmi PHP menyarankan panjang itu untuk hasil password_hash() karena algoritma bawaan bisa berganti seiring versi PHP. Kalau kolommu terlalu pendek, hash terpotong dan login akan selalu gagal.http://localhost/klinik_auth/register.php, daftarkan petugas fiktif (misalnya username petugas_ani). Di phpMyAdmin, kolom password berisi teks acak berawalan $2y$, bukan password aslinya.? pada query. Itu prepared statement: data dari form dikirim terpisah dari perintah SQL. Kebiasaan ini akan jadi tameng utama di Artikel 14 saat kita membahas SQL Injection.Praktik 2: Login PHP Session dengan password_verify
Sekarang bagian serunya. Alurnya: ambil data user berdasarkan username, cocokkan password dengan password_verify(), lalu simpan penanda login di $_SESSION. Perhatikan juga pesan error yang sengaja dibuat sama untuk username salah maupun password salah, supaya penyerang tidak tahu username mana yang terdaftar.
session_start() wajib berada paling atas, sebelum output apa pun.headers already sent hampir selalu karena ada spasi, baris kosong, atau teks sebelum <?php. Fungsi session_start() dan header() hanya bisa jalan sebelum browser menerima output apa pun. Letakkan blok PHP di baris pertama file.http://localhost/klinik_auth/login.php. Coba dua skenario: (a) password sengaja salah, (b) username dan password benar.dashboard.php (halamannya kita buat di langkah berikutnya, jadi sementara akan muncul error file tidak ditemukan; itu normal).Praktik 3: Proteksi Halaman dan Logout pada Login PHP Session
Login saja belum cukup. Kalau halaman dashboard.php tidak mengecek session, siapa pun yang mengetik alamatnya langsung bisa masuk. Ibarat pintu depan dijaga satpam tapi pintu belakang terbuka lebar. Solusinya: satu file “penjaga” yang dipanggil di setiap halaman terlindungi.
require "auth.php" di paling atas, maka halaman ini terkunci.http://localhost/klinik_auth/dashboard.php. (2) Login lalu buka dashboard. (3) Klik Logout, lalu tekan tombol Back di browser.login.php; skenario 2 menampilkan “Selamat datang, nama petugas”; skenario 3 tidak lagi menampilkan isi dashboard.PHPSESSID. Hapus cookie itu secara manual, lalu refresh dashboard. Kamu langsung ditendang ke halaman login.Ini rangkuman fungsi penting yang baru saja kamu pakai. Simpan sebagai contekan:
| Fungsi / Variabel | Tugasnya | Dipakai di |
|---|---|---|
session_start() | Memulai atau melanjutkan session | login, auth, logout |
$_SESSION[] | Menyimpan data milik satu pengguna di server | login, dashboard |
password_hash() | Mengubah password jadi hash satu arah | register |
password_verify() | Mencocokkan password input dengan hash | login |
session_regenerate_id(true) | Mengganti session ID setelah login berhasil | login |
session_destroy() | Menghapus data session di server | logout |
Error yang Sering Muncul & Cara Mengatasinya
Tenang, error itu teman belajar. Ini yang paling sering muncul saat mahasiswa praktik login PHP session di laboratorium:
| Pesan / Gejala | Penyebab | Solusi |
|---|---|---|
Cannot modify header information - headers already sent | Ada output (spasi, HTML, echo) sebelum session_start() atau header() | Pindahkan blok PHP ke baris pertama. Di Sublime Text, simpan dengan File → Save with Encoding → UTF-8 (tanpa BOM). |
Undefined array key "user_id" | Mengakses $_SESSION sebelum session_start() atau sebelum login | Panggil session_start() dulu, dan cek dengan isset(). |
| Login selalu gagal padahal password benar | Kolom password terlalu pendek, atau password di database diisi manual tanpa hash | Ubah jadi VARCHAR(255), lalu daftar ulang lewat register.php. |
Duplicate entry ... for key 'username' | Username sama sudah ada (kolom bersifat UNIQUE) | Pakai username lain, atau pastikan pengecekan di register.php berjalan. |
Failed opening required 'koneksi.php' | Salah folder atau salah nama file | Pastikan semua file ada di satu folder htdocs\klinik_auth. |
| Setelah logout, tombol Back masih menampilkan dashboard | Browser menyimpan halaman di cache | Pastikan baris Cache-Control di auth.php ada, lalu refresh. |
Latihan Mandiri: Kuatkan Authentication Klinikmu
Kerjakan di folder yang sama, lalu simpan tangkapan layar hasilnya sebagai bukti praktikum:
last_login (DATETIME) di tabel users, isi dengan NOW() setiap login berhasil, dan tampilkan di dashboard.daftar_pasien.php yang menampilkan 5 data pasien fiktif dari tabel pasien, dan kunci dengan auth.php. Buktikan halaman itu tidak bisa dibuka tanpa login.$_SESSION["waktu_terakhir"]. Jika selisihnya lebih dari 15 menit, otomatis logout. Ini praktik lazim untuk komputer bersama di loket pendaftaran.- PHP Manual: Session Handling
- PHP Manual: password_hash()
- OWASP Cheat Sheet Series: Session Management
- OWASP Cheat Sheet Series: Authentication
Kamu sudah membangun siklus lengkap login PHP session: registrasi dengan password_hash(), login dengan password_verify(), penanda di $_SESSION, proteksi halaman lewat auth.php, dan logout yang membersihkan session sampai tuntas. Inti pelajarannya sederhana: browser hanya memegang “gelang”, sedangkan server yang menentukan siapa yang boleh masuk.
Tapi login baru satu lapis. Di Artikel 14, kita tambah lapisan berikutnya: hak akses per peran, hash password yang lebih dalam, serta perlindungan SQL Injection dan XSS. Bagian mana yang paling bikin kamu penasaran atau tersangkut? Ceritakan di kolom komentar, dan bagikan artikel ini ke teman satu kelompok praktikummu.
💬 Tulis Komentar📲 Bagikan via WhatsApp