Session Management
Session management adalah mekanisme yang memungkinkan server web mempertahankan status dan konteks pengguna di antara beberapa permintaan HTTP yang tidak memiliki status (stateless). Setelah pengguna terautentikasi, server perlu melacak sesi tersebut selama pengguna masih aktif.
Session ID Generation
Session ID adalah token unik yang mengidentifikasi sesi pengguna. ID ini harus memenuhi persyaratan keamanan yang ketat:
- Unpredictability - Tidak dapat ditebak oleh penyerang. Harus dihasilkan menggunakan cryptographically secure pseudorandom number generator (CSPRNG).
- Uniqueness - Probabilitas duplikasi harus sangat kecil.
- Length - Panjang minimal 128 bit (16 byte) untuk mencegah serangan brute force.
- Entropy - Mengandung entropi tinggi, bukan nilai yang mudah ditebak seperti timestamp atau username.
Bahaya umum yang harus dihindari: menggunakan session ID yang dapat diprediksi seperti nomor berurutan, hash dari data pengguna, atau nilai berbasis waktu.
Session Storage
Server dapat menyimpan data sesi di berbagai lokasi:
- In-Memory - Data sesi disimpan di memori server. Cepat tetapi tidak persistent; sesi hilang saat server mati atau restart. Cocok untuk aplikasi single-server skala kecil.
- Redis - Penyimpanan in-memory yang didistribusikan. Cepat, persistent (dengan konfigurasi), dan mendukung clustering. Sangat populer untuk aplikasi web modern yang berjalan di banyak server.
- Database (Relational/NoSQL) - Data sesi disimpan di database seperti PostgreSQL atau MongoDB. Lebih lambat dari Redis, tetapi menawarkan persistensi penuh dan kemampuan query. Cocok untuk sesi yang perlu diakses lintas aplikasi atau dianalisis.
Session Lifecycle
Siklus hidup sesi terdiri dari beberapa tahap:
- Create - Sesi dibuat saat pengguna pertama kali mengunjungi situs atau setelah berhasil login. Server menghasilkan session ID baru dan menyimpan data sesi awal.
- Use - Pada setiap permintaan, klien mengirim session ID (biasanya melalui cookie), dan server memuat data sesi yang sesuai.
- Expire - Sesi memiliki batas waktu (misal 30 menit tidak aktif). Setelah mencapai batas, sesi dianggap kedaluwarsa dan data dapat dihapus.
- Destroy - Sesi secara eksplisit dihapus saat pengguna logout atau sesi dihentikan oleh administrator.
Idle timeout (waktu habis karena tidak aktif) dan absolute timeout (waktu habis total sejak sesi dibuat, misal 8 jam) harus dikonfigurasi dengan hati-hati. Terlalu pendek mengganggu pengalaman pengguna; terlalu panjang meningkatkan risiko penyalahgunaan.
Session Fixation
Session fixation adalah serangan di mana penyerang memaksa korban menggunakan session ID yang sudah diketahui penyerang. Setelah korban login dengan session ID tersebut, penyerang dapat mengakses akun korban.
Pencegahan:
- Buat session ID baru setelah autentikasi berhasil (session regeneration).
- Tolak session ID yang dikirim melalui URL atau parameter formulir.
- Gunakan session ID hanya dari cookie yang aman.
Session Hijacking
Session hijacking terjadi ketika penyerang mencuri session ID pengguna yang sah dan menggunakannya untuk menyamar. Metode pencurian meliputi:
- Packet Sniffing - Mencegat lalu lintas jaringan untuk membaca session ID (dicegah dengan HTTPS).
- XSS - Mencuri session cookie
melalui JavaScript (dicegah dengan
HttpOnly). - Man-in-the-Middle - Memposisikan diri di antara klien dan server (dicegah dengan sertifikat TLS yang valid).
Pencegahan tambahan: Gunakan fingerprinting (memeriksa IP address atau User-Agent), re-authentication untuk aksi sensitif, dan multi-factor authentication.
Secure Session Cookies
Session cookie yang menyimpan session ID harus dikonfigurasi dengan atribut keamanan maksimal:
HttpOnly- Tidak dapat diakses JavaScript.Secure- Hanya dikirim melalui HTTPS.SameSite=LaxatauStrict- Mencegah CSRF.Path=/- Tersedia di seluruh domain.Expirestidak ditetapkan (session cookie) - Dihapus saat browser ditutup.
Token-Based Sessions (JWT)
JSON Web Token (JWT) menawarkan pendekatan berbeda untuk manajemen sesi. Token berisi claim (data sesi) yang ditandatangani secara kriptografis oleh server. Keuntungan JWT:
- Stateless - Server tidak perlu menyimpan data sesi; semua informasi ada di token.
- Portable - Mudah digunakan lintas domain, aplikasi mobile, dan layanan mikro.
- Self-contained - Berisi informasi pengguna, peran, dan masa berlaku.
Kerugian JWT: token tidak dapat dengan mudah dicabut (direvoke) sebelum kedaluwarsa, dan ukurannya lebih besar dari session ID biasa.
Stateless vs Stateful
Stateful Sessions - Server menyimpan data sesi (di memori, Redis, atau database). Klien hanya menyimpan session ID. Lebih aman karena data tidak pernah terpapar ke klien, tetapi memerlukan infrastruktur penyimpanan bersama di lingkungan multi-server.
Stateless Sessions - Semua data sesi disimpan di klien (misal dalam JWT). Server hanya memverifikasi tanda tangan. Tidak memerlukan penyimpanan server bersama, memudahkan scaling, tetapi data dapat terpapar (walaupun ditandatangani) dan token tidak dapat langsung di-revoke.
Pilihan antara keduanya tergantung pada kebutuhan keamanan, skalabilitas, dan kompleksitas aplikasi.