Apa Itu Session

pindipin
20 October 2026
15 min read

Kamu login ke aplikasi Laravel, membuka dashboard, lalu pindah ke halaman profil. Aplikasi tidak meminta password ulang. Itu bukan karena server "mengingat" kamu secara magis. HTTP adalah protokol stateless — setiap request dianggap baru. Untuk mengatasi hal itu, aplikasi menggunakan session: mekanisme untuk menyimpan informasi pengguna di antaranya beberapa request.

Dalam artikel ini, kamu akan mempelajari cara kerja session, siklus hidupnya, perbandingan dengan token JWT, ancaman keamanan, opsi penyimpanan, konfigurasi cookie, dan implementasi di PHP dan Laravel.


Apa itu Session?

Pengertian Session

Session adalah mekanisme penyimpanan state di sisi server untuk aplikasi web berbasis HTTP. Data session, seperti informasi login atau keranjang belanja, disimpan di server. Klien hanya menyimpan session ID via cookie, yang server gunakan untuk mencari data terkait setiap request.

Session sering disebutkan bersama autentikasi, tetapi keduanya tidak sama. Autentikasi memverifikasi identitas pengguna, misalnya saat login. Session menjaga agar aplikasi mengingat bahwa pengguna telah terautentikasi di antaranya beberapa request. Baca lebih detail di panduan authentication dan perbandingan authentication vs authorization.

Mengapa Session Dibutuhkan

HTTP tidak menyimpan riwayat klien. Setiap request diproses server secara independen. Jika kamu ingin aplikasi "mengenal" pengguna setelah login, kamu perlu jembatan antar request. Session adalah solusi umum untuk itu.

Sering kali session dan cookie disalahpahami sebagai hal yang sama. Keduanya berbeda:

  • Cookie menyimpan data langsung di browser klien. Setiap request, browser mengirimkan isi cookie ke server.
  • Session menyimpan data di server. Di sisi klien hanya disimpan session ID, yang berfungsi sebagai kunci pencarian data session di server.

Karena data asli tidak pernah meninggalkan server, session relatif lebih aman untuk menyimpan informasi internal aplikasi dibandingkan menyimpan segalanya di cookie.

Contoh Penggunaan Session

Session digunakan untuk berbagai kebutuhan, di antaranya:

  • Menyimpan informasi pengguna yang sudah login, seperti user_id dan username.
  • Keranjang belanja sementara di toko online sebelum checkout.
  • Notifikasi flash, misalnya pesan sukses atau error setelah redirect.
  • Preferensi tampilan sementara, seperti bahasa atau tema gelap/terang.

Cara Kerja Session

Komponen Utama Session

Empat komponen yang perlu kamu pahami sebelum melihat alurnya:

Session data adalah informasi yang disimpan di server, misalnya user_id = 123 dan logged_in_at.

Session ID adalah string acak unik yang menjadi kunci pencarian data session di server. Setiap pengguna yang membuka session akan mendapatkan session ID sendiri.

Session cookie adalah cookie di browser yang menyimpan session ID. Di PHP native biasanya bernama PHPSESSID, sedangkan di Laravel biasanya laravel_session.

Session storage adalah tempat data session disimpan di server, yang bisa berupa file, database, Redis, atau memcached.

Alur Kerja Session

Alurnya secara berkala:

  1. Kamu mengakses aplikasi. Server memulai session (session_start() di PHP native, otomatis via middleware StartSession di Laravel).
  2. Server membuat session baru dan menghasilkan session ID yang sulit ditebak.
  3. Server menyimpan data session di penyimpanan server, dengan session ID sebagai kunci.
  4. Server mengirimkan Set-Cookie ke browser yang berisi session ID.
  5. Browser menyimpan cookie dan menyertakannya di setiap request berikutnya melalui header Cookie.
  6. Server membaca session ID dari cookie, mencocokkannya dengan data session yang tersimpan, lalu menyediakannya ke aplikasi.
  7. Aplikasi dapat membaca dan memperbarui data session, misalnya waktu terakhir aktif.
  8. Saat logout atau expired, server menghapus data session dan meminta browser menghapus cookie.

