【发布时间】:2019-08-24 11:05:47
【问题描述】:
我正在使用 JWT 对我的应用的用户进行身份验证。当用户登录时,他们会获得一个访问令牌和一个刷新令牌。为了保证刷新令牌的安全,我不将其存储在客户端,而是将其与他们的帐户一起保存在后端,因此不容易访问。不过,我对刷新令牌的安全性感到困惑,这是我在阅读有关如何使用刷新令牌的在线资源时所理解的逻辑:
- 认证
- 在某处存储访问令牌 + 刷新令牌(在我的情况下,前端的访问令牌和后端的刷新令牌)
- 执行api请求时,在api端验证访问令牌
- 如果访问令牌过期,使用刷新令牌生成新的访问令牌+新的刷新令牌,将访问令牌发送回客户端
- 像以前一样存储令牌...并重复
我担心的安全问题是,如果其他人(黑客)持有访问令牌并使用它向 api 发送请求,如果令牌过期,api 将使用刷新令牌来获取一个新的访问令牌 + 新的刷新令牌,并至少将访问令牌返回给黑客。
我读了this的文章大约5-6次,我读了几遍this的文章,以及其他一些关于这个主题的文章,他们都说类似
确保安全地存储刷新令牌,因为它是长期存在的,access_token 是短暂的,所以没什么大不了的
但是根据我上面描述的流程,访问令牌是否短暂无关紧要,刷新令牌将用于获取新的访问令牌并永久访问。
我有什么遗漏吗?如果黑客获得了过期的访问令牌,api 如何知道谁在发送请求?它仍然会使用刷新令牌发送一个新令牌。我应该以某种方式验证谁在发送请求吗?
更新
所以我明白,当请求新的访问令牌时,我需要发送刷新令牌、客户端 ID 和客户端密码。我遇到的问题是,像以前一样,黑客可以向我的 API 服务器发送请求,服务器从黑客那里获取被劫持的访问令牌,它会看到它已经过期,所以它会发送刷新令牌,以及将 clientID/client 密钥(存储为环境变量)传递给 Auth API 并取回新的访问令牌/刷新令牌,这使我们回到了同样的问题。
更新 2
关于这个主题的一些有趣的问题:
- Why Does OAuth v2 Have Both Access and Refresh Tokens?
- https://security.stackexchange.com/questions/87119/how-secure-are-expiring-tokens-and-refresh-tokens
根据第二个问题和答案,刷新令牌似乎不是维护访问的更安全方式,只是更容易检测到黑客,因为身份验证/刷新令牌不断被请求并使其他令牌无效。问题在于,只有当 2 个用户同时尝试访问资源时才会发生这种情况 - 如果只有黑客恰好在给定时间段内处于活动状态,他将可以无限制地访问原始用户数据,直到原始用户尝试使用应用程序并访问受保护的资源
【问题讨论】:
标签: oauth-2.0 access-token refresh-token