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

时间:2020-07-20 15:46:40

标签: security cookies authorization token

我正在制作SPA,并决定使用JWT进行身份验证/授权,并且我读了一些有关令牌与Cookie的博客。我了解Cookie授权的工作原理,并了解基本令牌授权的工作原理。问题是,我看不到刷新令牌如何适合它,对我而言似乎降低了安全性。让我来解释一下,

Cookie方法

通过用户名和密码对用户进行身份验证时,您将创建与该用户关联的会话ID。并将其设置为cookie,每次客户端调用您的服务器时,它将发送该cookie,然后服务器可以在数据库或其他服务器端存储中查找关联的用户。

  • 这种方法容易受到CSRF(跨站点请求伪造)的影响。为了防止CSRF,您可以将令牌与cookie一起使用

  • 服务器还需要不断查找存储以查看Cookie指向的用户。

令牌方法

当您通过用户名和密码对用户进行身份验证时,您将创建一个签名的令牌,并在有效载荷中带有到期日期,电子邮件地址或用户ID,角色等。为了安全起见,令牌应具有较短的到期时间。令牌可以存储在本地存储,会话存储,cookie的任何位置。我将使用本地存储或会话存储来防止XSRF。

  • 这容易受到XSS(跨站点脚本)的影响,但是您可以通过验证HTML输入来防止这种情况。
  • 由于令牌的生命周期较短,因此令牌到期后,用户必须再次登录。

访问令牌和刷新令牌

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

  • 让我说我将访问令牌存储在本地存储中。如果我还将刷新令牌存储在本地存储中,则看不到有任何用处。因为如果攻击者可以访问本地存储并获取访问令牌,那么他也可以获取刷新令牌。因此,在这种情况下,为什么不只是让Access令牌长期存在。
  • 如果将刷新令牌存储为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 个答案:

答案 0 :(得分:1)

关于访问令牌和刷新令牌

将访问令牌视为“脏”令牌。令牌共享很多。我不必是将令牌传递到的一台服务器,可以很多。因此,攻击面上升。如果一台服务器做一些愚蠢的事情,例如将令牌写入服务器日志,然后再将日志公开,那么您想限​​制负面影响,因此访问令牌的寿命很短,以限制攻击者执行恶意操作的时间。

另一方面,刷新令牌是“干净”令牌。您存储的东西可以记住并仅在必要时使用。当然,如果攻击者获得了对您的计算机和用户代理的物理访问权,那么它就结束了。但是在这里,我们试图保护免受远程攻击者的攻击。仅当与身份验证服务器或身份验证端点对话时,才应使用刷新令牌。如果您决定将其设置为cookie,则可以-只需记住将目录路径限制为仅将令牌传递到REST端点即可。

关于您的解决方案

在我看来不错。也许我不会为了节省精力而实现XSRF令牌。我的意思是,如果有人尝试对CSRF进行攻击,最糟糕的事情是什么?他也许能够使您刷新令牌。但是令牌不会仅由于CSRF而暴露给攻击者。

还有一件事

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