Memilih antara session PHP dan token JWT untuk autentikasi menentukan bagaimana aplikasi menyimpan status login pengguna. Session menyimpan data di server dan mengirim ID lewat cookie, sedangkan JWT membawa data di dalam token yang dikirim setiap request. Pemilihan keduanya bergantung pada arsitektur aplikasi dan kebutuhan keamanan.

Bagaimana Session PHP Bekerja

Saat pengguna login, PHP memanggil session_start() lalu menyimpan data di $_SESSION. Server menulis data ke penyimpanan sementara (file, Redis, atau database) dan mengirim cookie PHPSESSID ke browser. Setiap request berikutnya membawa cookie tersebut, dan PHP mencocokkannya dengan data di server.

Karena data tersimpan di server, pengguna tidak bisa melihat atau mengubah isi session secara langsung. Cookie hanya berisi ID acak. Jika penyimpanan session tidak dikonfigurasi dengan benar, file-file session menumpuk di direktori /tmp dan bisa memperlambat server pada aplikasi dengan trafik tinggi.

Keamanan Session

Cookie session rentan terhadap pencurian lewat XSS jika tidak diset dengan atribut HttpOnly dan Secure. Pengguna juga perlu dilindungi dari serangan CSRF karena browser otomatis mengirim cookie. PHP menyediakan session_regenerate_id() untuk mencegah session fixation, tapi fungsi ini harus dipanggil manual setiap kali status login berubah.

Menghubungkan PHP ke MySQL dengan PDO dan MySQLi memudahkan penyimpanan session di database, sehingga aplikasi bisa berjalan di beberapa server tanpa kehilangan data login. Pendekatan ini juga membuat pembersihan session kedaluwarsa lebih terkontrol.

Bagaimana Token JWT Bekerja

JWT terdiri dari tiga bagian yang dipisah titik: header, payload, dan signature. Server membuat token setelah login berhasil, menandatanganinya dengan kunci rahasia, lalu mengirimkannya ke klien. Klien menyimpan token dan mengirimkannya di header Authorization: Bearer <token> pada setiap request.

Server memverifikasi signature token tanpa perlu menyimpan data di penyimpanan session. Ini membuat JWT populer untuk API stateless dan aplikasi yang melayani klien mobile. Namun, payload JWT hanya di-encode Base64, bukan dienkripsi. Siapa pun yang memegang token bisa membaca isinya.

Keamanan Token JWT

Karena token tidak bisa dicabut secara instan, logout pada JWT biasanya hanya menghapus token di sisi klien. Jika token dicuri, penyerang tetap bisa menggunakannya sampai masa berlaku habis. Solusi umum adalah membuat token berumur pendek dan menyediakan refresh token, tapi ini menambah kompleksitas.

Menyimpan JWT di localStorage membuka celah XSS. Menyimpannya di cookie HttpOnly sama rentannya terhadap CSRF seperti session. Tidak ada pilihan yang sepenuhnya bebas risiko, hanya perbedaan jenis serangan yang perlu diantisipasi.

Perbandingan Session PHP vs Token JWT

Aspek Session PHP Token JWT
Penyimpanan data Server Klien
Skalabilitas horizontal Butuh penyimpanan bersama (Redis/DB) Stateless, langsung jalan di banyak server
Pencabutan akses Mudah, hapus data session Sulit, perlu blocklist atau token pendek
Ukuran data per request Kecil (hanya ID) Besar (payload lengkap)

Kapan Memilih Session PHP

Aplikasi web tradisional yang dirender di server lebih cocok memakai session. Data login tidak perlu dikirim bolak-balik, dan server bisa langsung mencabut akses saat pengguna logout. Jika aplikasi berjalan di satu server atau punya Redis untuk penyimpanan bersama, session PHP lebih sederhana untuk diimplementasikan.

