JWT 是用户身份验证的安全选项吗?

问题描述 投票:0回答:2

我喜欢 JWT 的简单性,只是在为 Web 应用程序实现身份验证机制时使用它们,其中我有一个提供 RESTful JSON API 的 Elixir/Phoenix 后端和一个 Angular 2 前端。

今天我偶然发现了this文章(我与该网站没有任何关系),它让我对 JWT 的使用产生了一些疑问,我想对此进行讨论。主要:

  • 没有真正的方法让 JWT 在不关闭的情况下失效 整个系统。至少当他们无国籍时是这样。
  • 这意味着您无法撤销访问权限,这可能会非常糟糕。
  • 本地存储(JWT 主要存储在前端)不如会话存储安全。

与 cookie 不同,本地存储不会发送您的数据内容 存储每个请求。检索数据的唯一方法 本地存储是使用JavaScript,这意味着任何攻击者 提供的通过内容安全策略的 JavaScript 可以访问 并将其渗透出去。不仅如此,JavaScript 也不关心或 跟踪数据是否通过 HTTPS 发送。就 JavaScript 而言 就其而言,它只是数据,浏览器将对其进行操作,就像 它会任何其他数据。

在这些工程师经历了所有麻烦以确保没有人 会偷走我们的饼干罐,这里我们试图忽略 他们给我们带来的所有花哨的技巧。这似乎有点倒退 对我来说。

到目前为止,我认为他的观点是无效的 - 只要通过 https 提供一切服务并防止 XSS 和 CORS 攻击。我的意思是,如果恶意 JS 可以在网站上执行,这确实不是 JWT 的问题。并且JS不允许混合内容(http和https)。

要使所有令牌无效:只需使用 JWT 生成编号变量之类的东西,它可以存在于您的环境变量中并在每个令牌中进行编码。它是一个简单的整数。如果您想让所有令牌失效,请增加它。那么你只需要一种机制来检查代号是否匹配。这不必影响数据库,也不应该成为性能问题。通过可靠的部署策略将其部署到多个实例应该不会太困难。

要使单个令牌失效:使用刷新令牌和 JWT 的非常短的生命周期(几分钟)。如果 JWT 的 TTL 即将结束,用户将通过刷新令牌获取新的 TTL。这意味着数据库每隔几分钟就会命中一次。

还是我错了?

security jwt
2个回答
5
投票

LocalStorage - JWT 主要存储在前端 - 是 不如会话存储那么安全。

您始终可以将 JWT 存储在 HttpOnly cookies 中,这将降低它们被任何 XSS 漏洞窃取的风险。

当然,所有其他常见的最佳实践都适用 - 安全标志、HSTS 等。

要使所有令牌无效:只需使用 JWT 之类的东西 Generation-number 变量,可能存在于您的环境中 变量并被编码在每个标记中

是的,你可以这样做,甚至完全生成新的秘密。

使单个令牌失效:使用刷新令牌和 JWT 的非常短的生命周期 (几分钟)。如果 JWT 的 TTL 即将结束,用户 通过刷新令牌获取新的。这意味着数据库命中每 几分钟。

所以我假设这意味着对您的刷新令牌使用传统的服务器端会话状态机制?这似乎是一个有效的方法。确保会话令牌使用安全算法在服务器端进行哈希处理(例如 SHA-2 - 不需要盐)。

唯一棘手的部分是从客户端到服务器的时钟同步。如果您很快使它们过期,那么任何小的时钟差异都可能会让客户端感到困惑,并且他们不会及时请求刷新令牌。这让事情变得更加复杂,而复杂性是安全的主要敌人。

如果令牌过期的速度如此之快,那么使用传统的服务器端会话管理机制可能更有意义。


0
投票

根据我的经验,最好的答案是,以任何人都看不到的方式存储 jwt 密钥,并假设如果发生这种情况,我们有很多方法,例如使用时间验证,密钥将在几分钟内过期,我们也可以使用函数使用随机函数动态生成不同的 jwt 密钥,这是我的观点和经验 谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.