【发布时间】:2020-10-11 12:14:43
【问题描述】:
我一直在为我的无状态应用程序的身份验证 API 处理 JWT,我非常喜欢 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,以将用户数据加载到全局身份验证状态
- 完成!
【问题讨论】:
标签: security jwt xss jwt-auth stateless