Session dan Cookie adalah teknologi penting untuk menyimpan informasi pengguna di aplikasi web. Pelajari cara menggunakan keduanya untuk membuat sistem login, keranjang belanja, dan fitur yang memerlukan penyimpanan data sementara.
Apa itu Session?
Session adalah cara untuk menyimpan data pengguna di server selama mereka menggunakan aplikasi web. Data session disimpan di server dan diidentifikasi melalui session ID yang dikirim ke browser.
Cara Kerja Session
- Server membuat session ID unik ketika session dimulai
- Session ID dikirim ke browser melalui cookie
- Browser mengirim session ID kembali ke server pada setiap request
- Server menggunakan session ID untuk mengidentifikasi data session
Memulai Session
<?php
// Memulai session - harus dipanggil sebelum output HTML
session_start();
// Menyimpan data ke session
$_SESSION['username'] = 'john_doe';
$_SESSION['email'] = 'john@example.com';
$_SESSION['login_time'] = time();
echo "Session telah dimulai!";
echo "<br>Session ID: " . session_id();
?>
Menyimpan dan Mengakses Data Session
<?php
session_start();
// Menyimpan data
$_SESSION['user_id'] = 123;
$_SESSION['user_role'] = 'admin';
$_SESSION['preferences'] = [
'theme' => 'dark',
'language' => 'id',
'notifications' => true
];
// Mengakses data
if (isset($_SESSION['username'])) {
echo "Selamat datang, " . $_SESSION['username'];
} else {
echo "Anda belum login";
}
// Mengecek apakah session variable ada
if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
echo "<br>Anda adalah administrator";
}
// Menampilkan semua data session
echo "<h3>Data Session:</h3>";
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>
Menghapus Data Session
<?php
session_start();
// Menghapus variable session tertentu
unset($_SESSION['username']);
// Menghapus semua data session
session_unset();
// Menghancurkan session sepenuhnya
session_destroy();
// Contoh fungsi logout
function logout() {
session_start();
// Hapus semua variable session
$_SESSION = array();
// Hapus session cookie jika ada
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Hancurkan session
session_destroy();
// Redirect ke halaman login
header("Location: login.php");
exit();
}
// Memanggil fungsi logout
// logout();
?>
Konfigurasi Session
<?php
// Konfigurasi session sebelum session_start()
// Set nama session
session_name('MYSESSIONID');
// Set direktori penyimpanan session
session_save_path('/tmp/sessions');
// Set lifetime session (dalam detik)
ini_set('session.gc_maxlifetime', 3600); // 1 jam
// Set cookie parameters
session_set_cookie_params([
'lifetime' => 3600,
'path' => '/',
'domain' => '.example.com',
'secure' => true, // Hanya HTTPS
'httponly' => true, // Tidak dapat diakses JavaScript
'samesite' => 'Strict' // CSRF protection
]);
session_start();
// Regenerate session ID untuk keamanan
session_regenerate_id(true);
echo "Session dikonfigurasi dengan aman";
?>
Apa itu Cookie?
Cookie adalah file kecil yang disimpan di browser pengguna untuk menyimpan informasi yang dapat diakses pada kunjungan selanjutnya. Cookie berguna untuk menyimpan preferensi pengguna, item keranjang belanja, dan data yang perlu bertahan lebih lama.
Membuat Cookie
<?php
// Cookie sederhana (berlaku sampai browser ditutup)
setcookie("username", "john_doe");
// Cookie dengan waktu expired (1 hari dari sekarang)
$expire = time() + (24 * 60 * 60); // 24 jam
setcookie("user_preference", "dark_theme", $expire);
// Cookie dengan path dan domain
setcookie("language", "id", $expire, "/", ".example.com");
// Cookie yang aman (HTTPS only) dan HttpOnly
setcookie("secure_data", "sensitive_info", $expire, "/", "", true, true);
// Cookie dengan semua parameter
setcookie(
"complete_cookie", // nama
"cookie_value", // nilai
time() + 3600, // expired (1 jam)
"/admin", // path
".example.com", // domain
true, // secure (HTTPS)
true // httponly
);
echo "Cookie telah dibuat!";
?>
Membaca Cookie
<?php
// Membaca cookie
if (isset($_COOKIE['username'])) {
echo "Selamat datang kembali, " . $_COOKIE['username'];
} else {
echo "Anda pengunjung baru";
}
// Fungsi untuk mendapatkan cookie dengan default value
function getCookie($name, $default = null) {
return isset($_COOKIE[$name]) ? $_COOKIE[$name] : $default;
}
$theme = getCookie('user_preference', 'light_theme');
echo "<br>Theme yang dipilih: $theme";
// Menampilkan semua cookie
echo "<h3>Semua Cookie:</h3>";
echo "<pre>";
print_r($_COOKIE);
echo "</pre>";
// Contoh penggunaan cookie untuk preferensi
$language = getCookie('language', 'en');
if ($language === 'id') {
echo "<br>Selamat datang di situs kami!";
} else {
echo "<br>Welcome to our website!";
}
?>
Menghapus Cookie
<?php
// Menghapus cookie dengan set expired time ke masa lalu
setcookie("username", "", time() - 3600);
// Menghapus cookie dengan path dan domain yang sama
setcookie("user_preference", "", time() - 3600, "/", ".example.com");
// Fungsi untuk menghapus cookie
function deleteCookie($name, $path = "/", $domain = "") {
setcookie($name, "", time() - 3600, $path, $domain);
}
// Menggunakan fungsi
deleteCookie("language");
deleteCookie("secure_data", "/admin", ".example.com");
echo "Cookie telah dihapus";
// Menghapus semua cookie (tidak direkomendasikan)
function deleteAllCookies() {
foreach ($_COOKIE as $name => $value) {
setcookie($name, "", time() - 3600, "/");
}
}
?>
Keamanan Cookie
<?php
// Enkripsi data cookie
function setSecureCookie($name, $value, $expire = 0) {
$secret_key = "your-secret-key-here";
$encrypted_value = base64_encode(openssl_encrypt($value, 'AES-256-CBC', $secret_key, 0, substr(hash('sha256', $secret_key), 0, 16)));
setcookie($name, $encrypted_value, $expire, "/", "", true, true);
}
function getSecureCookie($name) {
if (!isset($_COOKIE[$name])) {
return null;
}
$secret_key = "your-secret-key-here";
$decrypted_value = openssl_decrypt(base64_decode($_COOKIE[$name]), 'AES-256-CBC', $secret_key, 0, substr(hash('sha256', $secret_key), 0, 16));
return $decrypted_value;
}
// Menggunakan cookie terenkripsi
setSecureCookie("user_id", "123", time() + 3600);
$user_id = getSecureCookie("user_id");
echo "User ID: " . $user_id;
// Cookie dengan signed value untuk mencegah tampering
function setSignedCookie($name, $value, $expire = 0) {
$secret = "your-signing-secret";
$signature = hash_hmac('sha256', $value, $secret);
$signed_value = $value . '.' . $signature;
setcookie($name, $signed_value, $expire, "/", "", true, true);
}
function getSignedCookie($name) {
if (!isset($_COOKIE[$name])) {
return null;
}
$parts = explode('.', $_COOKIE[$name]);
if (count($parts) !== 2) {
return null;
}
$value = $parts[0];
$signature = $parts[1];
$secret = "your-signing-secret";
$expected_signature = hash_hmac('sha256', $value, $secret);
if (hash_equals($expected_signature, $signature)) {
return $value;
}
return null; // Cookie telah dimodifikasi
}
?>
Sistem Login dengan Session
Implementasi sistem login yang aman menggunakan session dan cookie.
Halaman Login
<?php
session_start();
// Jika sudah login, redirect ke dashboard
if (isset($_SESSION['user_id'])) {
header("Location: dashboard.php");
exit();
}
$error = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
$remember = isset($_POST['remember']);
// Validasi (dalam aplikasi nyata, gunakan database)
$users = [
'admin' => password_hash('admin123', PASSWORD_DEFAULT),
'user' => password_hash('user123', PASSWORD_DEFAULT)
];
if (isset($users[$username]) && password_verify($password, $users[$username])) {
// Login berhasil
session_regenerate_id(true); // Keamanan: regenerate session ID
$_SESSION['user_id'] = $username;
$_SESSION['username'] = $username;
$_SESSION['login_time'] = time();
$_SESSION['last_activity'] = time();
// Remember me functionality
if ($remember) {
$token = bin2hex(random_bytes(32));
// Simpan token ke database dalam aplikasi nyata
setcookie('remember_token', $token, time() + (30 * 24 * 60 * 60), '/', '', true, true); // 30 hari
}
header("Location: dashboard.php");
exit();
} else {
$error = "Username atau password salah";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<style>
body { font-family: Arial, sans-serif; max-width: 400px; margin: 50px auto; padding: 20px; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; }
input[type="text"], input[type="password"] { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; }
button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; }
.error { color: red; margin-bottom: 15px; }
.checkbox { margin-right: 5px; }
</style>
</head>
<body>
<h2>Login</h2>
<?php if ($error): ?>
<div class="error"><?php echo htmlspecialchars($error); ?></div>
<?php endif; ?>
<form method="POST">
<div class="form-group">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
</div>
<div class="form-group">
<input type="checkbox" id="remember" name="remember" class="checkbox">
<label for="remember" style="display: inline;">Ingat saya</label>
</div>
<button type="submit">Login</button>
</form>
<p><small>Demo: username=admin, password=admin123</small></p>
</body>
</html>
Middleware Autentikasi
<?php
// auth.php - Middleware untuk memeriksa autentikasi
function checkAuth() {
session_start();
// Cek session timeout (30 menit)
if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > 1800)) {
session_unset();
session_destroy();
header("Location: login.php?timeout=1");
exit();
}
// Update last activity
$_SESSION['last_activity'] = time();
// Cek apakah user sudah login
if (!isset($_SESSION['user_id'])) {
// Cek remember me token
if (isset($_COOKIE['remember_token'])) {
// Dalam aplikasi nyata, validasi token dari database
$valid_token = true; // Placeholder
if ($valid_token) {
// Restore session
$_SESSION['user_id'] = 'admin'; // Dari database
$_SESSION['username'] = 'admin';
$_SESSION['login_time'] = time();
$_SESSION['last_activity'] = time();
return true;
}
}
header("Location: login.php");
exit();
}
return true;
}
function requireAdmin() {
checkAuth();
if ($_SESSION['username'] !== 'admin') {
header("HTTP/1.1 403 Forbidden");
echo "Akses ditolak. Hanya admin yang diizinkan.";
exit();
}
}
function getCurrentUser() {
return [
'id' => $_SESSION['user_id'] ?? null,
'username' => $_SESSION['username'] ?? null,
'login_time' => $_SESSION['login_time'] ?? null
];
}
?>
Dashboard dengan Session
<?php
require_once 'auth.php';
checkAuth();
$user = getCurrentUser();
$login_duration = time() - $user['login_time'];
$hours = floor($login_duration / 3600);
$minutes = floor(($login_duration % 3600) / 60);
?>
<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.header { background: #f8f9fa; padding: 15px; border-radius: 5px; margin-bottom: 20px; }
.info-box { background: #e7f3ff; padding: 15px; border-radius: 5px; margin: 10px 0; }
.logout-btn { background: #dc3545; color: white; padding: 8px 15px; text-decoration: none; border-radius: 4px; }
</style>
</head>
<body>
<div class="header">
<h1>Dashboard</h1>
<p>Selamat datang, <strong><?php echo htmlspecialchars($user['username']); ?></strong>!</p>
<a href="logout.php" class="logout-btn">Logout</a>
</div>
<div class="info-box">
<h3>Informasi Session</h3>
<p><strong>Session ID:</strong> <?php echo session_id(); ?></p>
<p><strong>Login Time:</strong> <?php echo date('Y-m-d H:i:s', $user['login_time']); ?></p>
<p><strong>Login Duration:</strong> <?php echo $hours; ?> jam <?php echo $minutes; ?> menit</p>
<p><strong>Last Activity:</strong> <?php echo date('Y-m-d H:i:s', $_SESSION['last_activity']); ?></p>
</div>
<div class="info-box">
<h3>Data Session</h3>
<pre><?php print_r($_SESSION); ?></pre>
</div>
<div class="info-box">
<h3>Cookie Information</h3>
<pre><?php print_r($_COOKIE); ?></pre>
</div>
<p><a href="profile.php">Edit Profile</a> | <a href="admin.php">Admin Panel</a></p>
</body>
</html>
Logout
<?php
session_start();
// Hapus semua data session
$_SESSION = array();
// Hapus session cookie
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Hapus remember me cookie
if (isset($_COOKIE['remember_token'])) {
setcookie('remember_token', '', time() - 3600, '/', '', true, true);
}
// Hancurkan session
session_destroy();
// Redirect ke login dengan pesan
header("Location: login.php?logout=1");
exit();
?>