客戶端與服務會使用一個Sessionid的Cookie值來進行客戶端和服務器端會話的匹配,這個Cookie通常是服務器端讀/寫的,並在Http請求響應的Header中的Set-Cookie屬性設置:node
express-session是針對nodejs express框架提供的一套session擴展redis
主要參數有 secret,sesave,saveUninitialized,cookieexpress
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開始多少毫秒失效 cookie
若是maxAge和expires都設置了,最後設置的屬性生效.session
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在存儲中的值不變,在請求之間的修改將會忽略,而不保存
方法
實現實例化
app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
建立一個session 實例化以後會自動構建session,我暫時沒有使用這個的場景
req.session.regenerate(function(err) { // will have a new session here })
摧毀一個session,摧毀後會從新生成新的session 多個應用使用通一套session的時候慎用
req.session.destroy(function(err) { // cannot access session here })
session從新加載,暫時我沒有碰到須要從新加載的狀況
Session.reload()
session從新加載,暫時我沒有碰到須要從新加載的狀況
手動保存一個session,要控制到權限的時候可用到
Session.save()
手動保存一個session,要控制到權限的時候可用到
從request中獲取sessionId
從request中獲取session做爲令牌的cookie值
req.session.cookie.maxAge,獲取過時時間毫秒數
只有在session loaded/created時候才能夠讀到,慎用。
session store的諸多回調,session store必須是事件驅動的並且是具體方法才能夠觸發,因沒有作相關store太多實踐,不作太多說明
返回一個存儲store的數組
在使用destory/delete 一個session時的回調
delete 一個session時的回調
獲取session的總長度在一個store中
經過sessionid獲取一個store事例對象
自動生成一個sessionid或者調用save 一個session對象時候回調
使用touch更新session的時候回調