首页 > 解决方案 > 在客户端的哪里存储刷新令牌?

问题描述

我的 SPA 应用程序使用以下架构(来源):

在此处输入图像描述

这假设我的客户端应用程序知道刷新令牌,因为如果不存在用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。

我的问题:在我的客户端应用程序中,我在哪里存储刷新令牌?SO上有很多关于这个主题的问题/答案,但关于刷新令牌,答案并不清楚。

访问令牌和刷新令牌不应存储在本地/会话存储中,因为它们不是任何敏感数据的地方。因此,我会将访问令牌存储在httpOnlycookie 中(即使有 CSRF),无论如何我对资源服务器的大部分请求都需要它。

但是刷新令牌呢?我不能将它存储在 cookie 中,因为 (1) 它会随每个请求一起发送到我的资源服务器,这也使其容易受到 CSRF 的攻击;(2) 它会发送具有相同攻击向量的公开访问/刷新令牌.

我能想到三个解决方案:


1) 将刷新令牌存储在内存中的 JavaScript 变量中,这有两个缺点:

特别是后一个缺点会导致糟糕的用户体验。


2)将访问令牌存储在会话存储中并通过Bearer access_token授权标头将其发送到我的资源服务器。然后我可以使用httpOnlycookie 作为刷新令牌。这有一个我能想到的缺点:


3) 将两个令牌保存在httpOnlycookie 中,这具有上述缺点,即两个令牌都暴露于相同的攻击向量。


也许除了我提到的缺点之外还有另一种方法或更多(请让我知道),但最终一切都归结为我在客户端将刷新令牌保存在哪里?是httpOnlycookie 还是内存中的 JS 变量?如果是前者,那我应该把我的访问令牌放在哪里?

非常乐意从熟悉该主题的人那里获得有关如何以最佳方式做到这一点的任何线索。

标签: authenticationcookiesoauthoauth-2.0token

解决方案


您可以将加密的令牌安全地存储在HttpOnlycookie 中。

https://medium.com/@sadnub/simple-and-secure-api-authentication-for-spas-e46bcea592ad

如果您担心长期存在的刷新令牌。您可以跳过存储它并且根本不使用它。只需将 Access Token 保存在内存中,并在 Access Token 过期时进行静默登录。

不要使用Implicitflow 因为它已经过时了。

SPA 最安全的身份验证方式是使用 PKCE 的授权代码

一般来说,最好使用基于oidc-client的现有库,而不是自己构建一些东西。


推荐阅读