Pada chapter sebelumnya kita melihat data session hidup di server sementara browser hanya memegang cookie penunjuk. “Di server” itu sendiri ternyata masih sebuah abstraksi — Laravel menyebutnya session driver, dan pilihannya lebih dari satu: file di disk, tabel database, Redis, sampai cookie yang menyimpan data di sisi browser. Pilihan driver menentukan kecepatan, ketahanan data, dan bagaimana aplikasi kita menskalakan. Pada chapter ini kita bedah setiap driver, cara berganti di antara mereka, plus satu fitur yang sering terlupakan: session terenkripsi.
Daftar Driver dan Konfigurasi #
Tempat pertama yang perlu kita lihat adalah config/session.php:
// Supported: "file", "cookie", "database", "memcached",
// "redis", "dynamodb", "array"
'driver' => env('SESSION_DRIVER', 'database'),Driver diambil dari variabel lingkungan SESSION_DRIVER, dan sejak Laravel 11 nilai default-nya adalah database — file .env hasil laravel new langsung berisi baris berikut:
SESSION_DRIVER=databaseBerikut perbandingan tujuh driver yang didukung:
| Driver | Lokasi data | Kecepatan | Catatan penting |
|---|---|---|---|
file | storage/framework/sessions | Cepat (disk lokal) | Default era Laravel 10 ke bawah; cukup untuk satu server |
database | Tabel sessions | Sedang | Default Laravel 11+; butuh migrasi bawaan |
redis | Memori (in-memory) | Sangat cepat | Butuh server Redis + ekstensi/klien |
memcached | Memori | Sangat cepat | Butuh server Memcached |
dynamodb | Layanan AWS | Cepat | Butuh kredensial AWS |
cookie | Browser pengguna | - | Data ikut perjalanan bolak-balik tiap request |
array | Memori proses PHP | - | Khusus testing; data mati saat request selesai |
Cara Setiap Driver Menyimpan Data #
Semua driver memakai payload yang sama — JSON yang di-base64-encode seperti yang kita bedah di chapter sebelumnya. Yang berbeda hanyalah tempat meletakkannya:
filemenulis satu file per session kestorage/framework/sessions. Tidak butuh database sama sekali, sehingga cocok untuk shared hosting tanpa Redis. Batasnya muncul saat aplikasi berjalan di beberapa server: session Budi tersimpan di server A, sementara request berikutnya mendarat di server B — data hilang.databasemenulis ke tabelsessionslewat migrasi bawaan. Karena hampir semua aplikasi Laravel sudah punya database, pilihan ini tidak menambah infrastruktur baru dan data session ikut ter-backup bersama data aplikasi.redismenyimpan payload di memori sebuah server Redis terpisah. Semua server aplikasi menunjuk ke Redis yang sama, sehingga masalah multi-server teratasi — inilah alasan Redis menjadi standar aplikasi bertonase trafik besar.cookieadalah satu-satunya driver yang menyimpan data di sisi client. Seluruh payload ikut dikirim dalam cookie setiap request. Ukurannya jelas terbatas (umumnya 4 KB per cookie) dan setiap request menjadi lebih gemuk, tetapi tidak butuh storage apa pun di server.
Berganti Driver #
Berganti driver hanyalah urusan satu baris .env, misalnya dari database ke redis:
SESSION_DRIVER=redisUntuk driver redis, Laravel perlu bisa berbicara dengan server Redis melalui salah satu dari dua jalan: package predis/predis (murni PHP, composer require predis/predis) atau ekstensi phpredis pada binary PHP. Sandbox kita tidak memiliki jalur yang siap pakai — predis tidak terinstal di vendor/, dan tidak ada server Redis yang berjalan — sehingga konfigurasi di atas hanya bisa ditampilkan sebagai contoh, bukan dijalankan. Setelah Redis tersedia, koneksi diatur di config/database.php bagian redis, dan session dapat menggunakannya lewat SESSION_CONNECTION.
Session Terenkripsi #
Secara default payload session hanya di-encode, bukan dienkripsi — siapa pun yang membaca tabel sessions (atau file session, atau trafik Redis) masih bisa membaca isinya. Laravel menyediakan SESSION_ENCRYPT untuk kasus data yang sensitif:
SESSION_ENCRYPT=trueKetika opsi ini aktif, seluruh payload dienkripsi memakai APP_KEY sebelum ditulis ke storage. Feature test berikut membandingkan isi kolom payload sebelum dan sesudah enkripsi, lalu memastikan roundtrip data tetap berjalan. Method mulaiRequestBaru() adalah helper dari chapter Konsep Session
yang memaksa request berikutnya memuat ulang session dari storage:
// Bagian 1: tanpa enkripsi (default)
config(['session.driver' => 'database', 'session.encrypt' => false]);
$this->get('/sesi/simpan');
$row = DB::table('sessions')->first();
$payload = json_decode((string) base64_decode($row->payload), true);
fwrite(STDERR, 'tanpa_enkripsi: json_valid=' . var_export($payload !== null, true)
. ' nama=' . var_export($payload['nama'] ?? null, true) . "\n");
// Bagian 2: SESSION_ENCRYPT=true
$this->mulaiRequestBaru($row->id);
config(['session.encrypt' => true]);
$this->get('/sesi/simpan');
$row2 = DB::table('sessions')->first();
$raw2 = (string) base64_decode($row2->payload);
fwrite(STDERR, 'dengan_enkripsi: json_valid=' . var_export(json_decode($raw2) !== null, true)
. ' awal_payload=' . substr($raw2, 0, 8) . " (tanda tangan payload terenkripsi)\n");
// Bagian 3: data terenkripsi tetap terbaca di request berikutnya
$this->mulaiRequestBaru($row2->id);
$this->get('/sesi/baca')->assertSee('nama=Budi');
fwrite(STDERR, "roundtrip: request_baru=nama=Budi (Laravel mendekripsi otomatis)\n");Output yang Dihasilkan:
tanpa_enkripsi: json_valid=true nama='Budi'
dengan_enkripsi: json_valid=false awal_payload=eyJpdiI6 (tanda tangan payload terenkripsi)
roundtrip: request_baru=nama=Budi (Laravel mendekripsi otomatis)Baris pertama memperlihatkan payload default yang masih berupa JSON terbaca. Baris kedua membuktikan aktivasi SESSION_ENCRYPT mengubah payload menjadi teks acak yang tidak lagi bisa di-decode sebagai JSON — awal eyJpdiI6 adalah base64 dari {"iv":", ciri khas output enkripsi Laravel. Baris ketiga adalah bagian pentingnya: aplikasi tetap membaca nama=Budi tanpa perubahan kode sedikit pun, karena dekripsi terjadi otomatis di dalam session store.
Memilih Driver per Kebutuhan #
Rangkuman praktisnya begini. Aplikasi kecil di shared hosting tanpa Redis: database atau file sudah memadai. Aplikasi yang serius dengan autentikasi dan trafik besar: redis sejak awal, karena session lookup terjadi di setiap request. Tim yang rajin menulis feature test: tidak perlu melakukan apa pun — phpunit.xml bawaan Laravel sudah menyetel SESSION_DRIVER=array untuk lingkungan testing, sehingga test berjalan cepat tanpa menyentuh storage sungguhan.
Berapa pun pilihannya, cara membaca dan menulis data session tidak pernah berbeda. API lengkapnya — put(), get(), push(), sampai pull() — adalah materi chapter Session Data
, dan daftar resminya ada di dokumentasi Session
.