概観
Express.jsはCookieを使用してユーザーのブラウザにセッションID(暗号化署名付き)を保存し、その後のリクエストでそのCookieの値を使用してサーバーに保存されているセッション情報を取得します。このサーバー側ストレージは、メモリストア(デフォルト)または必要なメソッドを実装する他のストア(connect-redisなど)にすることができます。
細部
Express.js / Connectは、24文字のBase64文字列を使用して作成し、utils.uid(24)
それをに保存しreq.sessionID
ます。この文字列は、Cookieの値として使用されます。
クライアント側
署名付きCookieは常にセッションで使用されるため、Cookieの値は次の形式になります。
[sid].[signature]
ここで、[sid]はセッションIDであり、[signature]は、セッションミドルウェアの初期化時に提供された秘密鍵を使用して[sid]に署名することにより生成されます。改ざんを防ぐために署名ステップが実行されます。[sid]を変更してから、使用する秘密鍵を知らずに[signature]を再作成することは、計算上実行不可能であるはずです。[sid]の変更が不要な場合、セッションCookieは依然として盗難や再利用に対して脆弱です。
このクッキーの名前は
connect.sid
サーバ側
cookieParser
およびsession
ミドルウェアの後にハンドラーが発生した場合、ハンドラーは変数にアクセスできますreq.cookies
。これには、キーがCookieキーで値がCookie値であるJSONオブジェクトが含まれます。これには名前付きのキーが含まれconnect.sid
、その値は署名されたセッション識別子になります。
すべてのリクエストでセッションCookieの存在を確認し、その値をコンソールに出力するルートを設定する方法の例を次に示します。
app.get("/*", function(req, res, next) {
if(typeof req.cookies['connect.sid'] !== 'undefined') {
console.log(req.cookies['connect.sid']);
}
next(); // Call the next middleware
});
また、ルーター(app.use(app.router)
)が構成セクションの後cookieParser
とsession
構成セクションに含まれていることを確認する必要があります。
以下は、Express.js / Connectによって内部的に保存されるデータの例です。
{
"lastAccess": 1343846924959,
"cookie": {
"originalMaxAge": 172800000,
"expires": "2012-08-03T18:48:45.144Z",
"httpOnly": true,
"path": "/"
},
"user": {
"name":"waylon",
"status":"pro"
}
}
user
フィールドは、カスタムです。それ以外はすべてセッション管理の一部です。
この例はExpress 2.5のものです。