4

ユーザーログインをサポートするExpressJSバックエンドを作成しています。複数の例から、req.sessionオブジェクトの使用がわかります。このオブジェクトはサーバーとクライアント間で情報を保存および取得するために使用されているようです。そのため、サーバーは「ログ」フラグを設定し、後でこのフラグをチェックしてユーザーがログインしているかどうかを確認できます。

私の質問は、これはどのように正確に機能するのかということです。サーバーはどのようにしてクライアントに情報を保存し、すべてのリクエストから情報を取得しますか?それはCookieを介して行われますか?クライアントがクライアント側でこのオブジェクトのコンテンツを手動で操作してセキュリティを無効にすることは可能ですか?もしそうなら、ユーザーログインをチェックするためのより安全な方法は何ですか?

4

3 に答える 3

6

ExpressJSのGoogleグループから何かを見つけたので、ExpressJSではセッションとCookieが少し異なります。基本的に:

Res.cookieは応答にCookieを追加します。req.sessionは、サーバー側のキー/値ストアです。セッションデータはデフォルトでサーバーメモリに保存されますが、代替ストアを構成することもできます。

セッションには何でも保存できます。クライアントに表示されるのは、セッションを識別するCookieだけです。

(クレジットはLaurie Harperに送られます)

したがって、ExpressJSは@Vahidが述べたことをすでに実行しており、値をサーバーに保存し、クライアント側でキーをCookieとして保存しているようです。私の理解では、req.sessionは、req.cookieのカスタムCookieとは関係なく、独自のCookie(キーのみを含む)を使用します。

于 2013-01-28T16:22:03.270 に答える
3

実際には req.session の session オブジェクトはクライアントから渡されません。あなたの構文では、使用した可能性がありますapp.use(session{options})

これはミドルウェアです。Express サーバーから渡される各リクエストは、このミドルウェアを介して渡される必要があります。このミドルウェアは、Cookie (サーバーに保存されているエンコードされたバージョンの sessionId) を取得し、それをデコードして sessionId を取得します。その sessionId に対応するセッションがサーバーから取得され、req.session として req オブジェクトに添付されます。クライアント側からセッションを取得しているように見えますが、実際には、クライアントから Cookie を取得してセッション オブジェクトを req オブジェクトにアタッチするのはミドルウェアの仕事です。

于 2015-06-30T06:51:57.853 に答える
2

あなたの正確な実装がわからないので、あなたのケースについて特にコメントしません。ただし、一般的には、リクエストごとにブラウザからサーバーに送信されているものを確認できます。「ライブ HTTP ヘッダー」や「改ざんデータ」などの Firefox 拡張機能をインストールしたり、wireshark (https でない場合) や firebug、firecookie などをインストールしたりできます。

次に、Cookie を介して送信されているものを確認します。ExpressJS は、ユーザーの認証に成功した後、セッション ID を生成し、それを DB に保存し、同じ値をブラウザーの Cookie に保存していると確信しています。ブラウザーが Cookie を送信するたびに (画像を含む)、サーバーはセッション ID を db で検証し、セッションを検出します。

ユーザーのセッションをloggedin = 1のような値に設定する古い安全でないコードを見てきました。あなたの場合は、それが本当に簡単にバイパスできることを知っておく必要があります。クライアントごとにセッション ID を生成、保存、設定する必要があります。

于 2013-01-25T18:06:31.290 に答える