【问题标题】:Express signed cookie vs JWT as cookie for Authentication将签名 cookie 与 JWT 表达为 cookie 进行身份验证
【发布时间】:2021-12-24 22:22:10
【问题描述】:

首先让我先说,这不是客户端令牌与服务器端会话引用的问题。我了解其中的差异,并且我已经决定采用无会话实施。

我还决定将 cookie 用于客户端持久性和传输,而不是 localStorage、查询参数、身份验证标头等。

好的,除此之外,我正在寻找两种替代方法来将用户 ID 保存在客户端上。两者都通过签署数据来防止篡改。

Express 有一个启用签名 cookie 的中间件,或者我可以使用 JWT 也对数据进行签名(我仍然会通过 cookie 发送)。

到目前为止,我的想法是使用签名的 cookie,它的处理开销更少,并且做特定的事情,我不一定需要嵌套 json 格式的数据。此外,我仅将它用于对我的网络服务器上的用户进行身份验证,而不是用于 API 或其他授权。我不需要公/私非对称密钥验证。

JWT 是很好的标准,我已经将它用于 OAUTH,但对于我的网站身份验证,我不需要其中的一些好处。例如,我不需要它来实现可转移性。我不会有不同的 sig 算法或令牌类型。

不过,我确实很欣赏 JWT 是公认的标准,并且有很多支持/文档​​。

关于为什么我应该选择使用 JWT 进行网站授权和客户识别,我是否遗漏了什么?

顺便说一句,我在发布问题之前已经对此进行了研究。这是一个非常相似的,JWT vs cookies for token-based authentication

但是,由于某些原因,投票最多的答案并不适用。主要是,我已经决定是否将 cookie 用于 JWT。我将使用带有 sameSite 等选项的 cookie 来防止 CSRF 攻击,以及:expires、secure、httpOnly 和 signed(这是特别要表达的)。

【问题讨论】:

    标签: express authentication jwt cookie-session


    【解决方案1】:

    到目前为止,我的想法是使用签名的 cookie,它的处理开销更少,并且做特定的事情,我不一定需要嵌套 json 格式的数据。此外,我仅将它用于对我的网络服务器上的用户进行身份验证,而不是用于 API 或其他授权。我不需要公/私非对称密钥验证。

    通过使用 cookie-parser 的签名选项,您的 cookie 将类似于: user_id=111.base64Signature 这里的主要问题是您的令牌上没有 expire,所以即使您在 cookie 上设置了过期时间,如果通过 某种方式 cookie 被盗并使用,您的服务器将接受这些请求。解决方案是在令牌本身上添加时间戳。 所以现在你的有效载荷可能会被转换为 json 并且看起来像这样:

    {
       userId: 111,
       exp: 1637437857
    }
    

    还有 cookie:token='{"userId":111,"exp":1637437857}'.base64Signature。 所以现在如果你对有效负载进行 base64 编码,那么这里与 JWT 的唯一区别就是标题:token=header.payload.signature

    在性能方面,您将获得相同的结果(如果使用 json 格式作为有效负载),因为创建 hmac 的方法是节点的 crypto.createHmac,并且在 express 中间件和常见 jwt 库(jsonwebtoken /express-jwt) 使用对称签名。

    我认为如果你决定实现过期,JWT 格式将使你能够使用不同的库并获得免费验证检查(这似乎缺少 cookie-parser 中间件),如果你没有需要这个,那么您的解决方案就可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 2015-09-13
      • 2020-12-19
      • 1970-01-01
      • 2018-09-02
      • 2011-09-21
      • 2011-06-24
      • 2018-12-24
      • 2016-03-21
      • 2011-06-30
      相关资源
      最近更新 更多