sessionloginauthMenengah4 mnt baca

Session untuk Login

Bangun login sederhana: cek kredensial, simpan status di session, proteksi halaman, logout.

Kenapa Session = Kunci Login?

Login pada dasarnya pertanyaan: "bagaimana server tahu request ini dari user yang sudah login, padahal HTTP pelupa?" Jawabannya: setelah username + password cocok, server menulis cap "sudah login" ke session ($_SESSION["user"] = ...). Setiap halaman privat tinggal mengecek cap itu. Tanpa cap, tendang ke halaman login.

php
<?php
// Contoh 1: proses login (login.php)
session_start();

$users = ["admin" => password_hash("rahasia123", PASSWORD_DEFAULT)];

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $u = trim($_POST["username"] ?? "");
    $p = $_POST["password"] ?? "";

    if (isset($users[$u]) && password_verify($p, $users[$u])) {
        session_regenerate_id(true);   // cegah session fixation!
        $_SESSION["user"] = $u;
        header("Location: dashboard.php");
        exit;
    }
    $error = "Username atau password salah.";
}

session_regenerate_id(true) memberi ID session baru setelah login berhasil. Tanpa ini, penyerang yang menanam ID session ke korban bisa memakai session yang sama setelah korban login (serangan session fixation). Satu baris ini menutup celah serius.

php
<?php
// Contoh 2: penjaga halaman + logout (dashboard.php & logout.php)
// dashboard.php
session_start();
if (!isset($_SESSION["user"])) {
    header("Location: login.php");   // belum login? tendang!
    exit;
}
echo "Halo, " . htmlspecialchars($_SESSION["user"]) . "!";

// logout.php
session_start();
$_SESSION = [];                    // kosongkan data
if (ini_get("session.use_cookies")) {
    setcookie(session_name(), "", time() - 3600);  // hapus cookie ID
}
session_destroy();                 // hancurkan session di server
header("Location: login.php");
exit;

Pola "penjaga" di atas (cek isset($_SESSION["user"]), tendang kalau tidak ada) ditaruh di setiap halaman privat, biasanya via satu file auth.php yang di-require di atas halaman. Logout yang benar menghancurkan tiga hal: data session, cookie ID, dan file session di server.

Jebakan yang Sering Terjadi

Menyimpan password di session. Session hanya untuk identitas (username, user_id, role). Jangan simpan password, bahkan yang sudah di-hash, di $_SESSION. Tidak ada gunanya dan memperbesar risiko kalau data session bocor.

Hanya menyembunyikan link, bukan menjaga halaman. Menampilkan menu "Dashboard" hanya saat login itu UX, bukan keamanan. Halaman dashboard.php tetap bisa dibuka langsung via URL. Keamanan yang sebenarnya adalah cek session di dalam setiap halaman privat.

Meningkatkan: Role & Hak Akses

Setelah login dasar, kebutuhan berikutnya adalah role: admin vs member melihat halaman berbeda.

php
<?php
// Saat login sukses, simpan juga role:
$_SESSION["user_id"] = $user["id"];
$_SESSION["role"] = $user["role"];   // "admin" atau "member"

// Guard berlapis di halaman admin:
function wajibAdmin(): void {
    wajibLogin();
    if (($_SESSION["role"] ?? "") !== "admin") {
        http_response_code(403);
        exit("Akses ditolak.");
    }
}

Jangan pernah menentukan role dari input user ($_POST["role"]) atau cookie: role selalu dibaca dari database saat login, lalu disimpan di session server-side. Cek role di setiap halaman sensitif, bukan hanya menyembunyikan link menu.

Catatan teknis: Untuk "ingat saya" (remember me), jangan perpanjang umur session. Buat token acak panjang, simpan hash-nya di database, dan taruh token di cookie. Saat session habis, cocokkan token cookie dengan database untuk login otomatis. Pola ini dibahas di modul session-keamanan.

Tantangan

Login 2 user

Kembangkan contoh di atas: array $users berisi 2 user dengan password berbeda. Setelah login, dashboard menampilkan nama user + link logout. Pastikan akses langsung ke dashboard tanpa login me-redirect ke login.

Tugas

Tugas: Sistem Login Mini

Buat sistem login lengkap dalam 3 file: login.php (form + proses), dashboard.php (halaman terproteksi yang menampilkan nama user dan daftar 3 menu fiktif), logout.php. Syarat: password dicek dari array, session diregenerasi setelah login, dashboard menolak akses tanpa login, ada pesan error saat kredensial salah.

Kriteria penilaian:

  • session_start() di semua file sebelum output
  • Kredensial dicek dari array, bukan hardcode if
  • session_regenerate_id(true) setelah login berhasil
  • dashboard.php redirect ke login.php jika belum login
  • logout menghancurkan session dengan benar

AI tutor akan memeriksa bug, kesalahan syntax, dan memberi saran perbaikan.