web-dev-qa-db-ja.com

Express.jsとNode.jsのセッションはどのように機能しますか?

Express.js を使用すると、セッションは非常に簡単です。しかし、実際にどのように機能するのか興味があります。

クライアントにCookieを保存しますか?もしそうなら、どこでそのクッキーを見つけることができますか?必要に応じて、どのようにデコードしますか?

基本的に、ユーザーが実際にサイトにいないときでも(他のサイトにいるときにログインしていることをFacebookが認識する方法など)、ユーザーがログインしているかどうかを確認できます。しかし、セッションがどのように機能するかを最初に理解する必要があることを理解すると思います。

92
foobar

Express.jsを使用したことはありませんが、 their documentation によると、件名は次のように聞こえます:

  • Cookieはクライアントに保存され、キー(サーバーはセッションデータを取得するために使用します)とハッシュ(Cookieデータが改ざんされていないことを確認するためにサーバーが使用するため、変更しようとするとCookieが無効になる値)

  • 一部のフレームワーク(たとえば Play Framework !)とは対照的に、セッションデータはサーバー上に保持されるため、Cookieは実際のセッションデータのホルダーというよりもセッションのプレースホルダーのようなものです。

  • here から、サーバー上のこのセッションデータはデフォルトでメモリに保持されているように見えますが、適切なAPIを実装するストレージ形式に変更できます。

あなたが言ったように、特定のreqリクエストオブジェクトなしで物事をチェックしたい場合は、その同じストレージにアクセスする必要があります。最初のドキュメントページの下部に、ストレージが実装する必要のある必要なメソッドの詳細が記載されているため、ストレージAPIに精通している場合は、.getAll()を実行してループを作成できます。セッションデータを介して、必要な値を読み取ります。

38
davin

概要

Express.jsはCookieを使用してセッションID(暗号化署名付き)をユーザーのブラウザーに保存し、その後のリクエストでそのCookieの値を使用してサーバーに保存されたセッション情報を取得します。このサーバー側のストレージは、メモリストア(デフォルト)または必要なメソッド( connect-redis など)を実装するその他のストアです。

詳細

Express.js/Connectは、utils.uid(24)を使用して24文字 Base64 文字列を作成し、_req.sessionID_に保存します。この文字列は、Cookieの値として使用されます。

クライアント側

セッションでは常に署名付きCookieが使用されるため、Cookieの値は次の形式になります。

_[sid].[signature]
_

[sid]はセッションIDで、[signature]は、セッションミドルウェアの初期化時に提供された秘密鍵を使用して[sid]に署名することにより生成されます。署名ステップは、改ざんを防ぐために行われます。 [sid]を修正してから[signature]を再作成することは、使用される秘密鍵の知識なしで計算上実行不可能であるべきです。 [sid]の変更が必要ない場合、セッションCookieは依然として盗難および再利用に対して脆弱です。

この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
});
_

また、configureセクションでcookieParserおよびsessionの後にルーター(app.use(app.router))が含まれていることを確認する必要があります。

以下は、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のものです。

153
Waylon Flinn

しかし、実際にどのように機能するのか興味があります。

this answerおよび wiki stuffを見てください。

クライアントにCookieを保存しますか?

はい、通常はセッションIDが割り当てられたCookieであり、偽造を防ぐために秘密で署名する必要があります。

もしそうなら、どこでそのクッキーを見つけることができますか?必要に応じて、どのようにデコードしますか?

クライアント側でセッションCookieを台無しにしないでください。サーバー側でセッションを操作する場合は、関連する express.js および connect のドキュメントを確認してください。

8
yojimbo87