Karakteristik Session ID yang Aman

Session ID adalah titik lemah terbesar jika dibuat salah. Session ID yang aman harus:

  • Acak dan tidak dapat diprediksi.
  • Cukup panjang (minimal 128 bit entropi menurut OWASP) untuk mencegah brute force dan tebak session ID.
  • Dihasilkan ulang setelah login sukses, untuk mencegah session fixation.

PHP native menghasilkan session ID menggunakan random_bytes sejak PHP 7.1, sehingga kamu tidak perlu mengimplementasikan pengacak sendiri.


Siklus Hidup Session

Session melalui empat fase: create, read, update, dan destroy.

Create (Membuat Session)

Di PHP native, session dimulai dengan memanggil session_start(). Fungsi ini akan membuat session baru atau melanjutkan session yang sudah ada. Di Laravel, kamu tidak perlu memanggilnya secara manual. Middleware StartSession akan menanganinya, dan kamu dapat mengakses session melalui helper session().

Read (Membaca Data Session)

Di PHP native, kamu membaca data session melalui array superglobal $_SESSION, misalnya $_SESSION['user_id']. Di Laravel, kamu memiliki beberapa opsi: session('key'), Session::get('key'), atau $request->session()->get('key').

Update (Memperbarui Data Session)

Di PHP native, kamu cukup menetapkan nilai ke $_SESSION['key']. Di Laravel, kamu bisa menggunakan session(['key' => 'value']), session()->put('key', 'value'), atau $request->session()->put('key', 'value').

Destroy (Menghancurkan Session)

Di PHP native, session_destroy() menghapus semua data session di server, tapi tidak menghapus cookie browser otomatis. Kamu perlu setcookie() dengan masa berlaku lepas. Di Laravel, session()->flush() menghapus semua data, session()->forget('key') satu kunci, dan Auth::logout() untuk logout.

Menghancurkan session di server tidak cukup jika cookie masih tersimpan di browser. Kamu harus membersihkan keduanya untuk logout yang sempurna.


Session vs Token (JWT)

Salah satu pertanyaan yang sering muncul adalah apakah harus menggunakan session atau token seperti JWT. Keduanya memiliki cara kerja dan kelebihan yang berbeda.

Perbedaan Utama

Session adalah stateful. Server menyimpan data session, dan klien hanya menyimpan session ID melalui cookie. Setiap request, server mencocokkan session ID dengan penyimpanan di server. Mencabut session mudah dilakukan: cukup hapus data session di server.

Token JWT adalah stateless. Klien menyimpan token, dan server memverifikasi tanda tangan tanpa penyimpanan terpusat. JWT lebih mudah diskalakan, tetapi mencabut token sebelum expired sulit tanpa blacklist atau revocation list.

Session juga memiliki overhead ukuran lebih kecil karena cookie hanya berisi session ID, sedangkan JWT membawa payload dan signature yang lebih besar. Kamu dapat membaca lebih lanjut tentang JWT di panduan JWT JSON Web Token.

Kapan Menggunakan Session

Session cocok untuk aplikasi web tradisional (monolith dengan SSR Blade, Livewire, Inertia) dan first-party SPA di domain yang sama dengan Laravel. Jika butuh logout instan dari server, session adalah pilihan tepat.

Kapan Menggunakan Token JWT

Token JWT lebih cocok untuk API REST, microservices, dan aplikasi mobile yang tidak mengelola cookie maupun CSRF seperti browser. Jika arsitektur kamu menggunakan serverless, JWT juga cenderung lebih mudah diimplementasikan.