Debug session juga lebih mudah karena semua data bisa diperiksa langsung dari sisi server. Perbandingan cara debug PHP: var dump, Xdebug, dan logger menunjukkan bahwa data session bisa dilihat tanpa alat tambahan, berbeda dengan JWT yang perlu di-decode dulu.

Kapan Memilih Token JWT

API yang melayani banyak klien (web, mobile, layanan pihak ketiga) mendapat manfaat dari sifat stateless JWT. Server tidak perlu berbagi penyimpanan session, sehingga penambahan node baru langsung meningkatkan kapasitas. Microservice juga cocok memakai JWT karena setiap layanan bisa memverifikasi token secara mandiri.

Jika arsitektur Anda memisahkan backend dan frontend, JWT menghilangkan kebutuhan CORS dengan kredensial dan masalah cookie lintas domain. Pertimbangkan juga cara memilih power bank untuk HP: sama seperti memilih penyimpanan daya, sesuaikan kapasitas dengan kebutuhan, bukan sekadar mengikuti tren.

Praktik Implementasi Session yang Aman

Konfigurasi session yang buruk sering menjadi titik lemah aplikasi PHP. Berikut pengaturan yang sebaiknya diterapkan:

  • Set session.cookie_httponly = 1 dan session.cookie_secure = 1 di php.ini.
  • Gunakan session_regenerate_id(true) setelah login berhasil.
  • Batasi masa berlaku session dengan session.gc_maxlifetime.
  • Simpan session di Redis atau database jika aplikasi berjalan di lebih dari satu server.
  • Tambahkan token CSRF pada setiap form yang mengubah data.

Menyimpan konfigurasi database di PHP secara terpisah dari kode juga membantu menjaga kredensial tetap aman dan memudahkan pergantian lingkungan. Simpan pengaturan session di file konfigurasi yang sama agar konsisten.

Praktik Implementasi JWT yang Aman

JWT hanya sekuat cara Anda mengelola kuncinya. Beberapa hal yang perlu diperhatikan:

  • Gunakan algoritma HS256 dengan kunci acak panjang, atau RS256 jika perlu verifikasi terdistribusi.
  • Jangan pernah menyimpan data sensitif seperti password di payload.
  • Set masa berlaku token sesingkat mungkin, misalnya 15 menit, dan gunakan refresh token terpisah.
  • Validasi klaim iss, aud, dan exp di sisi server.
  • Simpan token di cookie HttpOnly atau Secure jika aplikasi web, bukan di localStorage.

Jika token disimpan di cookie, tambahkan perlindungan CSRF karena browser akan mengirim cookie secara otomatis. Alternatifnya, gunakan header Authorization untuk API yang diakses lewat JavaScript.

Ringkasan

Session PHP menyimpan data di server dan lebih mudah dicabut, cocok untuk aplikasi web tradisional. JWT menyimpan data di klien dan bersifat stateless, cocok untuk API dan arsitektur terdistribusi. Keduanya punya risiko keamanan yang berbeda, dan pilihan terbaik bergantung pada skala aplikasi serta kebutuhan pencabutan akses. Mulailah dari session jika aplikasi Anda masih sederhana, lalu pertimbangkan JWT saat jumlah klien dan server bertambah.

Pertanyaan yang Sering Diajukan

Apakah session PHP bisa dipakai untuk API?

Bisa, tapi kurang praktis untuk klien non-browser. API yang diakses aplikasi mobile atau layanan lain lebih cocok memakai token karena tidak bergantung pada cookie.

Apakah JWT lebih aman daripada session?

Tidak ada yang lebih aman secara mutlak. Session rentan terhadap CSRF jika tidak dilindungi, sedangkan JWT rentan terhadap pencurian token dan sulit dicabut. Keamanan bergantung pada implementasi, bukan pada pilihan teknologinya.

Bisakah session dan JWT dipakai bersamaan?

Bisa. Beberapa aplikasi memakai session untuk antarmuka web dan JWT untuk API internal. Pastikan keduanya berbagi mekanisme autentikasi yang konsisten agar tidak ada celah di salah satu sisi.