Session di Laravel β€” Struktur, Driver, dan Perbedaannya dengan Cache

Kalau kamu baru mulai belajar Laravel, pasti sudah sering lihat session() atau Session:: muncul di berbagai tutorial. Tapi jarang ada yang benar-benar jelasin: apa itu session, bagaimana cara kerjanya di balik layar, dan kapan harus pakai session vs cache?

Di artikel ini kita bahas dari awal β€” dengan analogi dulu, baru masuk ke kode.


πŸ€” Masalah yang Session Selesaikan

HTTP itu stateless. Artinya, setiap request yang masuk ke server dianggap orang asing β€” server tidak ingat siapa kamu, tidak ingat kamu sudah login, tidak ingat isi keranjang belanja kamu.

Bayangin kamu belanja di supermarket. Kamu ambil barang, taruh di keranjang, lalu pergi ke lorong berikutnya. Tapi begitu kamu balik, kasirnya tidak ingat siapa kamu β€” dan keranjang belanja kamu sudah kosong lagi.

Itulah HTTP tanpa session.

Session adalah cara Laravel “mengingat” siapa kamu di antara satu request ke request berikutnya. Laravel menyimpan data sementara yang dikaitkan dengan browser kamu β€” selama sesi berlangsung.


🧭 Cara Kerja Session di Balik Layar

Ini yang terjadi setiap kali kamu menggunakan session:

Browser                          Server (Laravel)
  β”‚                                     β”‚
  │──── Request + Cookie (session_id) ──▢│
  β”‚                                     │── Cari data session berdasarkan ID
  β”‚                                     │── Baca / tulis data
  │◀─── Response + Cookie (session_id) ──│
  β”‚                                     β”‚
  1. Saat pertama kali visit, Laravel membuat session ID unik β€” berupa string acak panjang.
  2. Session ID ini disimpan di cookie di browser kamu.
  3. Data session yang sebenarnya (isi keranjang, status login, dll) disimpan di server β€” bisa di file, database, Redis, tergantung driver yang dipakai.
  4. Di request berikutnya, browser otomatis kirim cookie itu, Laravel baca session ID-nya, lalu ambil data yang sesuai.

Jadi yang ada di browser kamu hanya ID-nya saja β€” datanya tetap di server. Ini yang bikin session relatif aman.


πŸ“¦ Struktur Session di Laravel

Konfigurasi session ada di dua tempat:

πŸ“ config/session.php β€” pengaturan utama session

<?php

return [
    // Driver yang dipakai β€” file, cookie, database, redis, memcached, array
    'driver' => env('SESSION_DRIVER', 'file'),

    // Berapa lama session bertahan (dalam menit)
    // Default 120 menit = 2 jam tidak aktif β†’ session hangus
    'lifetime' => env('SESSION_LIFETIME', 120),

    // Session ikut hangus saat browser ditutup?
    'expire_on_close' => false,

    // Nama cookie yang dikirim ke browser
    'cookie' => env('SESSION_COOKIE', 'laravel_session'),

    // Domain yang boleh baca cookie ini
    // null = hanya domain yang sama
    'domain' => env('SESSION_DOMAIN', null),
];

πŸ“ .env β€” nilai aktualnya

SESSION_DRIVER=file
SESSION_LIFETIME=120

πŸ—‚οΈ Driver Session β€” Pilih yang Mana?

Driver adalah tempat Laravel menyimpan data session. Masing-masing punya karakter yang berbeda.

1. file (Default)

Data session disimpan sebagai file teks di folder storage/framework/sessions/.

storage/
└── framework/
    └── sessions/
        β”œβ”€β”€ a1b2c3d4e5f6...   ← ini satu session (nama file = session ID)
        β”œβ”€β”€ x9y8z7w6v5u4...
        └── ...

Kalau kamu buka salah satu filenya, isinya kira-kira seperti ini (terenkripsi):

a:3:{s:6:"_token";s:40:"abc123...";s:4:"cart";a:2:{...};s:8:"_flash";a:2:{...}}

Cocok untuk: development, project kecil, server tunggal.

Tidak cocok untuk: production dengan banyak traffic atau multiple server β€” karena file session hanya ada di satu server.

// .env
SESSION_DRIVER=file

2. database

Data session disimpan di tabel database. Harus buat tabelnya dulu:

php artisan session:table
php artisan migrate

Perintah di atas akan membuat tabel sessions dengan struktur seperti ini:

sessions
β”œβ”€β”€ id          ← session ID (primary key)
β”œβ”€β”€ user_id     ← null kalau belum login, diisi kalau sudah login
β”œβ”€β”€ ip_address  ← IP address pengunjung
β”œβ”€β”€ user_agent  ← info browser pengunjung
β”œβ”€β”€ payload     ← data session (terenkripsi)
└── last_activity ← timestamp terakhir aktif

Cocok untuk: production dengan server tunggal, atau kalau kamu butuh lihat data session langsung dari database (untuk debugging atau admin panel).

Tidak cocok untuk: traffic sangat tinggi β€” setiap request baca/tulis ke database bisa jadi bottleneck.

// .env
SESSION_DRIVER=database

3. redis

Data session disimpan di Redis β€” database in-memory yang sangat cepat.

// .env
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379

Cocok untuk: production dengan traffic tinggi, atau aplikasi yang pakai multiple server (karena Redis bisa diakses dari server manapun).

Tidak cocok untuk: kalau belum ada infrastruktur Redis β€” setup-nya butuh langkah tambahan.


4. cookie

Data session disimpan langsung di cookie browser β€” tidak ada yang disimpan di server.