Di Laravel, session biasanya terintegrasi dengan guard web dan config/session.php, sementara token terkait dengan Laravel Sanctum, Passport, atau paket komunitas seperti tymon/jwt-auth.


Opsi Penyimpanan Session

Laravel dan PHP native menyediakan beberapa opsi tempat menyimpan data session. Pilihan driver akan mempengaruhi performa, skalabilitas, dan bagaimana aplikasi kamu berperilaku di banyak server.

Driver File

Data session disimpan sebagai file di direktori (storage/framework/sessions di Laravel, session.save_path di PHP native). Driver file cukup cepat untuk aplikasi kecil di satu server, tetapi tidak cocok untuk multi-server kecuali dengan shared filesystem.

Driver Database

Data session disimpan di tabel database (php artisan session:table di Laravel). Cocok untuk multi-server dengan database terpusat, tetapi setiap request menambah I/O database yang bisa menjadi hambatan saat trafik tinggi.

Driver Redis

Data session disimpan di Redis dengan kecepatan tinggi, cocok untuk multi-server dan skala horizontal. Laravel mendukung Redis melalui predis atau phpredis. Disarankan untuk produksi skala menengah hingga besar.

Driver Memcached

Memcached adalah penyimpanan in-memory terdistribusi yang cepat. Namun, data akan hilang saat Memcached di-restart, dan tidak mendukung persistensi. Karena keterbatasan ini, memcached jarang digunakan untuk session dibandingkan Redis.

Laravel juga menyediakan driver cookie, di mana session dienkripsi dan disimpan sepenuhnya di cookie klien. Driver ini tidak disarankan untuk data sensitif atau data besar, karena cookie memiliki batas ukuran sekitar 4 KB.

Memilih Driver yang Tepat

Jika aplikasi kamu masih kecil dan berjalan di satu server, driver file sudah cukup. Untuk aplikasi yang berjalan di banyak server, gunakan driver database atau Redis agar session tersedia di semua node. Redis biasanya menjadi pilihan utama untuk produksi yang butuh skalabilitas.


Session ID dikirim ke browser via cookie, sehingga atribut cookie berpengaruh besar pada keamanan session. Berikut atribut penting yang perlu kamu atur.

HttpOnly

Atribut HttpOnly mencegah cookie diakses melalui JavaScript, misalnya lewat document.cookie. Ini melindungi session cookie dari pencurian melalui serangan XSS. Sebaiknya selalu diaktifkan.

Secure

Atribut Secure memastikan cookie hanya dikirim melalui HTTPS. Pada produksi, paksa HTTPS dan aktifkan atribut ini agar session ID tidak bisa dicuri melalui packet sniffing di jaringan HTTP.

SameSite

Atribut SameSite mengontrol apakah cookie dikirim pada request lintas situs. Strict berarti cookie hanya dikirim pada request yang berasal dari situs yang sama. Lax aman untuk navigasi biasa, tetapi diblokir pada request POST lintas situs. Sebaiknya gunakan Lax atau Strict. Hindari None kecuali benar-benar diperlukan, dan jika digunakan, harus bersama dengan Secure.

Lifetime dan Expires

Lifetime menentukan masa berlaku cookie dan session. Sesuaikan dengan kebutuhan bisnis, misalnya 120 menit, dan terapkan idle timeout sehingga session tidak berlaku selamanya.

Path dan Domain

Path menentukan jalur URL di mana cookie berlaku, biasanya / untuk seluruh domain. Domain menentukan domain di mana cookie berlaku. Hindari mengatur domain yang terlalu luas agar cookie tidak dikirim ke subdomain yang tidak terkait.

Di Laravel, semua atribut ini diatur di config/session.php melalui opsi seperti secure, http_only, same_site, path, dan domain.


Fungsi Session PHP Native

Jika kamu bekerja dengan PHP native, berikut fungsi-fungsi inti untuk mengelola session.

session_start

session_start() memulai atau melanjutkan session. Fungsi ini harus dipanggil sebelum kamu mengakses $_SESSION.

