刷新令牌与 JWT 令牌交互

Refresh tokens and JWT tokens Interaction

我正在构建一个使用 JWT 进行身份验证的应用程序。我开始做一些研究,我对刷新令牌和令牌存储等主题缺乏共识感到惊讶。

据我所知,JWT 和 OAuth 是两种不同的协议,它们遵循 规格不同。

OAuth 使用刷新令牌来获取新的访问令牌,但为此,该过程涉及 4 个实体,用户(前端),资源服务器(Facebook,Google,等等),客户端服务器(例如 PHP Web 应用程序)和授权服务器。

在这种情况下,拥有一个刷新令牌是有意义的,因为为了刷新令牌,需要一个客户端 ID 和一个客户端密码(由 Resource/Auth 服务器发布),只有由客户端服务器而不是用户(用户前端)。因此刷新令牌对于窃取刷新令牌的攻击者来说是无用的。

但我的问题是,对于未针对 Google、Facebook 等第三方资源服务器进行身份验证的应用程序,拥有刷新令牌真的有用吗,为什么不这样做使 JWT 令牌与刷新令牌一样长。

另一方面,我可以看到当刷新令牌与 JWT 令牌一起使用时 This Article 状态,刷新令牌通常受到严格的存储要求以确保它们不会泄漏。但是,我找不到 What/Where 以及如何在用户端存储此令牌以满足那些严格的存储要求。

有人可以告诉我这一切吗?谢谢

注意:我想强调我的网络应用程序没有使用第三方应用程序进行身份验证(Facebook、Google 等),它是前端和服务器端的单页应用程序单个 API 发出 JWT 令牌。我的问题集中在这种架构上

JWT 令牌应该有一个有限的生命周期以限制它们被盗时的用途。刷新令牌用于在不涉及用户的情况下获取新的访问令牌,并且只能从机密客户端使用。

我在 中更详细地描述了 OAuth2 流程和刷新令牌的使用。

简而言之,您是对的,如果您以相同的方式存储刷新和访问令牌,并且您的应用程序本身就是身份提供者,那么使用刷新令牌就没有多大意义 - 它可能会被盗与实际访问令牌的方式相同。

但是,请考虑两件事。

第一,访问令牌随每个请求一起发送。如果您查看最近的(和更早的)https 漏洞,有时外部攻击者可能会提取 https 流的位(在某些情况下,取决于特定漏洞)。这通常不是直截了当的,而且可能无法满足每个请求。如果您有一个寿命较短的访问令牌和一个很少使用的寿命较长的刷新令牌,即使访问令牌通过此类 ssl/tls 攻击受到损害,刷新令牌也可能不会。这是一个非常小的好处,但仍然如此。

此外,您还可以以不同方式存储刷新令牌。这些令牌的主要风险之一是 XSS。如果您以在 httpOnly cookie 中发布刷新令牌的方式实现身份提供者,则 Javascript 无法访问刷新令牌,因此无法使用 XSS 读取它。您仍然可以将访问令牌存储在 Javascript 对象或 localStorage 或其他任何东西中,如果它被泄露,它至少是短暂的。这很好,因为 XSS 通常需要用户交互,所以如果它成功了一次,因为例如用户点击了一个 link 或访问了一个特定的页面,不能保证他会再次这样做,所以阅读下一篇访问令牌对于攻击者来说可能很难。同样,这不是一个很大的好处,但一个优势。