Cocok untuk: sangat jarang dipakai karena ada batasan ukuran cookie (4KB) dan semua data ada di sisi client.


Perbandingan Singkat

DriverKecepatanCocok untukButuh Setup Tambahan
fileSedangDevelopment, project kecil❌
databaseSedangProduction server tunggalβœ… (migrate)
redisSangat cepatProduction traffic tinggiβœ… (install Redis)
cookieCepatJarang dipakai❌

✍️ Cara Pakai Session di Laravel

Menyimpan Data

// Cara 1: helper function
session(['cart_count' => 3]);

// Cara 2: via Request object (di dalam Controller)
$request->session()->put('cart_count', 3);

// Cara 3: Facade
use Illuminate\Support\Facades\Session;
Session::put('cart_count', 3);

Membaca Data

// Ambil nilai, dengan default kalau key tidak ada
$count = session('cart_count', 0);

// Cara lain
$count = $request->session()->get('cart_count', 0);

Menghapus Data

// Hapus satu key
session()->forget('cart_count');

// Hapus semua data session
session()->flush();

Flash Data β€” Data yang Otomatis Hilang Setelah Dibaca

Ini fitur yang sangat berguna untuk pesan sukses/error setelah redirect:

// Di Controller: simpan pesan
session()->flash('success', 'Produk berhasil ditambahkan ke keranjang!');

return redirect()->route('cart.index');
// Di View (Blade): tampilkan pesan
@if (session('success'))
    <div class="alert alert-success">
        {{ session('success') }}
    </div>
@endif

πŸ“Œ Flash data otomatis hilang setelah request berikutnya selesai β€” jadi pesan sukses tidak akan terus muncul kalau user refresh halaman.


πŸ›’ Contoh Nyata β€” Keranjang Belanja

Ini contoh penggunaan session yang paling umum di e-commerce:

πŸ“ app/Http/Controllers/CartController.php

<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class CartController extends Controller
{
    // Tambah produk ke keranjang
    public function add(Request $request, Product $product): \Illuminate\Http\RedirectResponse
    {
        // Ambil isi keranjang saat ini, default array kosong
        $cart = session('cart', []);

        $productId = $product->id;

        if (isset($cart[$productId])) {
            // Kalau sudah ada di keranjang, tambah quantity-nya
            $cart[$productId]['quantity']++;
        } else {
            // Kalau belum ada, masukkan sebagai item baru
            $cart[$productId] = [
                'name'     => $product->name,
                'price'    => $product->price,
                'quantity' => 1,
            ];
        }

        // Simpan kembali ke session
        session(['cart' => $cart]);

        session()->flash('success', "{$product->name} ditambahkan ke keranjang.");

        return redirect()->back();
    }

    // Lihat isi keranjang
    public function index(): \Illuminate\View\View
    {
        $cart  = session('cart', []);
        $total = collect($cart)->sum(fn ($item) => $item['price'] * $item['quantity']);

        return view('cart.index', compact('cart', 'total'));
    }

    // Hapus satu produk dari keranjang
    public function remove(int $productId): \Illuminate\Http\RedirectResponse
    {
        $cart = session('cart', []);

        unset($cart[$productId]);

        session(['cart' => $cart]);

        session()->flash('success', 'Produk dihapus dari keranjang.');

        return redirect()->back();
    }

    // Kosongkan keranjang (setelah checkout)
    public function clear(): \Illuminate\Http\RedirectResponse
    {
        session()->forget('cart');

        return redirect()->route('home');
    }
}

πŸ†š Session vs Cache β€” Apa Bedanya?

Ini yang sering bikin bingung karena keduanya sama-sama “menyimpan data sementara”. Tapi tujuannya berbeda:

Session

  • Data per pengguna β€” setiap pengunjung punya data session sendiri.
  • Terikat pada satu browser/pengguna tertentu.
  • Contoh: isi keranjang belanja, status login, pesan flash.
// Ini hanya ada untuk user yang sedang login di browser ini
session(['cart' => $cartData]);

Cache

  • Data bersama β€” semua pengguna bisa membaca data yang sama.
  • Dipakai untuk menyimpan hasil komputasi yang mahal agar tidak perlu dihitung ulang.
  • Contoh: daftar produk terlaris, hasil query yang berat, konfigurasi dari database.
// Ini dibaca oleh SEMUA pengunjung website
$topProducts = Cache::remember('top_products', 3600, function () {
    return Product::orderBy('sold_count', 'desc')->take(10)->get();
});

Analogi Mudahnya

Bayangkan kamu di sebuah restoran:

Session = meja kamu sendiri. Pesanan kamu, minuman kamu, tagihan kamu β€” hanya ada di meja kamu. Pengunjung lain tidak bisa lihat atau sentuh.

Cache = papan menu di dinding. Semua pengunjung baca menu yang sama. Kalau menu berubah, papannya diganti β€” dan semua orang langsung lihat menu baru.

Perbandingan

SessionCache
Data untuk siapaSatu penggunaSemua pengguna
TujuanMenyimpan state penggunaMenyimpan data yang mahal dihitung
ContohKeranjang belanja, loginQuery berat, API response
Hangus saatLogout / timeoutTTL habis

πŸ’‘ Ingat!

Gunakan session kalau data yang disimpan berbeda untuk tiap pengguna β€” isi keranjang, status login, preferensi tampilan.

Gunakan cache kalau data yang disimpan sama untuk semua pengguna β€” hasil query berat, data produk yang jarang berubah, response dari API eksternal.

Salah satunya adalah tentang siapa yang punya datanya. Session punya pemilik. Cache tidak.

Share Twitter/X LinkedIn