express-session整理

客戶端與服務會使用一個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在存儲中的值不變,在請求之間的修改將會忽略,而不保存

 

 

 方法

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從新加載,暫時我沒有碰到須要從新加載的狀況

Session.reload()
session從新加載,暫時我沒有碰到須要從新加載的狀況

Session.save()

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

Session.save()
手動保存一個session,要控制到權限的時候可用到

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的時候回調

相關文章
相關標籤/搜索