2013-05-10 15 views
6

cookieParser()は、私たちに秘密の文章でクッキーに署名するオプションを与えています。これは、改ざんを防止するのに最適です。私は改ざんを防ぐために、クッキーに特別な値で署名されていることを理解しています。cookieParser()とcookieSession()を一緒に使用していますか?

私はちょうど私がサーバーに保存されたクッキーに素晴らしい選択肢であることがわかりcookieSession()、(Iだけ{ loggedIn = true, userId=763487246824632}を保存するには、それが成長することはありません)を発見。

しかし、私は秘密の文がと一致する場合、cookieParser()の秘密を設定すると物事が壊れ、cookieSession()は機能しなくなることを発見しました。 同じ秘密を使ってクッキーに署名した場合、cookieParser()は実際にそれを受け取り、解析します。

{ cookie: 
    { path: '/', 
    _expires: null, 
    originalMaxAge: null, 
    httpOnly: true } } 

むしろより:

{ testing: 'OOO' } 

(各リロードが追加されます奇妙なことは、cookieParser()はその仕事をし、そして秘密同じシグネチャを持つた後、セッションに設定されていることです'o') だから...

  • 私の分析は正しいですか?
  • 秘密の文が一致すると、セッションがその奇妙な{ cookieオブジェクトに設定されている理由は分かりますか?

メル。

答えて

10

あなたの分析は正しいです、私はそれを再現できます。

問題がcookieSessionミドルウェア(いくつかの文脈:options.secretreq.secretcookieParserに渡された鍵であり、cookieSessionに渡されたキーです):中this lineによって引き起こされますが、両方のミドルウェアを渡した場合、秘密鍵、cookieSessionはそれが見つけることを前提としてい生の(解析されていない)クッキーはreq.cookiesです。

でも、cookieParserは署名されたクッキーを取得しているので(それはcookieSessionより前に実行されています)、クッキー自体を解析しています(署名キーが同じで成功したため) req.signedCookiesを削除し、req.cookiesから削除しました。したがって、cookieSessionまでは、クッキーは設定されていません。

ご覧のオブジェクトが(cookieSession設定からcookieプロパティです)デフォルトのセッション内容は次のとおりです。解決策については

app.use(express.cookieSession({ 
    cookie : { // <-- this object 
    ... 
    } 
}); 

:各ミドルウェアの異なるキーを使用するか、一つだけを渡すのいずれかあなたの秘密鍵のうち、両方ともではありません(cookieParserすべてにあなたのクッキーが署名されるということを理解してください)。

FWIW:これが本当のバグであるかどうかは完全にはわかりません。 cookieParsercookieSessionの両方に同じ署名メカニズムを使用した結果、どちらか一方によって署名されたクッキーと区別されません。クッキーがreq.signedCookiesにあるかどうかを常にチェックすることで修正できますが。

+1

どのような素晴らしい、包括的な答え。私はそれがかなりニッチの問題だと知っていますが、それは+ 1に値する - ありがとう! – Merc