Các phiên hoạt động như thế nào trong Express.js với Node.js?


96

Sử dụng Express.js , các phiên làm việc rất đơn giản. Tôi tò mò về cách chúng thực sự hoạt động.

Nó có lưu trữ một số cookie trên máy khách không? Nếu vậy, tôi có thể tìm thấy cookie đó ở đâu? Nếu được yêu cầu, tôi phải giải mã nó như thế nào?

Về cơ bản tôi muốn có thể xem liệu người dùng có đăng nhập hay không, ngay cả khi người dùng đó không thực sự ở trên trang web vào thời điểm đó (như cách facebook biết bạn đã đăng nhập khi bạn ở các trang khác). Nhưng tôi cho rằng để hiểu rằng trước tiên tôi nên hiểu cách các phiên hoạt động.

Câu trả lời:


43

Tôi chưa bao giờ sử dụng Express.js, mặc dù theo tài liệu của họ về chủ đề này, nó có vẻ như:

  • Cookie được lưu trữ trên máy khách, với một khóa (máy chủ sẽ sử dụng để truy xuất dữ liệu phiên) và một hàm băm (máy chủ sẽ sử dụng để đảm bảo dữ liệu cookie không bị giả mạo, vì vậy nếu bạn thử và thay đổi một giá trị cookie sẽ không hợp lệ)

  • Dữ liệu phiên, trái ngược với một số khuôn khổ (ví dụ: Play Framework !) Được lưu giữ trên máy chủ, vì vậy cookie giống như một trình giữ chỗ cho phiên hơn là một lưu trữ dữ liệu phiên thực tế.

  • Từ đây , có vẻ như dữ liệu phiên này trên máy chủ theo mặc định được giữ trong bộ nhớ, mặc dù điều đó có thể được thay đổi thành bất kỳ hình thức lưu trữ nào triển khai API thích hợp.

Vì vậy, nếu bạn muốn kiểm tra mọi thứ mà không có reqđối tượng yêu cầu cụ thể , như bạn đã nói, bạn chỉ cần truy cập vào cùng một bộ nhớ. Ở cuối trang tài liệu đầu tiên, nó nêu chi tiết các phương thức bắt buộc mà bộ nhớ cần triển khai, vì vậy nếu bạn đã quen thuộc với API lưu trữ của mình, có thể bạn có thể thực thi một .getAll()cái gì đó tương tự nếu tồn tại và lặp qua dữ liệu phiên và đọc bất kỳ thứ gì giá trị bạn muốn.


166

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 cookieParsersessionphầ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.sidvà 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 cookieParsersessiontrong 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 userlĩ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.


1
khi in giá trị cookie với console.log, nó sẽ cung cấp cookie được mã hóa (đã ký). làm thế nào để tôi có được thông tin thực sự?
vsync

Ý bạn là gì - "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]." vì SID được tạo bởi express, chúng ta không bao giờ có thể thay đổi nó phải không?
Hrushikesh

2
@WebHrushi Tôi đang nghĩ đến một cuộc tấn công Man-in-the-Middle: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

Ai đó có thể giúp tôi với câu hỏi này không: stackoverflow.com/questions/21982791/…
roundrobin

làm cách nào để tạo mã thông báo cho bất kỳ session_id cụ thể nào ??
aman verma

9

Tôi tò mò về cách chúng thực sự hoạt động.

Hãy thử xem câu trả lời này và nội dung wiki .

Nó có lưu trữ một số cookie trên máy khách không?

Có, nó thường là một cookie với ID phiên được chỉ định, cần được ký bằng bí mật để tránh giả mạo.

Nếu vậy, tôi có thể tìm thấy cookie đó ở đâu? Nếu được yêu cầu, tôi phải giải mã nó như thế nào?

Bạn không nên gây rối với cookie phiên ở phía máy khách. Nếu bạn muốn làm việc với các phiên ở phía máy chủ, bạn nên xem express.js liên quan và kết nối tài liệu.


Thưa ông, chúng ta có thể nói chuyện Tôi có một số nghi ngờ về tất cả những điều này.
Suraj Jain

0

Ngoài các câu trả lời đã xuất sắc, đây là 2 sơ đồ tôi đã tạo để giải thích các phiên Express, liên kết của chúng với cookie và lưu trữ:

  • bánh quy sô-cô-la: sô cô la
  • bánh quy dâu tây: dâu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.