$_SESSION

$_SESSION adalah array superglobal yang digunakan untuk menyimpan data session. Kamu bisa menulis dan membaca data seperti array biasa.

session_regenerate_id

session_regenerate_id() membuat session ID baru. Fungsi ini penting untuk mencegah session fixation. Panggil setelah login sukses, dan gunakan parameter true agar session lama dihapus.

session_destroy

session_destroy() menghancurkan semua data session di server. Perlu diingat, fungsi ini tidak menghapus $_SESSION secara langsung maupun cookie di browser. Kamu masih perlu membersihkan $_SESSION dan cookie secara manual untuk logout yang lengkap.

Fungsi Lainnya

Ada juga session_unset(), session_id(), session_name(), session_set_cookie_params(), dan session_status().

Contoh Kode: Session PHP Native Aman

Berikut contoh implementasi session yang memperhatikan konfigurasi cookie dan regenerasi session ID setelah login:

<?php

// Atur atribut cookie session sebelum memulai session
session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'domain' => '',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);

session_name('app_session');
session_start();

// Simpan data pengguna setelah login berhasil
$_SESSION['user_id'] = 123;
$_SESSION['username'] = 'budi';
$_SESSION['logged_in_at'] = time();

// Regenerasi session ID untuk mencegah session fixation
session_regenerate_id(true);

// Akses data session
echo $_SESSION['user_id'];

// Hapus satu data
unset($_SESSION['username']);

// Logout: kosongkan session dan hapus cookie di browser
$_SESSION = [];
if (ini_get('session.use_cookies')) {
    setcookie(session_name(), '', time() - 42000, '/');
}
session_destroy();

Konfigurasi cookie harus dilakukan sebelum session_start(), dan regenerasi session ID dilakukan segera setelah data login disimpan.


Session di Laravel

Laravel menyediakan dukungan session lengkap terintegrasi dengan autentikasi dan CSRF protection.

Guard web

Guard web adalah guard default Laravel untuk autentikasi berbasis session via cookie, digunakan untuk aplikasi web tradisional seperti Blade, Livewire, dan Inertia. Terintegrasi dengan middleware VerifyCsrfToken untuk perlindungan CSRF.

Setelah pengguna terautentikasi, aplikasi menentukan apa yang boleh dilakukan — cakupan autorisasi, dibahas di panduan autorisasi.

Konfigurasi config/session.php

Konfigurasi session Laravel ada di config/session.php. Opsi penting: driver (file, database, redis, memcached, cookie), lifetime (menit), secure/http_only/same_site (atribut cookie), dan path/domain (cakupan cookie).

Berikut contoh konfigurasi yang mengutamakan keamanan:

return [
    'driver' => env('SESSION_DRIVER', 'redis'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'secure' => env('SESSION_SECURE_COOKIE', true),
    'http_only' => true,
    'same_site' => 'lax',
    'path' => '/',
    'domain' => env('SESSION_DOMAIN', null),
];

Helper Session

Laravel menyediakan helper session() untuk mengakses session dengan cepat, misalnya session('key') untuk membaca dan session(['key' => 'value']) untuk menulis, serta session()->put(), session()->get(), session()->forget(), session()->flush(), session()->regenerate(), session()->increment(), dan session()->pull().

Flash Data

Flash data tersedia hanya untuk request selanjutnya lalu otomatis dihapus, cocok untuk notifikasi setelah redirect. Gunakan session()->flash('key', 'value'), dan session()->reflash() atau session()->keep() untuk mempertahankannya lebih lama.

Driver Session

Laravel mendukung driver file (default development), database, redis (produksi multi-server), memcached, array (testing), dan cookie.

Perlindungan CSRF

Laravel menghasilkan token CSRF per session dan memvalidasinya pada request POST, PUT, PATCH, DELETE via VerifyCsrfToken dalam grup web. Baca detailnya di panduan CSRF.

Contoh Kode: Login Aman dan Flash Data

Berikut contoh controller login di Laravel yang melakukan regenerasi session ID setelah login dan menggunakan flash data:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;

class LoginController extends Controller
{
    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $key = 'login:' . $request->ip() . ':' . $request->email;

        if (RateLimiter::tooManyAttempts($key, 5)) {
            return back()->withErrors(['email' => 'Terlalu banyak percobaan login. Coba lagi nanti.']);
        }

        if (Auth::attempt($request->only('email', 'password'), $request->boolean('remember'))) {
            $request->session()->regenerate(); // mencegah session fixation
            RateLimiter::clear($key);

            return redirect()->intended('/dashboard')
                ->with('success', 'Selamat datang kembali.');
        }

        RateLimiter::hit($key);

        return back()->withErrors(['email' => 'Email atau password salah.']);
    }

    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();

        return redirect('/login')->with('success', 'Kamu telah logout.');
    }
}

