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



我正在制作SPA,并决定使用JWT进行身份验证/授权,我还阅读了一些关于令牌与Cookie的博客。我了解cookie授权的工作原理,也了解基本令牌授权的工作方式。问题是,我不知道刷新令牌是如何融入其中的,在我看来它降低了安全性。让我解释一下,在我看来:

Cookie方法

当您通过username&密码,则创建与该用户关联的会话ID。并将其设置为cookie,每次客户端调用您的服务器时,它都会发送该cookie,服务器可以在数据库或其他服务器端存储中查找关联的用户。

  • 这种方法容易受到CSRF(跨站点请求伪造(的攻击。为了防止CSRF,您可以使用带有cookie 的令牌

  • 服务器还需要不断查找存储,以查看cookie指向哪个用户。

代币方法

当您通过username&密码,您可以创建一个签名的令牌,有效载荷中包含到期日期、电子邮件地址或用户ID、角色等。对于安全令牌,应具有较短的到期时间。令牌可以存储在任何地方本地存储、会话存储、cookie。我将使用本地存储或会话存储来防止XSRF。

  • 这易受XSS(跨站点脚本(攻击,但您可以通过验证HTML输入来防止这种情况
  • 由于令牌的生命周期很短,当令牌过期时,用户必须再次登录

访问令牌&刷新令牌

所以我想使用刷新令牌来防止用户需要不断登录。比方说,在身份验证上,我给用户访问令牌和刷新令牌,当用户访问令牌到期时,用户可以使用刷新令牌来获得新的访问令牌,这是我没有得到的

  • 假设我将访问令牌存储在本地存储中。如果我也在本地存储中存储Refresh令牌,我看不出它有任何用处。因为如果攻击者可以访问本地存储并获得access令牌,他也可以获得Refresh代币。那么在这种情况下,为什么不让Access代币长期存在呢
  • 如果您将Refresh令牌存储为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令牌后,它停止工作,服务器会发布新令牌(你觉得这个实现怎么样在我看来,这限制了服务器对数据库的查找,因为它使用访问令牌,访问令牌的使用寿命很短,用户不必经常登录,因为它是使用刷新令牌/cookie的,受XSRF令牌保护。

这样可以吗

谢谢!

关于访问令牌和刷新令牌

考虑访问令牌是";脏的";代币代币你分享很多。我不必是一个服务器你传递令牌,可以是多个。因此,攻击面上升。如果一台服务器做了一些愚蠢的事情,比如在服务器日志中写入令牌,然后将日志暴露给世界,那么您希望限制负面影响,因此访问令牌是短暂的,以限制攻击者进行恶意操作的时间。

另一方面,刷新令牌是"刷新令牌";"干净";代币你为自己储存的东西,只有在必要的时候才能记住和使用。当然,如果攻击者获得了对您的计算机和用户代理的物理访问权限,那么游戏就结束了。但在这里,我们试图保护自己免受远程攻击者的攻击。刷新令牌应仅在与身份验证服务器或身份验证端点进行通信时使用。如果您决定将其作为cookie(可以(,只需记住将目录路径限制为令牌要传递到的REST端点。

关于您的解决方案

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

还有一件事

我喜欢你的问题。它写得真的很好!:(

相关内容

  • 没有找到相关文章

最新更新