express-session使用理解


本篇主要段落翻譯來自https://github.com/expressjs/session

客戶端與服務會使用一個Sessionid的Cookie值來進行客戶端和服務器端會話的匹配,這個Cookie一般是服務器端讀/寫的,並在Http請求響應的Header中的Set-Cookie屬性設置:

 

express-session是針對nodejs express框架提供的一套session擴展

主要參數有 secret,sesave,saveUninitialized,cookie

cookie主要屬性如下,默認值 { path: '/', httpOnly: true, secure: false, maxAge: null }

domain:設置cookie可以設置的域名,如果沒有設置則cookie默認在當前域可以使用

expires:cookie失效時間,可以設置時間,不建議給固定時間,設置maxAge之后自動會生成這個值

例子

//獲取當前時間
var date=new Date();
var expireDays=10;
//將date設置為10天以后的時間
date.setTime(date.getTime()+expireDays*24*3600*1000);
//將userId和userName兩個Cookie設置為10天后過期
expires:date.toGMTString();

httpOnly:屬性禁止客戶端JavaScript的訪問,禁止后不能使用document.cookie

maxAge:單位毫秒,從設置cookie開始多少毫秒失效 

如果maxAge和expires都設置了,最后設置的屬性生效.

path:路徑,默認值為域名的根路徑.

sameSite: SameSite-cookies是一種機制,用於定義cookie如何跨域發送。這是谷歌開發的一種安全機制,未來的一種cookie跨域授權處理方式,不明白的就不用設置了

(Strict是最嚴格的防護,有能力阻止所有CSRF攻擊。然而,它的用戶友好性太差,因為它可能會將所有GET請求進行CSRF防護處理。

例如:一個用戶在reddit.com點擊了一個鏈接(GET請求),這個鏈接是到facebook.com的,而假如facebook.com使用了Samesite-cookies並且將值設置為了Strict,那么用戶將不能登陸Facebook.com,因為在Strict情況下,瀏覽器不允許將cookie從A域發送到B域。

Lax(relax的縮寫?)屬性只會在使用危險HTTP方法發送跨域cookie的時候進行阻止,例如POST方式。

例1:一個用戶在reddit.com點擊了一個鏈接(GET請求),這個鏈接是到facebook.com的,而假如facebook.com使用了Samesite-cookies並且將值設置為了Lax,那么用戶可以正常登錄facebok.com,因為瀏覽器允許將cookie從A域發送到B域。

例2:一個用戶在reddit.com提交了一個表單(POST請求),這個表單是提交到facebook.com的,而假如facebook.com使用了Samesite-cookies並且將值設置為了Lax,那么用戶將不能正常登陸Facebook.com,因為瀏覽器不允許使用POST方式將cookie從A域發送到B域。

)

值true:sameSite使用strict模式

值false:不設置sameSite屬性

值lax:sameSite使用lax模式

值strict: sameSite使用strict模式

secure:設置cookie的secure值,默認是不設置任何值

setSecure(true); 的情況下,只有https才傳遞到服務器端。http是不會傳遞的。

 

genid:設置創建session id的自定義函數,默認使用 uid-safe擴展來生成id, 自定義genid創建函數時一定要保證創建的id不要重復。

name :用來設置在response中范圍session id是屬性值,reuqest中可以用默認的request.session.id訪問。默認值為connect.sid

    我用response['connect.sid'] 得不到值,同志仍須努力吧

proxy:代理,通過設置這個值可以設置X-Forwarded-Proto 頭,

    值有 true (X-Forwarded-Proto使用),false (所有頭信息忽略,只有tls/ssl可以安全連接),undefined(使用trust proxy 設置) 具體大家研究,因為沒有整代碼大家繼續努力實踐

resave:是否允許session重新設置,要保證session有操作的時候必須設置這個屬性為true

rolling:是否按照原設定的maxAge值重設session同步到cookie中,要保證session有操作的時候必須設置這個屬性為true

saveUninitialized:是否設置session在存儲容器中可以給修改

  session過期30分鍾,沒有人操作時候session 30分鍾后過期,如果有人操作,每次以當前時間為起點,使用原設定的maxAge重設session過期時間到30分鍾只有這種業務場景必須同行設置resave rolling為true.同時saveUninitialized要設置為false允許修改。

secret:用來注冊session id 到cookie中,相當與一個密鑰。

store:session存儲的實例子,一般可以用redis和mangodb來實現

unset:設置req.session在什么時候可以設置

  值:destory:請求結束時候session摧毀,值:keep session在存儲中的值不變,在請求之間的修改將會忽略,而不保存

 

 

 方法

req.session

實現實例化

app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

 

 

Session.regenerate()

創建一個session  實例化之后會自動構建session,我暫時沒有使用這個的場景

req.session.regenerate(function(err) {
  // will have a new session here
})

 

Session.destroy()

摧毀一個session,摧毀后會重新生成新的session 多個應用使用通一套session的時候慎用

req.session.destroy(function(err) {
  // cannot access session here
})

  

 

Session.reload()

session重新加載,暫時我沒有碰到需要重新加載的情況

req.session.reload(function(err) {
  // session updated
})

  

Session.save()

手動保存一個session,要控制到權限的時候可用到

req.session.save(function(err) {
  // session saved
})

  

req.session.id

 從request中獲取sessionId

req.session.cookie

 從request中獲取session作為令牌的cookie值

Cookie.maxAge

 req.session.cookie.maxAge,獲取過期時間毫秒數

req.sessionID

 只有在session loaded/created時候才可以讀到,慎用。

 

Session Store Implementation

session store的諸多回調,session store必須是事件驅動的而且是具體方法才可以觸發,因沒有做相關store太多實踐,不做太多說明

store.all(callback) 

返回一個存儲store的數組

store.destroy(sid, callback)

在使用destory/delete 一個session時的回調

store.clear(callback)

delete 一個session時的回調

store.length(callback)

獲取session的總長度在一個store中

store.get(sid, callback)

通過sessionid獲取一個store事例對象

store.set(sid, session, callback)

自動生成一個sessionid或者調用save 一個session對象時候回調

store.touch(sid, session, callback)

使用touch更新session的時候回調

 

因翻譯水平和實踐時間有限,歡迎大家對錯誤之處指出.thanks


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM