Laman web statik mudah berskala. Anda hanya cache semuanya dan tidak perlu memikirkan tentang menggabungkan kandungan stateful dari pelayan yang berbeza kepada pengguna.
Malangnya, kebanyakan aplikasi web menggunakan kandungan stateful untuk memberikan pengalaman yang diperibadikan. Jika aplikasi anda boleh log masuk, ia perlu mengingati Sesi pengguna. Kaedah pemprosesan klasik ialah pelanggan menetapkan kuki yang mengandungi pengecam Sesi unik rawak, dan data Sesi yang dikenal pasti disimpan ke pelayan.
Melanjutkan perkhidmatan stateful
Apabila mengembangkan perkhidmatan anda, anda pasti mempunyai tiga pilihan:
Tetapi semuanya mempunyai kelemahan:
Namun, jika anda memikirkannya dari sudut lain, anda akan menemui pilihan keempat: simpan data Sesi pada klien
Sesi Pelanggan
Menyimpan Sesi pada pelanggan mempunyai beberapa kelebihan:
Tetapi terdapat masalah serius dengan Sesi sebelah pelanggan: anda tidak boleh menjamin bahawa pengguna tidak akan mengganggu data Sesi.
Sebagai contoh, anda menyimpan ID pengguna dalam kuki. Ia boleh diubah suai dengan mudah oleh pengguna untuk mendapatkan akses kepada akaun orang lain.
Ini nampaknya menafikan kemungkinan Sesi sebelah pelanggan, tetapi ada cara untuk menyelesaikan masalah ini dengan kemas: menyulitkan dan membungkus data Sesi (masih disimpan dalam Kuki). Dengan cara ini, tidak perlu risau tentang pengguna mengubah suai data Sesi, pelayan akan mengesahkan data tersebut.
Dalam aplikasi praktikal, Kunci Pelayan yang disulitkan disimpan dalam kuki. Hanya selepas pengesahan Kunci Pelayan mempunyai hak untuk membaca dan mengubah suai data Sesi. Ini adalah Sesi pelanggan.
Sesi Pelanggan Nod
Node.JS mempunyai pustaka yang boleh melaksanakan Sesi sisi klien: node-client-session Ia boleh menggantikan sesi terbina dalam dan cookieParser middleware bagi Connect (rangka kerja middleware Node).
Penggunaan dalam aplikasi rangka kerja Express:
const clientSessions = require("client-sessions");
app.use(clientSessions({ secret: '0GBlJZ9EKBt2Zbi2flRPvztczCewBxXK' // 设置一个随机长字符串! })
Kemudian, tambahkan sifat pada objek req.session:
app.get('/login', function (req, res){ req.session.username = 'JohnDoe'; });
Baca atribut:
app.get('/', function (req, res){ res.send('Welcome ' + req.session.username); });
Gunakan kaedah tetapan semula untuk menamatkan Sesi:
app.get('/logout', function (req, res) { req.session.reset(); });
Log keluar Sesi Persona dengan segera
(Nota: Persona ialah sistem identiti dalam talian yang dilancarkan oleh Mozzilla)
Tidak seperti Sesi sebelah pelayan, masalah dengan Sesi sebelah klien ialah pelayan tidak boleh memadamkan Sesi.
Dalam seni bina sisi pelayan, anda boleh memadamkan data Sesi. Sesi yang dikenal pasti oleh mana-mana kuki pelanggan mungkin tidak wujud. Walau bagaimanapun, dalam seni bina sisi klien, data Sesi tidak berada di sisi pelayan dan tiada jaminan bahawa data Sesi akan dipadamkan pada setiap pelanggan. Dalam erti kata lain, kami tidak boleh menyegerakkan keadaan klien pengguna (log masuk) dan keadaan pelayan (log keluar).
Untuk mengimbangi kecacatan ini, masa tamat tempoh ditambah pada Sesi pelanggan. Sahkan masa tamat tempoh sebelum mengembangkan data Sesi (disulitkan dan dibungkus). Jika ia tamat tempoh, buang data Sesi dan tukar status pengguna (seperti log keluar).
Mekanisme tamat tempoh berfungsi dengan baik dalam banyak aplikasi (terutama keperluan masa tamat tempoh yang singkat). Contohnya, dalam Persona, apabila pengguna mendapati bahawa kata laluan telah diancam atau rosak, kami perlu menyediakan kaedah untuk pengguna log keluar daripada data sesi dengan segera.
Ini bermakna menyimpan sedikit maklumat keadaan dalam bahagian belakang perkhidmatan. Cara kami mengendalikan log keluar segera adalah dengan menambahkan Token dalam jadual data pengguna dan data Sesi.
Setiap kali API dipanggil, data Token dalam Sesi dibandingkan dengan Token dalam pangkalan data. Jika tidak, kembalikan mesej ralat dan keluar dari pengguna.
Ini akan menambah operasi pangkalan data yang berlebihan untuk menanyakan Token. Nasib baik, kebanyakan panggilan API memerlukan membaca jadual data pengguna, jadi bawa sahaja Token bersamanya.