当前位置: 首页 > 知识库问答 >
问题:

将刷新令牌存储在客户端的何处?

刘丰羽
2023-03-14

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

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

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

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

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

我可以想到三个解决方案

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

  • a)易受XSS攻击(但可能不像本地/会话存储那样明显
  • b)如果用户关闭浏览器选项卡,它将失去会话

尤其是后一个缺点会使UX变得糟糕。

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

  • a) 每次向资源服务器发出请求时,刷新令牌都会暴露给CSRF

3)在代码< > HTTPONE> /Cook> Cookie中保留两个令牌,其中所提到的缺陷是两个令牌都暴露在同一个攻击向量中。

也许有另一种方法或者比我提到的缺点更多(请让我知道),但是最后一切都归结为我在客户端把刷新令牌放在哪里?是http pOnlycookie还是内存中的JS变量?如果是前者,那么我把我的访问令牌放在哪里?

如果能从熟悉这个话题的人那里得到任何关于如何以最佳方式实现这一点的线索,我将非常高兴。

共有3个答案

阳长恨
2023-03-14

将访问令牌存储在会话存储器中,并通过承载access_-token授权头将其发送到我的资源服务器。然后我可以使用httpOnly cookies作为刷新令牌。这有一个我能想到的缺点:a)每次向资源服务器发出请求时,刷新令牌都会暴露给CSRF。

您可以正确设置CORS策略,以便只从授权服务器接受对/refresh_token请求

如果客户端和服务器来自同一台机器,则可以在Cookie中将标志sameSite设置为true,并包含反CSRF令牌。

公良浩邈
2023-03-14

您可以将访问和刷新这两个令牌存储为cookie。但是刷新令牌必须有特殊路径(例如/refresh)。因此,刷新令牌将仅针对请求/刷新url发送,而不是针对访问令牌这样的每个请求。

嵇弘新
2023-03-14

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

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

如果你担心长寿的话。您可以跳过存储,而不使用它。只需将访问令牌保留在内存中,并在访问令牌过期时进行静默登录。

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

SPA最安全的认证方式是使用PKCE的授权码。

一般来说,使用基于oidc客户端的现有库比自己构建库要好。

 类似资料:
  • 我正在开发一个angularjs网络应用。 要访问服务器端api,我需要添加一个id_token头,并通过使用接收id_token。 问题的关键是——id_token有一个过期日期。在访问服务器应用编程接口之前,我需要确保id_token还没有过期,但是如果是,显而易见的选择是刷新它。 有没有办法刷新id_令牌? 我知道我可以将访问类型更改为脱机,并接收刷新令牌,但请求脱机访问似乎很奇怪,而在我的

  • 我正在尝试从应用程序服务中获取Google的刷新令牌,但我不能。 日志说 2016-11-04T00:04:25 PID[500]收到的详细请求:获取https://noteappsvr.azurewebsites.net/.auth/login/google?access _ type = offline 2016-11-04t 00:04:25 PID[500]从https://account

  • 引用的员额: 为什么OAuth v2既有访问令牌又有刷新令牌? 刷新令牌有什么意义?

  • 我正在尝试使用 GraphQL 使用 JWT 对用户进行身份验证。登录用户后,我会收到令牌作为 JSON 响应和存储刷新令牌的 httponly cookie。(服务器端使用的是销售核心) 从Saleor的文档和其他一些博客帖子中,我假设这个响应cookie现在应该存储在浏览器中,每当我需要刷新令牌时,cookie refreshToken将用于验证我的请求。然而,当我在开发工具中将选项卡切换到“

  • 下一个问题是如何刷新获得的访问令牌? 我试图使用下面的命令这样做,但我得到了“访问此资源需要完全身份验证”。在我获得新的刷新令牌后,我可以使用刷新令牌再次刷新我的新访问令牌吗? 谢谢。

  • @覆盖受保护的无效成功身份验证(HttpServletRequest请求、HttpServlet响应、FilterChain链、身份验证身份验证)抛出IOException、ServletException{ //响应。setHeader(“accessToken”,accessToken);//回答setHeader(“refreshToken”,refreshToken); 成功身份验证正在创