Tutorial Login dan Logout dengan Session di PHP

Tutorial147 Views

Membangun sistem login dan logout menggunakan PHP bukan sekadar soal masuk dan keluar aplikasi, melainkan soal menjaga keamanan serta kenyamanan pengguna. Dengan memanfaatkan session, kita bisa memastikan data penting hanya bisa diakses oleh orang yang sudah terautentikasi. Artikel ini akan memandu kamu secara detail dari dasar hingga fitur tambahan yang sering dipakai di dunia nyata.

Memahami Dasar Session di PHP

Session adalah mekanisme penyimpanan data sementara di server. Ketika pengguna login, server membuat session yang dihubungkan dengan session ID unik. ID ini dikirim ke browser pengguna melalui cookie agar setiap request berikutnya bisa dikenali.

Keunggulan session dibanding cookie biasa adalah data sensitif tidak disimpan di browser. Jadi walaupun session ID bisa dicuri, data utamanya tetap aman di server. Itulah kenapa session menjadi pilihan utama dalam sistem login.


Membuat Database Sederhana

Langkah pertama tentu menyiapkan database. Kita hanya butuh tabel user sederhana:

CREATE DATABASE login_system;

USE login_system;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(255) NOT NULL,
    role ENUM('admin', 'user') DEFAULT 'user'
);

Kolom role ditambahkan agar kita bisa membuat hak akses berbeda antara admin dan user. Untuk isi awal:

INSERT INTO users (username, password, role) 
VALUES ('admin', MD5('admin123'), 'admin'),
       ('user1', MD5('user123'), 'user');

Membuat File Konfigurasi

File config.php bertugas untuk koneksi database dan memulai session.

<?php
session_start();

$host = "localhost";
$user = "root";
$pass = "";
$db   = "login_system";

$conn = mysqli_connect($host, $user, $pass, $db);

if (!$conn) {
    die("Koneksi gagal: " . mysqli_connect_error());
}
?>

Dengan cara ini, setiap file yang membutuhkan session cukup memanggil include('config.php').


Membuat Form Login

Form login sederhana di login.php bisa ditulis seperti ini:

<?php include('config.php'); ?>

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h2>Form Login</h2>
    <form method="POST" action="">
        <input type="text" name="username" placeholder="Username" required><br><br>
        <input type="password" name="password" placeholder="Password" required><br><br>
        <label><input type="checkbox" name="remember"> Remember Me</label><br><br>
        <button type="submit" name="login">Login</button>
    </form>
</body>
</html>

Di sini ada tambahan checkbox Remember Me untuk menyimpan session lebih lama jika dicentang.


Proses Login dengan Session

Bagian PHP untuk memproses login:

<?php
if (isset($_POST['login'])) {
    $username = $_POST['username'];
    $password = md5($_POST['password']);

    $query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
    $result = mysqli_query($conn, $query);
    $row = mysqli_fetch_assoc($result);

    if ($row) {
        $_SESSION['username'] = $row['username'];
        $_SESSION['role'] = $row['role'];
        $_SESSION['last_login'] = time(); // untuk timeout

        // Fitur Remember Me
        if (isset($_POST['remember'])) {
            setcookie("username", $row['username'], time() + (86400 * 7), "/");
        }

        header("Location: dashboard.php");
    } else {
        echo "Username atau password salah!";
    }
}
?>

Di sini ada tiga hal penting:

  1. Menyimpan role untuk membedakan hak akses.
  2. Menyimpan last_login agar bisa dipakai untuk timeout.
  3. Menambahkan cookie jika pengguna memilih Remember Me.

Membuat Dashboard

dashboard.php hanya bisa diakses setelah login.

<?php
include('config.php');

if (!isset($_SESSION['username'])) {
    // Jika Remember Me aktif
    if (isset($_COOKIE['username'])) {
        $_SESSION['username'] = $_COOKIE['username'];
    } else {
        header("Location: login.php");
        exit();
    }
}

