ภาพรวม
Express.js ใช้คุกกี้เพื่อจัดเก็บรหัสเซสชัน (พร้อมลายเซ็นการเข้ารหัส) ในเบราว์เซอร์ของผู้ใช้จากนั้นในการร้องขอในภายหลังจะใช้ค่าของคุกกี้นั้นเพื่อดึงข้อมูลเซสชันที่เก็บไว้บนเซิร์ฟเวอร์ ที่เก็บข้อมูลฝั่งเซิร์ฟเวอร์นี้อาจเป็นที่เก็บหน่วยความจำ (ค่าเริ่มต้น) หรือที่เก็บอื่น ๆ ซึ่งใช้วิธีการที่จำเป็น (เช่นconnect-redis )
รายละเอียด
Express.js / Connect สร้างสตริงBase64 24 อักขระโดยใช้utils.uid(24)
และเก็บไว้ในรูปแบบreq.sessionID
. จากนั้นสตริงนี้จะถูกใช้เป็นค่าในคุกกี้
ด้านลูกค้า
คุกกี้ที่ลงชื่อจะใช้สำหรับเซสชันเสมอดังนั้นค่าคุกกี้จะมีรูปแบบดังต่อไปนี้
[sid].[signature]
โดยที่ [sid] คือรหัสเซสชันและ [ลายเซ็น] ถูกสร้างขึ้นโดยการเซ็นชื่อ [sid] โดยใช้คีย์ลับที่ให้มาเมื่อเริ่มต้นเซสชันมิดเดิลแวร์ ขั้นตอนการลงนามทำเพื่อป้องกันการปลอมแปลง มันควรจะไม่สามารถคำนวณได้ในการแก้ไข [sid] จากนั้นสร้าง [ลายเซ็น] ขึ้นมาใหม่โดยที่ไม่รู้เรื่องคีย์ลับที่ใช้ คุกกี้เซสชันยังคงเสี่ยงต่อการถูกขโมยและนำกลับมาใช้ใหม่ได้หากไม่จำเป็นต้องแก้ไข [sid]
ชื่อคุกกี้นี้คือ
connect.sid
ฝั่งเซิร์ฟเวอร์
หากตัวจัดการเกิดขึ้นหลังจากcookieParser
และsession
มิดเดิลแวร์ก็จะสามารถเข้าถึงตัวแปรreq.cookies
ได้ สิ่งนี้มีออบเจ็กต์ JSON ซึ่งมีคีย์คือคีย์คุกกี้และค่าต่างๆคือค่าคุกกี้ ซึ่งจะมีคีย์ที่ตั้งชื่อconnect.sid
และค่าของคีย์จะเป็นตัวระบุเซสชันที่เซ็นชื่อ
นี่คือตัวอย่างของวิธีตั้งค่าเส้นทางที่จะตรวจสอบการมีอยู่ของคุกกี้เซสชันในทุกคำขอและพิมพ์ค่าไปยังคอนโซล
app.get("/*", function(req, res, next) {
if(typeof req.cookies['connect.sid'] !== 'undefined') {
console.log(req.cookies['connect.sid']);
}
next();
});
คุณต้องตรวจสอบให้แน่ใจว่าเราเตอร์ ( app.use(app.router)
) รวมอยู่หลังcookieParser
และsession
ในส่วนกำหนดค่าของคุณ
ต่อไปนี้เป็นตัวอย่างของข้อมูลที่จัดเก็บภายในโดย Express.js / Connect
{
"lastAccess": 1343846924959,
"cookie": {
"originalMaxAge": 172800000,
"expires": "2012-08-03T18:48:45.144Z",
"httpOnly": true,
"path": "/"
},
"user": {
"name":"waylon",
"status":"pro"
}
}
user
ฟิลด์เป็นที่กำหนดเอง อย่างอื่นเป็นส่วนหนึ่งของการจัดการเซสชัน
ตัวอย่างมาจาก Express 2.5