cookie-sessionとpassportは実際に何してる?ソースコードを詳しく追ってみた

cookie-sessionの設定

const cookieSession = require('cookie-session')
const express = require('express')

const app = express()

app.use(cookieSession({
  name: 'session',
  keys: ['key2','key1'],

  // Cookie Options
  maxAge: 24 * 60 * 60 * 1000 // 24 hours
}))

cookieSessionはexpressサーバーのミドルウェアで、app.useで使用することができます。

レスポンスヘッダーへのcookieのセット、リクエストヘッダーからcookieの読み込みを行うことができます。

sessionが改ざんされないように、session.sigという文字列を同時にcookieにセットします。session.sigは、あらかじめサーバー側で決めておいたkey(cookieSessionのkeys配列の要素)とsessionから暗号化プログラムによって作成されます。

cookie-sessionとcookies とkeygrip

Cookieとしてサーバーからブラウザーに渡されているsessionの文字列は、暗号化されているものではなく、単にbase64という形式で変換されているものにすぎません。
例えば、session: eyJwYXNzcG9ydCI6eyJ1c2VyIjoiNWMzYjYzNjAzMmU3NDQxMmNhYTMwYmEwIn19
は、
{"passport":{"user":"5c3b636032e74412caa30ba0"}}
というJSON形式をbase64形式で書き直したものに過ぎません。
cookie-session/index.jsより
function decode(string) {
varbody=Buffer.from(string, 'base64').toString('utf8');
returnJSON.parse(body);
}

Buffer.from(string, 'base64').toString('utf8');

で変換されています。

どうやってCookieが改ざんされているかチェックしている?

cookie-sessionでkeysを設定します。keysは配列で複数個のkeyを設定できます。
暗号化に使われるkeyはkeys[0]ですが、復号においてはkeysの要素が順番に試されます。
こうすることで、新しいkeyをどんどん追加することができ、セキュアに保つことができます。
復号では古いkeyも使えるので、以前に接続した人のcookieも有効です。
cookieは有効期間を定める(maxAge:1日とか30日とか)ものなので、ある一定期間が過ぎたkeyは捨ててしまって良いので、keysの配列の要素数は一定数に収まります。

keyとsessionによってsession.sigは決まるので、もし、sessionが改ざんされると、session.sigとsession + keyの整合性がとれなくなります。こうなると、sessionが継続しているとcookie-sessionに認定されません。

コメント