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) βββ
β β
- Saat pertama kali visit, Laravel membuat session ID unik β berupa string acak panjang.
- Session ID ini disimpan di cookie di browser kamu.
- Data session yang sebenarnya (isi keranjang, status login, dll) disimpan di server β bisa di file, database, Redis, tergantung driver yang dipakai.
- 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
| Driver | Kecepatan | Cocok untuk | Butuh Setup Tambahan |
|---|---|---|---|
file | Sedang | Development, project kecil | β |
database | Sedang | Production server tunggal | β (migrate) |
redis | Sangat cepat | Production traffic tinggi | β (install Redis) |
cookie | Cepat | Jarang 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
| Session | Cache | |
|---|---|---|
| Data untuk siapa | Satu pengguna | Semua pengguna |
| Tujuan | Menyimpan state pengguna | Menyimpan data yang mahal dihitung |
| Contoh | Keranjang belanja, login | Query berat, API response |
| Hangus saat | Logout / timeout | TTL 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.
