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:

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:

dotenv
SESSION_DRIVER=database

Berikut perbandingan tujuh driver yang didukung:

DriverLokasi dataKecepatanCatatan penting
filestorage/framework/sessionsCepat (disk lokal)Default era Laravel 10 ke bawah; cukup untuk satu server
databaseTabel sessionsSedangDefault Laravel 11+; butuh migrasi bawaan
redisMemori (in-memory)Sangat cepatButuh server Redis + ekstensi/klien
memcachedMemoriSangat cepatButuh server Memcached
dynamodbLayanan AWSCepatButuh kredensial AWS
cookieBrowser pengguna-Data ikut perjalanan bolak-balik tiap request
arrayMemori 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:

  • file menulis satu file per session ke storage/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.
  • database menulis ke tabel sessions lewat 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.
  • redis menyimpan 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.
  • cookie adalah 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:

dotenv
SESSION_DRIVER=redis

Untuk 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:

dotenv
SESSION_ENCRYPT=true

Ketika 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:

php
// 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:

text
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 .