$request->session()->regenerate() dipanggil setelah Auth::attempt() berhasil, sehingga session ID berubah sebelum aplikasi menganggap pengguna terautentikasi. Langkah kunci untuk mencegah session fixation.


Ancaman Keamanan Session dan Mitigasi

Session tidak lepas dari risiko keamanan. Berikut ancaman umum dan cara mengatasinya.

Session Fixation

Session fixation terjadi ketika penyerang memaksa pengguna menggunakan session ID yang ditentukan sebelum login. Setelah login, penyerang dapat mengambil alih session terautentikasi tanpa password. Mitigasi: regenerasi session ID segera setelah login dengan session_regenerate_id(true) atau session()->regenerate(), bersama cookie HttpOnly, Secure, dan SameSite.

Session Hijacking

Session hijacking adalah pencurian session ID cookie via XSS, malware, atau packet sniffing. Session ID dicuri berarti penyerang bisa beridentitas sebagai pengguna tanpa password. Mitigasi: HTTPS untuk seluruh situs, cookie Secure dan HttpOnly, SameSite=Strict atau Lax, dan batasi masa berlaku session.

Session Sidejacking

Session sidejacking mirip hijacking, khususnya mencuri session ID via jaringan HTTP tidak terenkripsi dengan packet sniffing. Tidak butuh XSS. Mitigasi: paksa HTTPS dengan HSTS, serta cookie Secure.

CSRF (Cross-Site Request Forgery)

CSRF terjadi ketika situs jahat memaksa browser mengirim request dengan session cookie ke aplikasi target, sehingga tindakan tidak sah dapat dilakukan atas nama pengguna. Mitigasi: token CSRF per session, SameSite=Lax atau Strict, dan validasi origin/referer. Di Laravel, ditangani oleh VerifyCsrfToken.


Best Practices Session Management

Praktik terbaik yang dapat kamu terapkan:

  • Gunakan HTTPS untuk seluruh situs dan aktifkan HSTS. Jangan pernah mengirim session cookie melalui HTTP.
  • Aktifkan cookie HttpOnly, Secure, dan SameSite=Lax atau Strict.
  • Regenerasi session ID segera setelah autentikasi berhasil untuk mencegah session fixation.
  • Atur masa berlaku session yang wajar dan terapkan idle timeout.
  • Sediakan fitur logout dari semua perangkat, misalnya Auth::logoutOtherDevices() di Laravel.
  • Gunakan penyimpanan session terpusat, seperti Redis atau database, untuk aplikasi multi-server dengan load balancing.
  • Jangan menyimpan data sensitif seperti password atau token lengkap langsung dalam session. Simpan referensi seperti user_id, dan ambil data sensitif dari sumber kebenaran.
  • Terapkan CSRF protection untuk semua request yang mengubah state dan menggunakan session cookie.
  • Pantau dan batasi jumlah session aktif per pengguna jika perlu.

