Node.jsを使用するExpress.jsでセッションはどのように機能しますか?


96

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

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

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

回答:


43

私はExpress.jsを使用したことがありませんが、件名に関するドキュメントによれば、

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

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

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

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


166

概観

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))が構成セクションの後cookieParsersession構成セクションに含まれていることを確認する必要があります。

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


1
console.logでcookie値を出力すると、エンコードされた(署名された)cookieが表示されます。実際の情報を取得するにはどうすればよいですか?
vsync 2013

「[sid]の変更が必要ない場合、セッションCookieは引き続き盗難や再利用に対して脆弱です。」SIDはexpressによって生成されるので、変更することはできませんか?
Hrushikesh 2013

2
@WebHrushi Man-in-the-middle攻撃を考えていました:en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

この質問を缶誰かの助けを私に:stackoverflow.com/questions/21982791/...
ラウンドロビン

特定のsession_idのトークンを作成するにはどうすればよいですか?
aman verma

9

彼らが実際にどのように機能するか私は興味があります。

この回答とwikiを見てみてください。

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

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

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

クライアント側でセッションCookieをいじってはいけません。サーバー側でセッションを操作する場合は、関連するexpress.jsをチェックアウトしてドキュメントを接続する必要があります。


サー、話してもいいですか?
Suraj Jain

0

すでに優れた回答に加えて、Expressセッションを説明するために作成した2つの図と、Cookieとストアとのリンク:

  • チョコレートクッキー: チョコレート
  • イチゴクッキー: イチゴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.