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

访问令牌和刷新令牌最佳实践?如何实现访问

柴茂材
2023-03-14

我正在制作SPA,并决定使用JWT进行身份验证/授权,我读过一些关于令牌与Cookies的博客。我理解cookie授权是如何工作的,也理解基本令牌授权是如何工作的。问题是,我看不出刷新令牌如何适合它,在我看来,它降低了安全性。让我解释一下,就像我看到的那样:

通过用户名验证用户时

>

服务器还需要不断地查找存储,以查看什么用户,cookie点。

通过用户名验证用户时

  • 这很容易受到XSS(跨站点脚本)的攻击,但您可以通过验证HTML输入来防止这种情况

所以我想使用刷新令牌来防止用户经常登录。假设在身份验证上,我给用户访问令牌和刷新令牌,当用户访问令牌到期时,用户可以使用刷新令牌来获得新的访问令牌,这是我没有得到的。

  • 假设我将访问令牌存储在本地存储器中。如果我还将刷新令牌存储在本地存储中,我看不出它有任何用处。因为如果攻击者可以访问本地存储并获得访问令牌,他也可以获得刷新令牌。所以在这种情况下,为什么不让访问令牌长寿呢
  • 如果您将刷新令牌存储为cookie,它容易受到XSRF的攻击,然后攻击者可以获取新的访问令牌并使用它。同样在这一点上,为什么不直接使用Cookie授权呢?因为您已经必须查找本地存储以查找刷新令牌,尽管这种情况发生的频率比使用纯cookie授权的情况要低

目前我正在考虑使用:

  • 访问令牌(本地存储,短期)
  • 刷新令牌(Cookie,长寿命)
  • 刷新令牌的令牌(用于防止XSFR、本地存储在一次使用后过期)

假设它看起来像这样:

  +--------+                                           +---------------+
  |        |------------ Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<--------------- Access Token -------------|               |
  |        |               & Refresh Token (cookie)    |               |
  |        |               & XSRF Token                |               |
  |        |                                           |               |
  |        |                                           |               |
  |        |--------- Access Token ------------------->|               |
  |        |                                           |               |
  |        |<----- Protected Resource -----------------|               |
  | Client |                                           |     Server    |
  |        |--------- Access Token ------------------->|               |
  |        |                                           |               |
  |        |<----- Invalid Token Error ----------------|               |
  |        |                                           |               |
  |        |                                           |               |
  |        |---------------- Refresh Token ----------->|               |
  |        |               & XSRF Token                |               |
  |        |                                           |               |
  |        |<--------------- Access Token -------------|               |
  |        |               & XSRF Token                |               |
  +--------+               & Optional Refresh Token    +---------------+

每次使用刷新令牌时,服务器都会发出新的XSRF令牌(使用一个XSRF令牌后,它会停止工作,服务器会发出新的XSRF令牌)。你觉得这个实现怎么样?在我看来,这限制了服务器对数据库的查找,因为它使用访问令牌,访问令牌的寿命很短,而且用户不必经常登录,因为它使用的刷新令牌/cookie受XSRF令牌保护。

这样可以吗?

谢谢

共有1个答案

端木野
2023-03-14

考虑访问令牌是一个“脏”令牌。你分享了很多。我不必是一个服务器,你可以将令牌传递给多个服务器。因此,攻击面上升。如果一台服务器做了一些愚蠢的事情,比如将令牌写入服务器日志,然后将日志公开给全世界,那么您需要限制负面影响,因此访问令牌的寿命很短,以限制攻击者进行恶意操作的时间。

另一方面,刷新令牌是一种“干净”的令牌。你为自己存储的东西,只有在必要时才会使用。当然,如果攻击者获得了对您的计算机和用户代理的物理访问权限,那么游戏就结束了。但是在这里,我们试图保护自己免受远程攻击者的攻击。刷新令牌只能在与认证服务器或认证endpoint交谈时使用。如果你决定把它变成cookie——你可以——只要记住把目录路径限制在令牌要传递到的RESTendpoint。

在我看来不错。也许我不会为了省力而实现XSRF令牌。我的意思是,如果有人试图通过CSRF进行攻击,会发生什么最糟糕的事情?他也许能让你刷新你的令牌。但令牌不会仅因为CSRF而暴露给攻击者。

我喜欢你的问题。写得真不错!:)

 类似资料:
  • 我已经阅读了JWT和访问令牌和刷新令牌。我知道您必须在很短的时间(分钟)内设置访问令牌过期,并在过期时使用刷新令牌获取新的访问令牌。 我不清楚三件事: 谁检查访问令牌是否过期?客户端是否通过发送过期的访问令牌和刷新来检查并请求新的访问代码? 谁检查刷新令牌是否过期?(显然刷新令牌也需要过期,尽管需要更长的时间才能过期)。 在我看来,如果刷新令牌过期,则必须提示用户重新登录。在某些情况下(移动应用)

  • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre

  • null 很抱歉太啰嗦了。 提前谢了。

  • 我不熟悉,它代表。我混淆了它的两个术语:访问令牌和刷新令牌。 用户注册/登录站点后,我创建和。 将刷新标记保存在数据库或cookie中。 15分钟后,用户标记访问令牌过期。 如果用户空闲2小时,我将从cookie或DB中删除刷新令牌,否则我将使用刷新令牌续订访问令牌。 有什么优化的方法可以达到这个目的吗?

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 若授权服务器给客户端颁发了刷新令牌,客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起刷新请求: grant_type 必需的。值必须设置为“refresh_token”。 refresh_token 必需的。颁发给客户端的刷新令牌。 scope 可选的。如3.3节所述的访问请求的范