express4.x 之session使用

也可參照http://blog.csdn.net/code41_codemonkey/article/details/37974651
在express中默認req對象是沒有req.session這個屬性的(res.session也沒有)。經過中間件的處理,為其加上,才能訪問到。

var express = require('express');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var app = express();
var options = { 
  host: "127.0.0.1", 
  port: "6379", 
  ttl: 60 * 60 * 24 * 30, //Session的有效期為30天
};
// 此時req對象還沒有session這個屬性
app.use(session({ 
  store: new RedisStore(options), 
  secret: 'express is powerful'
}));
// 經過中間件處理后,可以通過req.session訪問session object。比如如果你在session中保存了session.userId,就可以根據userId查找用戶的信息了。

req在經過session中間件的時候就會自動完成session的有效性驗證、延期/重新頒發、以及對session中數據的獲取了。

SessionId就如同請求者的身份證,一旦被攻擊者惡意獲得,攻擊者便可以偽裝成請求者對服務器發起請求,也就是我們經常聽到的會話劫持(Session/Cookie Hijack)關于會話劫持的原理推薦大家去看這篇文章
基于上述實現方法的Session管理,我認為基本上可以排除
暴力破解SessionId
惡意植入固定SessionId

req.session.cookie 是sessionCookie

兩種可能,因為uid的庫基本上可以保證SessionId的隨機性;而傳遞SessionId則依賴HTTP請求頭中的Cookie信息而非URL,同時在用戶登錄立刻更換SessionId。
唯一的可能性來源于Session的監聽,而對于這種攻擊有效的兩種防止辦法是:
Https很多網站僅僅在Login的階段使用Https防止用戶的用戶名、密碼信息被監聽者獲取,但是隨后的SessionId同樣有可能被監聽者獲取而偽造登錄者的身份信息。因此更加推薦的方式是所有的信息傳遞全部使用Https實現,這樣即使監聽著截獲了信息也無法破解其中的內容。關于如何使用NodeJS建立一個HTTPS的server可以參考《HTTPS的原理和NodeJS的實現》 這篇文章
httpOnlyExpress在options中提供了httpOnly
的屬性,此屬性默認值為true
,這個屬性保證了Cookie的信息不能夠通過JavaScript腳本獲取。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容