Belajar CodeIgniter - Sessions, Flash Data & Cookies
Episode 9 of 27

Belajar CodeIgniter - Sessions, Flash Data & Cookies

Menyimpan state antar request dengan session, memakai flashdata untuk pesan sekali tampil, mengelola cookie, serta membangun alur login dan logout sederhana sebagai fondasi autentikasi penuh di episode 12.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

HTTP itu stateless: setiap request berdiri sendiri, dan server tidak mengingat siapa yang mengirim request sebelumnya. Tanpa mekanisme tambahan, aplikasi tidak bisa tahu "user ini sudah login" atau "user ini mengisi form yang gagal validasi".

Di episode 9 ini kita memecahkan masalah itu dengan session, flash data, dan cookies. Konsep ini adalah fondasi untuk autentikasi (episode 12) dan sekaligus menjelaskan kenapa with('errors', ...) di episode 8 bisa "selamat" lewat redirect — karena ia disimpan di session.

Konsep Session

Session adalah data yang disimpan di server, diidentifikasi lewat cookie di browser. Alurnya:

100%

CodeIgniter mengelola semuanya lewat helper session(). Konfigurasi ada di app/Config/Session.php:

PropertyArti
$driverTempat penyimpanan: FileHandler, RedisHandler, DatabaseHandler
$savePathPath/target penyimpanan (default writable/session)
$expirationLama session hidup (detik), default 7200
$cookieNameNama cookie session
$matchIPValidasi alamat IP (false default)

Operasi Session Dasar

Operasi session
$session = session();
 
// SET - simpan nilai
$session->set('user_id', 1);
$session->set(['role' => 'admin', 'last_login' => time()]);
 
// GET - ambil nilai
$user_id = $session->get('user_id');
$role    = $session->get('role');
 
// HAS - cek keberadaan
if ($session->has('user_id')) {
    // user sudah login
}
 
// REMOVE & DESTROY
$session->remove('user_id');
$session->destroy();   // bersihkan seluruh session + cookie

Selalu gunakan session() helper — ia mengembalikan instance singleton yang sama untuk seluruh request, jadi set di satu tempat terbaca di tempat lain.

Flash Data: Pesan Sekali Tampil

Flashdata adalah data session yang otomatis terhapus setelah dibaca sekali — sempurna untuk pesan sukses/error setelah redirect.

Mengatur flashdata
// Simpan (misal di controller setelah aksi sukses)
session()->setFlashdata('success', 'Post berhasil disimpan');
 
// Baca (di view tujuan)
<?php if (session('success')): ?>
    <div class="alert alert-success"><?= esc(session('success')) ?></div>
<?php endif; ?>

session('success') di view adalah shortcut untuk session()->getFlashdata('success'). Flashdata hanya tersedia untuk satu request berikutnya — setelah dibaca, ia hilang. Itulah alasan pesan tidak muncul berulang saat halaman di-refresh.

Tip

Flashdata sangat cocok untuk pola PRG (Post-Redirect-Get): controller mengolah POST, redirect, lalu view menampilkan pesan sekali. Pola ini juga mencegah form terkirim ulang saat user menekan refresh.

Cookies

Cookie disimpan di browser, bukan di server. CodeIgniter menyediakan helper cookie:

Operasi cookie (perlu helper 'cookie')
helper('cookie');
 
// SET - simpan cookie
set_cookie('theme', 'dark', 3600);          // nama, nilai, durasi detik
set_cookie('locale', 'id', [
    'expire'  => 86400 * 30,
    'httponly' => false,                    // dibaca JavaScript
]);
 
// GET - baca cookie
$theme = get_cookie('theme');
 
// DELETE - hapus cookie
delete_cookie('theme');

Bedanya dengan session: cookie terlihat oleh client (bisa dibaca JavaScript) dan mengalir tiap request. Karena itu jangan pernah menyimpan data sensitif (user id, role) di cookie tanpa enkripsi. Aturan praktis: cookie untuk preferensi, session untuk state autentikasi.

Warning

Jangan menyimpan role atau user_id di cookie dan mempercayainya di server — cookie bisa dipalsukan client. Jika butuh, simpan nilai terenkripsi atau (lebih baik) simpan di session server. Kita koreksi hal ini di episode 12 dan 20.

Praktik: Login/Logout Sederhana

Gabungkan semuanya dalam alur login minimal. Model user (dari skema episode 7) dan controller auth:

app/Controllers/Auth.php
<?php
 
namespace App\Controllers;
 
use App\Models\UserModel;
 
class Auth extends BaseController
{
    public function login(): string | \CodeIgniter\HTTP\RedirectResponse
    {
        if (session()->get('logged_in')) {
            return redirect()->to('/dashboard');
        }
 
        return view('auth/login');
    }
 
    public function attempt(): \CodeIgniter\HTTP\RedirectResponse
    {
        $rules = [
            'email'    => 'required|valid_email',
            'password' => 'required',
        ];
 
        if (! $this->validate($rules)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }
 
        $email    = $this->request->getPost('email');
        $password = $this->request->getPost('password');
 
        $user = (new UserModel())->where('email', $email)->first();
 
        if ($user === null || ! password_verify($password, $user['password'])) {
            return redirect()->back()->with('error', 'Email atau password salah');
        }
 
        session()->set([
            'logged_in' => true,
            'user_id'   => $user['id'],
            'name'      => $user['name'],
        ]);
 
        return redirect()->to('/dashboard')->with('success', 'Selamat datang!');
    }
 
    public function logout(): \CodeIgniter\HTTP\RedirectResponse
    {
        session()->destroy();
        return redirect()->to('/login');
    }
}

Alurnya: attempt() memvalidasi input, mencari user di database, memverifikasi password dengan password_verify(), lalu menyimpan identitas di session. logout() menghancurkan session. Jangan lupa route-nya:

Route auth
$routes->get('login', 'Auth::login');
$routes->post('login', 'Auth::attempt');
$routes->get('logout', 'Auth::logout');

Warning

Alur ini masih minim perlindungan — belum ada proteksi brute force, belum ada session regenerate, dan dashboard bisa diakses tanpa login. Semua itu akan kita perkuat di episode 12 dengan autentikasi penuh dan filter, serta episode 19 dengan rate limiting.

Ringkasan Session, Flash Data & Cookies

  • Session disimpan di server; helper session() untuk set/get/has/remove/destroy.
  • Konfigurasi di app/Config/Session.php: driver, save path, expiration.
  • Flashdata (setFlashdata) untuk pesan sekali tampil — pola PRG.
  • Cookie untuk preferensi client; jangan simpan data autentikasi di dalamnya.
  • Login/logout sederhana = verifikasi password + session set/destroy.

Penutup

Inti yang harus dibawa pulang:

  • HTTP stateless; session memberi ilusi "ingatan" antar request.
  • Gunakan flashdata untuk pesan sukses/error setelah redirect.
  • Cookie untuk preferensi; session untuk state autentikasi.
  • Selalu password_verify(), jangan pernah bandingkan password plaintext.

Di episode 10 selanjutnya kita akan membahas helpers & libraries — helper bawaan seperti url, form, html, dan text; membuat custom helper; serta custom library dengan registrasi service dan autoload. Ini senjata untuk menulis kode yang DRY (Don't Repeat Yourself)!

Belajar CodeIgniter - Sessions, Flash Data & Cookies | Belajar CodeIgniter