簡體   English   中英

ExpressJS:req.session如何工作?

[英]ExpressJS: how does req.session work?

我正在編寫一個具有用戶登錄支持的ExpressJS后端。 從多個例子中我看到了req.session對象的使用。 看來這個對象用於跨服務器和客戶端存儲和檢索信息,因此服務器可以設置“已記錄”標志,然后檢查此標志以查看用戶是否已登錄。

我的問題是,這究竟是如何工作的? 服務器如何在客戶端上存儲信息並從每個請求中檢索它,是通過cookie嗎? 客戶端是否可以在客戶端手動操作此對象的內容來保護安全性? 如果是,檢查用戶登錄的更安全的方法是什么?

我從ExpressJS Google小組中找到了一些東西 ,因此ExpressJS中的會話和cookie有點不同。 基本上:

Res.cookie為響應添加了一個cookie; req.session是服務器端鍵/值存儲。 默認情況下,會話數據存在於服務器內存中,但您可以配置備用存儲。

您可以在會話中存儲所需的任何內容。 客戶端唯一看到的是識別會話的cookie。

(貸方為Laurie Harper

因此,似乎ExpressJS已經在做@Vahid所提到的,將值存儲在服務器上並將密鑰保存為客戶端的cookie。 根據我的理解,req.session使用自己的cookie(只包含一個鍵),獨立於req.cookie的自定義cookie。

我不知道你的確切實施,所以我不會特意評論你的情況。 但通常您可以根據每個請求驗證從瀏覽器發送到服務器的內容,可以安裝firefox擴展程序,例如“ Live HTTP Header”或“ Tamper Data”,甚至可以安裝Wireshark(如果不是https)或firebug,firecookie等。

然后檢查通過Cookie發送的內容,我確定ExpressJS成功驗證用戶后會生成會話ID,將其存儲在數據庫中並在瀏覽器cookie中存儲相同的值。 在每個請求(甚至圖像)上,您的瀏覽器都會發送cookie,服務器會使用db驗證會話ID並檢測您的會話。

我已經看到一些舊的不安全代碼,它們為用戶的會話設置了一個像loggedin = 1的值,如果是你的情況,你必須知道它真的很容易繞過。 您必須為每個客戶端生成,保存和設置會話ID。

實際上,客戶端未傳遞req.session中的會話對象。 用您的語法,您可能使用過app.use(session{options})

這是一個中間件。 現在,從快速服務器傳遞的每個請求都必須通過此中間件傳遞。 該中間件獲取cookie(只是存儲在服務器上的sessionId的編碼版本)並對其進行解碼以獲取sessionId。 對應於該sessionId的會話從服務器獲取並作為req.session附加到req對象。 它讓我們感覺我們正在從客戶端獲取會話,但實際上是通過從客戶端獲取cookie將會話對象附加到req對象的中間件工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM