100

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

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

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

4

4 に答える 4

175

概要

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 のものです。

于 2012-07-20T19:31:55.047 に答える
46

Express.js を使用したことはありませんが、このテーマに関するドキュメントによると、次のように聞こえます。

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

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

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

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

于 2011-04-02T09:19:31.963 に答える
9

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

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

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

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

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

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

于 2011-04-02T09:29:52.943 に答える
4

すでに優れた回答に加えて、Express セッション、Cookie および store とのリンクを説明するために作成した 2 つの図を次に示します。

  • チョコレートクッキー: チョコレート
  • ストロベリークッキー: いちご

図の説明:

各クッキーには固有の「フレーバー」 (またはsessionId) があります。ストロベリー クッキーが (HTTP 要求内で) サーバーに提示されると、サーバーはこのフレーバーを認識し、対応するデータ (ロージーのデータ) をストアから読み込み、データを取り込みreq.sessionます。

于 2019-12-31T07:54:18.040 に答える