新的无状态 JWT 身份验证理念!它真的安全吗?



我一直在为我的无状态应用程序处理 JWT 的身份验证 API,我真的很喜欢 JWT 的工作方式,但由于将 JWT 存储在本地存储中使其容易受到 XSS 攻击,这让我有点失望。不过,我认为如果您的应用程序受到XSS的攻击,JWT令牌可能是您最不关心的事情。另一方面,如果攻击者决定偷偷摸摸,并且专门旨在窃取用户的 JWT 而没有引起您的注意,那将是最坏的情况。我知道你们每个人都对JWT的安全性有意见,但我不是来讨论什么是最糟糕的,什么是迄今为止最好的。

相反,我将谈论新的想法,以充分利用 JWT 用于身份验证目的,可以这么说。顺便说一句,我不完全确定是否有人想过这个想法,但到目前为止我还没有读过类似的东西。如果你有,我很抱歉标题,并告诉我给谁学分。事不宜迟,让我们开始吧。

首先,我想让你知道,我们将为我们的代币使用较长的到期时间(例如 24 小时(,并且将保持无状态,但问题是如果你的 JWT 被盗,任何人都可以使用它,对吧?因此,为了防止此问题,我们需要使 JWT 对真实用户以外的任何人都不可用。我们可以通过在登录时获取用户的 IP 地址(以及用户 ID 或您需要的其他内容(并将其存储在 JWT 有效负载中来实现这一点。然后,为了验证 JWT 是否安全,我们将检查 JWT 有效负载中的 IP 是否与发出请求的 IP 匹配。如果匹配,我们将从 JWT 有效负载中提取用户 ID,然后将用户数据加载到我们的全局身份验证状态。因此,即使您以某种方式被盗了 JWT,他们也无法将其与其他 IP 一起使用,这使您的 JWT IP 特定于。此外,如果要实现真正的注销功能,则可以使用 Redis 保持无状态,同时能够撤销 JWT。

在坚果壳中

  • 使用凭据登录用户
  • 获取发出请求的 IP
  • 将 IP 放在 JWT 有效负载中(以及用户 ID 或您需要的其他内容(
  • 返回 JWT 并将其存储在本地存储中

使用 JWT 自动登录;

  • 检查本地存储中是否存在 JWT
  • 如果存在,请检查发出请求的 IP 是否与 JWT 有效负载中的 IP 匹配
  • 如果匹配,请从 JWT 有效负载中提取用户 ID,以将用户数据加载到全局身份验证状态
  • 做!
  1. 这在之前已经讨论过很多次了。
  2. 当攻击者位于同一网络(公司、NAT(上时,这不会阻止攻击。
  3. 这对于正常更改IP地址(移动到有线,在wifi网络之间等(的用户不起作用。
  4. 使用数据库(任何类型的,例如。Redis( 存储注销的状态不是无状态的。

如果情况合适,它可能仍然可以使用(即,它可以缓解威胁模型中的某些威胁,而可能无法缓解其他威胁(,但到目前为止,它不是解决此问题的通用解决方案。

最新更新