【问题标题】:How does Connect's session middleware's signed cookies work?Connect 的会话中间件的签名 cookie 是如何工作的?
【发布时间】:2013-01-28 10:23:24
【问题描述】:

我想解释一下 connect.sid cookie 如何在 Connect Node.js 框架中工作。我注意到它们的格式类似于,

s:hash.signature

我不明白当哈希能够用于从内存存储或 redis 存储访问会话数据时如何使用签名。

另外,我不明白为什么 s: 甚至在 cookie 中;它的目的是什么。

我听说签名用于“签名”哈希。 “签名”或“签名”到底是什么意思?我也需要这个过程的解释。

谢谢!

【问题讨论】:

    标签: node.js session cookies connect middleware


    【解决方案1】:

    签名在那里,因此服务器可以验证它是否生成了 cookie,而不是一些随机的攻击者。

    只有知道用于签名的秘密的人才能用相同的值签名。

    "s:" 在那里所以很容易知道它是一个签名的 cookie,而不是其他格式(如未签名)。

    这是一种从签名 cookie 中检索数据的方法,如果签名不正确,则失败。只是从实际应用中提取的部分代码,但你应该明白了。

    var cookie = require('cookie');
    var connect = require('connect');
    var secret = "same secret used to sign cookies";
    
    socketio.set('authorization', function(data, cb) {
      if (data.headers.cookie) {
        var sessionCookie = cookie.parse(data.headers.cookie);
        var sessionID = connect.utils.parseSignedCookie(sessionCookie['connect.sid'], secret);
        // do something here with decoded value
      }
    });
    

    您需要使用 socket.io 中的“授权”功能,以便您可以访问标头。该代码在使用 xhr-polling 传输时有效,例如,我不确定这是否适用于 websocket。

    【讨论】:

    • 每个 sid 都必须得到它自己的签名,否则它就没有任何用处。但是中间件如何知道签名是有效的,它是否将其存储在会话中?另外,为什么不做一个很长的 sid 而不是签名呢?
    • 秘密在上面的代码中是传递给 express.session() 以签署 cookie。签名是内容和秘密的哈希值。
    • 那么当内容发生变化时,cookie也会发生变化?
    • 是的,确实如此。但最好只包含对存储在服务器上的实际数据的引用。例如会话 ID。
    • 顺便说一句,s: 特定于连接中的 cookieSession,但这是一个很好的约定。
    猜你喜欢
    • 2015-05-24
    • 2012-08-07
    • 2010-12-10
    • 2013-01-15
    • 2015-02-27
    • 2012-06-08
    • 2015-05-02
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多