connect / expressjsの「署名された」Cookieとは何ですか?


114

「署名されたCookie」が実際に何であるかを理解しようとしています。ネットにはあまりありません。これを試してみます。

app.use(express.cookieParser('A secret'));

しかし、それでも...ブラウザーではCookieは100%正常であり、ここに「署名」が何であるかは本当にわかりません(私は、クライアントでいくつかの奇妙さ、たとえば、塩としての「秘密」?)

ドキュメントは言う(https://github.com/expressjs/cookie-parser):

Cookieヘッダーを解析req.cookies し、Cookie名をキーとするオブジェクトを入力します。オプションで、他のミドルウェアで使用できるようにsecret割り当てる文字列を渡すことにより、署名付きCookieサポートを有効にすることができますreq.secret

誰か知っていますか?

Merc。

回答:


135

Cookieは引き続き表示されますが、署名があるため、クライアントがCookieを変更したかどうかを検出できます。

値(現在のcookie)のHMACを作成し、base64でエンコードすることで機能します。Cookieが読み取られると、署名が再計算され、添付されている署名と一致することが確認されます。

一致しない場合、エラーが発生します。

Cookieの内容も非表示にする場合は、代わりに暗号化する必要があります(またはサーバー側のセッションに保存するだけです)。そのためのミドルウェアがすでにあるかどうかはわかりません。

編集する

そして、あなたが使用する署名されたクッキーを作成するには

res.cookie('name', 'value', {signed: true})

署名されたCookieにアクセスするには、次のsignedCookiesオブジェクトを使用しますreq

req.signedCookies['name']

ありがとう!しかし...現在、Cookieに署名が追加されていません。つまり、クライアントには署名なしでCookieが存在します。に秘密のメッセージを含める以外に、Cookieの署名を有効にするために必要なことはありますexpress.cookieParser()か?
Merc

少々お待ちください...でcookieを設定してres.cookie('somethingElseAgainAndAgain', 'signed? Maybe' );いますが...署名しているとは思えません!cookieParser()ミドルウェアは、署名されたcookieを解析する準備ができていますが、設定を正しく行っていません...手動で署名する必要がありますか?
Merc

6
それはでした:(res.cookie(name, value, { signed: true }))。ドキュメントから欠落している「詳細」を報告しています...
Merc

6
セッションのハイジャックは何かが異なります。つまり、ユーザーBがユーザーAのIDを取得します。署名付きCookieは、Cookieの内容がユーザーによって変更されていないことを確認するための手段にすぎないため、内容を信頼できます。
staackuser2 2013

9
エラーでIf it does not match, then it will give an error.はないことに言及する価値があります。そのキーのrequest.signedCookieのみが設定されていません無視された
バサラト2014年

25

うん、emostarのように、値が改ざんされていないことを確認するだけであると述べています。2つを区別するために別のオブジェクト(req.signedCookies)に配置され、開発者が意図を示すことができます。他の人と一緒にreq.cookiesに保存されている場合、誰かが同じ名前の署名されていないcookieを作成し、それらの目的全体を無効にすることができます。


11

私はこれに対する良い答えをかなり広範囲にわたって探していました...そして、署名付きCookieに署名cookie-signatureするcookie-parserために使用されるのソースコードを見ると、署名付きCookieについて理解を深めることができました。

valもちろんCookieの値であり、secretオプションとして追加する文字列です。 cookie-parser

https://github.com/visionmedia/node-cookie-signature/blob/master/index.js#L16


3
ここで保存正規のリンクがあります:github.com/tj/node-cookie-signature/blob/...

コードを読むことは確かにはるかに良い説明でした。ありがとう!

0

cookie-parser 1.4.4バージョンを使用しました。

ブラウザで暗号化された署名付きCookieと署名付きCookieを追加できます。editThisCookie(Chromeプラグイン)を使用して署名付きCookieを編集しようとすると、Cookieパーサーが外部の変更を検出し、値としてfalseを設定します。

response.cookie('userId',401,{signed: true})

ブラウザの応答ヘッダー、次のように表示

Set-Cookie: empId=s%3A101.US2oSV4TSvfkvvEQ5fj1sXsjj8rNxx2ph4VdHNTuKX8; Path=/

署名付きCookieを取得する

request.signedCookies

https://gist.github.com/dineshbalaji/607d166f0240f932a5cb02099b0ece4c

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