web-dev-qa-db-ja.com

クライアント側からCookieセッションにアクセスするにはどうすればよいですか?

NodeJSを使用してアプリケーションのシングルページを構築しており、Cookieセッション(cookie-session npm)を使用して、ユーザーがログインしているかどうかを確認したいと考えています。ノードサーバー側からセッションCookieを取得して設定できますが、クライアント側から取得する方法がわかりません。

これは、サーバー側から設定する方法です。

req.session.user_id = user[0]._id;

どこ user[0]._idは、mongodbから取得したユーザーIDです。

5
Zzeks

したがって、cookie-sessionを次のように構成したと仮定します。

var cookieSession = require('cookie-session');

app.use(cookieSession({
    keys: ['secret']
}));

次に、セッションにいくつかのデータを保存しましょう。

req.session.user_id = 123;

ブラウザの開発ツールを見ると、2つのCookieが設定されていることがわかります。

express:sess = eyJ1c2VyX2lkIjoxMjN9
express:sess.sig = 01I_Rx2gACezZI1tdl2-NvxPq6w

Cookie express:sessはbase64でエンコードされています。デコードすると、{"user_id":123}が得られます。セッションデータがCookie自体に保存されていることを理解することが重要です。これは、セッションのIDだけではありません。

もう1つのCookieexpress:sess.sigは署名です。この署名は、キー(この例ではsecret)を使用して生成され、改ざんを防ぐために使用されます。誰でもexpress:sessを変更するのは簡単ですが、対応するexpress:sess.sigも生成できない限り、サーバーはそれが変更されたことを認識します。

とはいえ、express-sessionミドルウェアを確認することをお勧めします。これもCookieを使用しますが、セッションIDを保存するためにのみCookieを使用します。 Cookieにはデータは保存されません。つまり、すべてサーバーに保存されます。これは、他のほとんどのWebフレームワークでのセッションの動作に非常に似ていますが、どのアプローチがニーズに最も適しているかはわかりません。

どちらのアプローチを使用する場合でも、Cookieはデフォルトでhttponlyに設定されています。これは、ブラウザの開発ツールで確認できます。これは、HTTPリクエストに含まれていますが、クライアント側のJavaScriptを介してアクセスできないことを意味します。これは、悪意のあるコードがCookieを盗むことをより困難にするように設計されたセキュリティ対策です。このセキュリティ機能は、cookie-sessionで次を使用して無効にできます。

app.use(cookieSession({
    httpOnly: false,
    keys: ['secret']
}));

その後、document.cookieを使用してこれらのCookieにアクセスできるようになります。

これはセキュリティ対策であり、オフにすることはお勧めしません。これがあなたのアプリケーションの真の関心事であるかどうかを私が判断することは不可能です。

実際にCookieから値を解析するのか、それとも単にCookieの存在を確認するのかは、質問からは明らかではありません。解析する必要がある場合は、関連するCookie値をbase64でデコードしてから、JSONでデコードする必要があります。

Cookieをhttponlyに保つために採用できるさまざまな代替アプローチがあります。この情報をどのように処理するかについて詳しく知らなければ、具体的にすることは困難です。 Expressビュー(テンプレートレンダリングなど)を使用している場合は、テンプレートですべての作業を行うことができます。 SPAの領域にいる場合は、AJAXリクエストを使用して関連情報を収集できます。ピンチでは、別のCookieを使用して、セッションを維持しながら必要な情報を提供することもできます。安全なクッキー。

24
skirtle