JSON Web Token 如何比 cookie/session 更安全?

Posted

技术标签:

【中文标题】JSON Web Token 如何比 cookie/session 更安全?【英文标题】:How is JSON Web Token more secure than cookie/session? 【发布时间】:2016-12-15 14:30:09 【问题描述】:

如何使用 JSON Web 令牌比不透明会话令牌更安全?在这两种情况下,令牌首先发送到客户端,然后在客户端请求受保护资源时在服务器上进行验证。

【问题讨论】:

您可以查看:cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions 【参考方案1】:

人们说 JWT 更安全有几个原因。我将列出它们,并说明为什么情况并非如此,因为它是双向的。

    可以使用带有 HS256 和 RS256 等安全算法的密钥对 JWT 进行签名。可以在here 找到完整的列表。最重要的是,您还可以加密 JSON Web 令牌的有效负载。但是,会话令牌也可以使用一流的算法安全地生成并存储在签名的 cookie 中。

    JWT 可以存储在 cookie 或 Web 存储(本地/会话存储)中。如果您没有将 JWT 存储在 cookie 中,那么您就不会受到 CSRF 的攻击。您可以决定通过每个 HTTP 请求的 Authorization 标头发送它们。但是,仍然有一个警告。 javascript 用于从 Web 存储访问 JWT,这仍然使您容易受到其他形式的攻击,例如 XSS(跨站点脚本)。值得一提的是,处理 XSS 比处理 CSRF 更容易。

    在您的 JWT 被篡改的情况下,您可以撤销令牌或将令牌列入黑名单。这涉及到每次您想要执行此类操作时都调用数据库,我不建议您这样做。首选选项是使用短期令牌。

在 OAuth 的情况下,不透明令牌(也称为不记名令牌)是随机字符串,将存储在服务器上的某种散列存储中,连同过期、请求的范围(例如访问好友列表)和用户谁同意。稍后,当调用 API 时,发送此令牌,服务器在哈希表上查找,重新合成上下文以做出授权决定(它是否过期?此令牌是否具有与想要成为的 API 关联的正确范围?访问?)。不透明令牌和签名令牌(例如 JWT)之间的主要区别在于 JWT 是无状态的。它们不需要存储在哈希表中。

结论

用于签署和加密 JWT 的库应该是安全的,以确保您的身份验证过程也是安全的。您还应该使用 cookie 作为存储机制,而不是使用它们进行登录。您可以争辩说,使用 JWT 有更多好处,例如它们更容易扩展,并且可以在 OAuth 案例中使用,您可以在 article 中找到这些案例。归根结底,在我看来,这完全取决于开发人员的推理/逻辑,以确保遵循正确的步骤来确保应用程序安全,无论使用何种形式的令牌进行身份验证或授权。在这种情况下,用例也是关键!

【讨论】:

以上是关于JSON Web Token 如何比 cookie/session 更安全?的主要内容,如果未能解决你的问题,请参考以下文章

如何手动检查 json web token 是不是有效?

Json web token

Json Web Token身份认证

json web token + img src

把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

JWT(json web token)