Skenario Praktis

Skenario nyata dan rekomendasi implementasinya:

Aplikasi web tradisional dengan Blade atau SSR. Kamu dapat menggunakan PHP native session_start() dan $_SESSION, atau guard web di Laravel dengan driver file atau database.

Login dan logout aman di Laravel. Setelah Auth::attempt() berhasil, panggil $request->session()->regenerate(). Saat logout, gunakan Auth::logout(), diikuti dengan session()->flush() dan session()->regenerate() untuk membersihkan session sepenuhnya.

Notifikasi setelah redirect. Gunakan session()->flash('success', 'Data disimpan.'), lalu tampilkan di Blade dengan @session('success') atau session('success').

Aplikasi multi-server dengan load balancing. Gunakan driver session redis, yang disarankan, atau database, agar session tersedia di semua server node.

SPA (Vue atau React) di domain yang sama dengan Laravel API. Gunakan Laravel Sanctum dengan stateful session authentication, atau token di cookie HttpOnly.

Aplikasi mobile dengan Laravel API. Jangan gunakan session cookie. Gunakan token-based authentication, misalnya Sanctum Personal Access Token atau JWT.

Session expired saat aktif. Redirect ke login dengan pesan bahwa sesi telah berakhir dan pengguna harus login ulang.


Masalah Umum dan Pitfalls

Masalah sering ditemukan saat bekerja dengan session:

  • Lupa regenerasi session ID setelah login, membuat aplikasi rentan terhadap session fixation.
  • Cookie session tanpa HttpOnly rentan dicuri via XSS dengan document.cookie.
  • Cookie session tanpa Secure berisiko session ID dicuri via packet sniffing di jaringan HTTP.
  • Session di banyak server tanpa shared store. Pengguna login di server A, request berikutnya ke server B yang tidak punya data session.
  • Menyimpan data sensitif langsung dalam session, yang berisiko jika file session bocor.
  • Session lifetime yang terlalu panjang, sehingga session yang dicuri berlaku dalam waktu lama.
  • Mengandalkan session untuk autentikasi API mobile, yang tidak mengelola cookie dan CSRF seperti browser.
  • Flash data yang tidak muncul, biasanya karena redirect dilakukan tanpa menyimpan flash atau session belum ditulis sebelum response dikirim.
  • CSRF token mismatch, ketika form POST diterima tetapi token CSRF tidak valid karena session expired atau cookie tidak terkirim.
  • Menggunakan session_destroy() tanpa menghapus cookie di browser, sehingga cookie session masih tersimpan meski data di server sudah dihapus.

Penutup

Session memungkinkan aplikasi web "mengingat" pengguna di antaranya beberapa request HTTP stateless. Data disimpan di server, klien hanya menyimpan session ID via cookie. Memahami siklus hidup session — create, read, update, destroy — dan konfigurasi cookie aman (HttpOnly, Secure, SameSite) membantu membangun aplikasi yang lebih aman. Jangan lupa regenerasi session ID setelah login dan pilih driver penyimpanan yang sesuai skala aplikasi.

Untuk mengecek keamanan session di aplikasi kamu, mulai dari audit konfigurasi cookie session, regenerasi session ID setelah login, driver session, hingga CSRF protection. Referensi teknis: dokumentasi session Laravel dan manual session PHP.


Rujukan Resmi dan Standar Keamanan

Referensi dalam penulisan artikel ini:

  1. OWASP Session Management Cheat Sheet
  2. OWASP CSRF Prevention Cheat Sheet
  3. RFC 6265: HTTP State Management Mechanism
  4. Laravel Documentation: Session
  5. PHP Manual: Sessions
  6. PHP Manual: session_start
  7. PHP Manual: session_regenerate_id
  8. PHP Manual: session_destroy
Bagikan Artikel:
Diskusi & Komentar

Fitur komentar belum diaktifkan oleh administrator.

Artikel Terkait