Tổng quat
Express.js sử dụng cookie để lưu trữ id phiên (với chữ ký mã hóa) trong trình duyệt của người dùng và sau đó, trong các yêu cầu tiếp theo, sử dụng giá trị của cookie đó để truy xuất thông tin phiên được lưu trữ trên máy chủ. Bộ nhớ phía máy chủ này có thể là bộ nhớ lưu trữ (mặc định) hoặc bất kỳ bộ lưu trữ nào khác triển khai các phương thức cần thiết (như connect-redis ).
Chi tiết
Express.js / Connect tạo một chuỗi Base64 24 ký tự bằng cách sử dụng utils.uid(24)
và lưu trữ nó trong đó req.sessionID
. Chuỗi này sau đó được sử dụng làm giá trị trong cookie.
Phía khách hàng
Cookie đã ký luôn được sử dụng cho các phiên, vì vậy giá trị cookie sẽ có định dạng sau.
[sid].[signature]
Trong đó [sid] là sessionID và [chữ ký] được tạo bằng cách ký [sid] sử dụng khóa bí mật được cung cấp khi khởi tạo phần mềm trung gian phiên. Bước ký được thực hiện để tránh giả mạo. Sẽ không khả thi về mặt tính toán để sửa đổi [sid] và sau đó tạo lại [chữ ký] mà không cần biết về khóa bí mật được sử dụng. Cookie phiên vẫn dễ bị đánh cắp và sử dụng lại, nếu không yêu cầu sửa đổi [sid].
Tên của cookie này là
connect.sid
Phía máy chủ
Nếu một trình xử lý xảy ra sau cookieParser
và session
phần mềm trung gian, nó sẽ có quyền truy cập vào biến req.cookies
. Điều này chứa một đối tượng JSON có khóa là khóa cookie và giá trị là giá trị cookie. Điều này sẽ chứa một khóa được đặt tên connect.sid
và giá trị của nó sẽ là mã định danh phiên đã ký.
Dưới đây là một ví dụ về cách thiết lập một tuyến sẽ kiểm tra sự tồn tại của cookie phiên trên mọi yêu cầu và in giá trị của nó vào bảng điều khiển.
app.get("/*", function(req, res, next) {
if(typeof req.cookies['connect.sid'] !== 'undefined') {
console.log(req.cookies['connect.sid']);
}
next(); // Call the next middleware
});
Bạn cũng cần đảm bảo rằng bộ định tuyến ( app.use(app.router)
) được bao gồm sau cookieParser
và session
trong phần cấu hình của bạn.
Sau đây là ví dụ về dữ liệu được lưu trữ nội bộ bởi Express.js / Connect.
{
"lastAccess": 1343846924959,
"cookie": {
"originalMaxAge": 172800000,
"expires": "2012-08-03T18:48:45.144Z",
"httpOnly": true,
"path": "/"
},
"user": {
"name":"waylon",
"status":"pro"
}
}
Các user
lĩnh vực là tùy chỉnh. Mọi thứ khác là một phần của quản lý phiên.
Ví dụ là từ Express 2.5.