Aplikasi Django kita memiliki persyaratan manajemen sesi berikut.
- Sesi berakhir saat pengguna menutup browser.
- Sesi berakhir setelah periode tidak aktif.
- Mendeteksi saat sesi berakhir karena tidak aktif dan menampilkan pesan yang sesuai kepada pengguna.
- Peringatkan pengguna tentang sesi yang akan datang berakhir beberapa menit sebelum akhir periode tidak aktif. Bersamaan dengan peringatan tersebut, berikan pengguna opsi untuk memperpanjang sesi mereka.
- Jika pengguna sedang mengerjakan aktivitas bisnis yang panjang dalam aplikasi yang tidak melibatkan permintaan yang dikirim ke server, sesi tidak boleh timeout.
Setelah membaca dokumentasi, kode Django dan beberapa kiriman blog yang berhubungan dengan ini, saya mendapatkan pendekatan implementasi berikut.
Persyaratan 1
Persyaratan ini mudah diterapkan dengan menyetel SESSION_EXPIRE_AT_BROWSER_CLOSE ke True.
Persyaratan 2
Saya telah melihat beberapa rekomendasi untuk menggunakan SESSION_COOKIE_AGE untuk mengatur periode berakhirnya sesi. Tetapi metode ini memiliki masalah berikut.
Sesi selalu berakhir di akhir SESSION_COOKIE_AGE meskipun pengguna aktif menggunakan aplikasi. (Ini dapat dicegah dengan menyetel sesi kedaluwarsa ke SESSION_COOKIE_AGE pada setiap permintaan menggunakan middleware khusus atau dengan menyimpan sesi pada setiap permintaan dengan menyetel SESSION_SAVE_EVERY_REQUEST ke true. Tetapi masalah selanjutnya tidak dapat dihindari karena penggunaan SESSION_COOKIE_AGE.)
Karena cara kerja cookie, SESSION_EXPIRE_AT_BROWSER_CLOSE dan SESSION_COOKIE_AGE sama-sama eksklusif, yaitu cookie kedaluwarsa pada penutupan browser atau pada waktu kedaluwarsa yang ditentukan. Jika SESSION_COOKIE_AGE digunakan dan pengguna menutup browser sebelum cookie kedaluwarsa, cookie dipertahankan dan membuka kembali browser akan mengizinkan pengguna (atau siapa pun) ke dalam sistem tanpa diautentikasi ulang.
Django hanya mengandalkan kuki yang ada untuk menentukan apakah sesi aktif. Itu tidak memeriksa tanggal kedaluwarsa sesi yang disimpan dengan sesi.
Metode berikut dapat digunakan untuk mengimplementasikan persyaratan ini dan untuk mengatasi masalah yang disebutkan di atas.
- Jangan setel SESSION_COOKIE_AGE.
- Setel tanggal kedaluwarsa sesi menjadi 'waktu saat ini + periode tidak aktif' pada setiap permintaan.
- Timpa process_request di SessionMiddleware dan periksa masa berakhir sesi. Buang sesi jika telah kedaluwarsa.
Persyaratan 3
Saat kami mendeteksi bahwa sesi telah kedaluwarsa (di SessionMiddleware kustom di atas), setel atribut pada permintaan untuk menunjukkan sesi berakhir. Atribut ini dapat digunakan untuk menampilkan pesan yang sesuai kepada pengguna.
Persyaratan 4
Gunakan JavaScript untuk mendeteksi ketidakaktifan pengguna, memberikan peringatan dan juga opsi untuk memperpanjang sesi. Jika pengguna ingin memperpanjang, kirim pulsa tetap ke server untuk memperpanjang sesi.
Persyaratan 5
Gunakan JavaScript untuk mendeteksi aktivitas pengguna (selama operasi bisnis yang panjang) dan mengirim pulsa tetap hidup ke server untuk mencegah sesi kedaluwarsa.
Pendekatan implementasi di atas tampak sangat rumit dan saya bertanya-tanya apakah mungkin ada metode yang lebih sederhana (terutama untuk Persyaratan 2).
Setiap wawasan akan sangat dihargai.