Keamanan Session dan Login di PHP (Timeout, Logout Otomatis, dan Regenerasi Session)

By | 14 October 2025

Sistem login adalah jantung keamanan aplikasi web. Tanpa pengelolaan session yang baik, akun pengguna bisa diretas melalui session hijacking atau session fixation. Pada artikel ini, kita akan membahas keamanan session, paling tidak ada tiga fitur keamanan penting dalam manajemen session di PHP:

  • Session Timeout (batas waktu login)

  • Logout Otomatis

  • Regenerasi Session ID (Session Hijacking Prevention)

Memahami Session dan Keamanannya

Session di PHP digunakan untuk menyimpan data pengguna saat login agar tetap dikenali selama menggunakan website.
Namun, jika tidak dijaga dengan benar, session bisa menjadi pintu masuk bagi hacker untuk mengambil alih akun pengguna.

Contoh sederhana session:

<?php
session_start();
$_SESSION['username'] = 'arvi';
echo "Selamat datang, " . $_SESSION['username'];
?>

Masalahnya, session ini bisa diretas melalui pencurian cookie atau reuse session ID. Karena itu, kita perlu langkah-langkah pengamanan tambahan.

Menambahkan Timeout Session (Batas Waktu Login)

Timeout session memastikan pengguna otomatis logout setelah waktu tertentu tanpa aktivitas — misalnya, 15 menit.

Berikut contoh penerapannya:

<?php
session_start();

// waktu maksimum dalam detik (15 menit)
$timeout = 15 * 60; 

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $timeout)) {
    session_unset();     // hapus semua variabel session
    session_destroy();   // hancurkan session
    header("Location: login.php?timeout=1");
    exit();
}
$_SESSION['LAST_ACTIVITY'] = time(); // update waktu aktivitas terakhir
?>

Dengan kode ini, jika pengguna diam selama lebih dari 15 menit, mereka akan otomatis logout dan diminta login ulang.

Logout Otomatis Berdasarkan Aktivitas

Logout otomatis bisa digabung dengan timeout, tetapi juga bisa berdasarkan aktivitas spesifik seperti logout manual atau setelah selesai transaksi.

<?php
// logout.php
session_start();
session_unset();
session_destroy();
header("Location: login.php?logout=success");
exit();
?>

Untuk pengalaman lebih baik, tambahkan alert menggunakan Bootstrap atau SweetAlert agar pengguna tahu kenapa mereka logout otomatis.

Contoh (menggunakan Bootstrap alert di login.php):

<?php if (isset($_GET['timeout'])): ?>
<div class="alert alert-warning">Sesi Anda telah berakhir. Silakan login kembali.</div>
<?php endif; ?>

Regenerasi Session ID untuk Mencegah Session Hijacking

Session hijacking terjadi saat hacker mencuri ID session pengguna.
Untuk mencegahnya, PHP menyediakan fungsi session_regenerate_id() yang membuat session ID baru tanpa kehilangan data lama.

Contoh:

<?php
session_start();

// Setelah login berhasil
if (!isset($_SESSION['regenerated'])) {
    session_regenerate_id(true); // buat session ID baru
    $_SESSION['regenerated'] = true;
}
?>

Atau, Anda bisa memanggil fungsi ini secara berkala untuk meningkatkan keamanan:

<?php
if (time() - $_SESSION['LAST_ACTIVITY'] > 300) { // setiap 5 menit
    session_regenerate_id(true);
}
?>

Fungsi ini memutus hubungan antara ID session lama dengan yang baru, sehingga meskipun ID lama dicuri, tidak bisa digunakan lagi.

Tips Tambahan untuk Meningkatkan Keamanan Session

Selain tiga poin di atas, berikut beberapa praktik terbaik:

✅ Gunakan session.cookie_httponly = 1
→ Mencegah akses cookie lewat JavaScript (anti XSS).

✅ Aktifkan session.use_only_cookies = 1
→ Hindari session ID dikirim lewat URL.

✅ Gunakan HTTPS
→ Mencegah pencurian data melalui jaringan.

✅ Enkripsi password dengan password_hash()
→ Jangan pernah simpan password mentah di database.

Contoh Lengkap Login Aman dengan Timeout dan Regenerasi

Berikut contoh sederhana penerapannya:

<?php
session_start();

include 'config.php'; // koneksi database

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $user = $_POST['username'];
    $pass = $_POST['password'];

    $stmt = $conn->prepare("SELECT * FROM users WHERE username=?");
    $stmt->bind_param("s", $user);
    $stmt->execute();
    $result = $stmt->get_result();
    $data = $result->fetch_assoc();

    if ($data && password_verify($pass, $data['password'])) {
        session_regenerate_id(true);
        $_SESSION['username'] = $user;
        $_SESSION['LAST_ACTIVITY'] = time();
        header("Location: dashboard.php");
        exit();
    } else {
        $error = "Username atau password salah!";
    }
}
?>

Pada file dashboard.php:

<?php
session_start();
$timeout = 900; // 15 menit

if (!isset($_SESSION['username'])) {
    header("Location: login.php");
    exit();
}

if (time() - $_SESSION['LAST_ACTIVITY'] > $timeout) {
    session_unset();
    session_destroy();
    header("Location: login.php?timeout=1");
    exit();
}

$_SESSION['LAST_ACTIVITY'] = time();
echo "Selamat datang, " . $_SESSION['username'];
?>

Kesimpulan

Keamanan session adalah aspek penting dalam aplikasi PHP modern. Dengan menerapkan:

  • Timeout session

  • Logout otomatis

  • Session ID regeneration

Anda dapat melindungi pengguna dari berbagai serangan seperti session hijacking dan fixation. Langkah-langkah sederhana ini bisa meningkatkan keamanan sistem login Anda secara signifikan.

Category: PHP