// Cek timeout (misal 5 menit)
if (time() - $_SESSION['last_login'] > 300) {
    session_destroy();
    header("Location: login.php?timeout=1");
    exit();
} else {
    $_SESSION['last_login'] = time(); // reset waktu
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Dashboard</title>
</head>
<body>
    <h2>Selamat datang, <?php echo $_SESSION['username']; ?>!</h2>
    <p>Role: <?php echo $_SESSION['role']; ?></p>

    <?php if ($_SESSION['role'] == 'admin'): ?>
        <a href="admin.php">Halaman Admin</a><br>
    <?php endif; ?>

    <a href="logout.php">Logout</a>
</body>
</html>

Sekarang dashboard punya:

  • Timeout otomatis jika pengguna tidak aktif.
  • Akses role-based, hanya admin yang bisa masuk ke halaman admin.
  • Remember Me agar login tetap tersimpan.

Membuat Logout

Fitur logout di logout.php:

<?php
include('config.php');

session_destroy();
setcookie("username", "", time() - 3600, "/"); // hapus cookie
header("Location: login.php");
exit();
?>

Session dihancurkan, cookie dihapus, lalu pengguna diarahkan ke login.


Membuat Halaman Admin

Sebagai contoh, kita bisa buat admin.php:

<?php
include('config.php');

if (!isset($_SESSION['username']) || $_SESSION['role'] != 'admin') {
    header("Location: dashboard.php");
    exit();
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Admin Panel</title>
</head>
<body>
    <h2>Halo Admin <?php echo $_SESSION['username']; ?></h2>
    <p>Ini halaman khusus admin.</p>
    <a href="dashboard.php">Kembali ke Dashboard</a>
</body>
</html>

Dengan begitu, hanya user dengan role admin yang bisa masuk.


Meningkatkan Keamanan Login

Walaupun sistem ini sudah bekerja, ada beberapa praktik baik yang wajib diterapkan pada aplikasi nyata:

  1. Password Hashing Modern
    Hindari MD5. Gunakan password_hash() dan password_verify(). // Saat registrasi $password = password_hash($_POST['password'], PASSWORD_DEFAULT); // Saat login if (password_verify($_POST['password'], $row['password'])) { // login sukses }
  2. SQL Injection Protection
    Gunakan prepared statement: $stmt = $conn->prepare("SELECT * FROM users WHERE username=?"); $stmt->bind_param("s", $username); $stmt->execute();
  3. Session Regeneration
    Setelah login, lakukan session_regenerate_id(true); untuk mencegah session hijacking.
  4. HTTPS
    Selalu gunakan SSL/TLS untuk melindungi data login.

Menambahkan Fitur “Remember Me” yang Lebih Aman

Cara sederhana dengan cookie bisa berbahaya jika cookie dicuri. Solusi yang lebih baik adalah menyimpan token unik di database.

  • Buat kolom remember_token di tabel users.
  • Saat login dengan Remember Me, buat token acak, simpan di database dan juga di cookie.
  • Saat pengguna kembali, verifikasi token tersebut.

Contoh:

$token = bin2hex(random_bytes(16));
setcookie("remember_token", $token, time() + (86400 * 7), "/");
mysqli_query($conn, "UPDATE users SET remember_token='$token' WHERE username='$username'");

Lalu saat pengguna kembali:

if (isset($_COOKIE['remember_token'])) {
    $token = $_COOKIE['remember_token'];
    $query = "SELECT * FROM users WHERE remember_token='$token'";
    $result = mysqli_query($conn, $query);
    if ($row = mysqli_fetch_assoc($result)) {
        $_SESSION['username'] = $row['username'];
    }
}

Membuat Session Timeout Otomatis

Sudah kita terapkan di dashboard, tapi bisa dibuat lebih fleksibel dengan menaruh logika di config.php.

$timeout = 600; // 10 menit
if (isset($_SESSION['last_login'])) {
    if (time() - $_SESSION['last_login'] > $timeout) {
        session_destroy();
        header("Location: login.php?timeout=1");
    } else {
        $_SESSION['last_login'] = time();
    }
}

Dengan begitu, semua halaman otomatis mengikuti aturan timeout.


Multi-Level User

Role-based access control penting jika aplikasi memiliki berbagai jenis pengguna. Misalnya:

  • Admin → bisa mengelola user.
  • Editor → bisa menulis artikel.
  • User biasa → hanya bisa membaca.

Strukturnya mirip, tinggal tambahkan logika sesuai role. Dengan sistem ini, aplikasi lebih terkontrol dan aman.

Leave a Reply

Your email address will not be published. Required fields are marked *