在使用 Express 架設網站時,且因為 cluster 的考量,會將 Session cookie 的資訊往外拉,通常都是使用 Redis 來儲存使用者的 Session。在 Express 裡會透過 connect-redis 的套件來串接兩者,以及使用者登入的檢查就使用 passport 套件來幫我們完成。
在 Express 裡的設定結構大概會是這樣︰
let sessionMiddleware = session({
store: new RedisStore({
host: hostname,
port: port,
db: db * 1,
ttl: 3600
}),
resave: false,
saveUninitialized: false
});
app.middleware(‘session’, sessionMiddleware);
這時候的困難點會是當未登入的使用者可能需要 session cookie 的 maxAge 會比較短期,例如需要是處在 recaptcha 的驗證階段;直到使用者順利登入後,才需要更新 session cookie 的 maxAge 為合理的時間。也就是 Redis 的 TTL 設定是動態的方式調整。
參考這裡的 討論 的做法則會是固定將 TTL 設為 0,並在使用者登入後才更新 maxAge。所以 RedisStore 的設定將會是︰
store: new RedisStore({
host: hostname,
port: port,
db: db * 1,
ttl: 0
})
接者程式只要控制 request 的 session.cookie 物件,將 maxAge 時間設定上去即可,Redis 就會反應出真實的 TTL 狀況了︰
request.session.cookie.maxAge = COOKIE_CAPTCHA_MAX_AGE;
以上報告完畢。