本篇主要段落翻譯來自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