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:
- Menyimpan role untuk membedakan hak akses.
- Menyimpan
last_loginagar bisa dipakai untuk timeout. - 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:
- Password Hashing Modern
Hindari MD5. Gunakanpassword_hash()danpassword_verify().// Saat registrasi $password = password_hash($_POST['password'], PASSWORD_DEFAULT); // Saat login if (password_verify($_POST['password'], $row['password'])) { // login sukses } - SQL Injection Protection
Gunakan prepared statement:$stmt = $conn->prepare("SELECT * FROM users WHERE username=?"); $stmt->bind_param("s", $username); $stmt->execute(); - Session Regeneration
Setelah login, lakukansession_regenerate_id(true);untuk mencegah session hijacking. - 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_tokendi 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.
