【发布时间】:2021-12-16 08:55:08
【问题描述】:
我已经阅读了一段时间,没有任何意义,而且解释相互矛盾,而 cmets 正在证明这一点。
到目前为止,我的理解是 JWT 存储由服务器编码的信息,可能有到期时间,如果信息有效,服务器及其密钥可以解码其中的信息。有道理。
它对于可扩展性很有用,因此独立的 API 可以解码和验证令牌中的信息,只要它们具有密钥。此外,不需要将信息存储在任何数据库中,不像在会话中那样。有道理。
如果令牌被盗,API 无法判断令牌是否被正确的人使用。这是上述的缺点。
通过缩短代币的到期时间,可以减少安全漏洞,让窃贼在未经许可的情况下使用代币的时间更少。 (附带问题,但如果他们能偷一次,他们可能也会偷第二次)
但是减少令牌有效期的时间意味着每次令牌过期时用户都需要登录,并且从上面看,它非常频繁,因此不会提供太好的用户体验。有道理。
从现在开始,一切都没有意义了:
引入刷新令牌可以解决这个问题,因为它有更长的到期时间。使用刷新令牌可以生成访问令牌,因此用户只要拥有刷新令牌就可以登录 - 这是一段较长的时间 - 而被盗的访问令牌仍然只在短时间内有效。
对我来说,以上似乎是额外的复杂层,而安全性没有任何改进。 IE。对我来说,上面似乎等于一个长期存在的访问令牌。
为什么?因为对我来说,刷新令牌似乎基本上是一个访问令牌(因为这是它生成的)。因此,拥有刷新令牌意味着无限的访问令牌,因此对 API 的无限访问。
然后我读到一个答案,刷新令牌和访问令牌是一对一的映射,所以窃取访问令牌仍然意味着对 API 的未经授权的访问,但只是在很短的时间内,并且窃取了刷新令牌会生成不同的访问令牌,因此 API 可以检测到异常(同一帐户使用不同的访问令牌),从而使访问令牌无效。
看来我不是唯一一个对这个问题感到困惑的人。
如果上述情况不成立,那么刷新令牌究竟有什么帮助?
如果上述情况属实,并且确实存在刷新令牌和访问令牌的一对一映射:
- 它完全失去了“无国籍”的好处
- 用户无法从多个设备登录(这将是一个“异常”)
- 我无法理解访问令牌如何失效 - 令牌数据中是否存储了会话 ID,或者用户被“阻止”?
如果有人能把问题弄清楚就太好了,因为从5个解释中,有5个相互矛盾的陈述(有时相同的解释包含相互矛盾的信息),许多开发人员都想了解这种方法。
【问题讨论】:
标签: authentication jwt authorization access-token refresh-token