访问令牌和刷新令牌最佳实践?如何实现访问和刷新令牌
Access token and Refresh token best practices ? How to implement Access & Refresh Tokens
我正在制作 SPA,并决定将 JWT 用于 Authentication/Authorization,并且我阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本令牌授权的工作原理。问题是,我看不到刷新令牌如何适合它,在我看来它会降低安全性。让我解释一下,如我所见:
Cookie 方法
当您通过用户名和密码对用户进行身份验证时,您会创建与该用户关联的会话 ID。并将其设置为 cookie,每次客户端调用您的服务器时,它都会发送该 cookie,并且服务器可以在数据库或其他服务器端存储中查找关联的用户。
这种方式容易受到CSRF(Cross Site Request Forgery)的攻击 为了防止CSRF 你可以使用token with cookie
服务器还需要不断查找存储以查看 cookie 指向的用户。
令牌方法
当您通过用户名和密码对用户进行身份验证时,您会创建一个签名令牌,在有效负载中包含到期日期、电子邮件地址或用户 ID、角色等。对于安全令牌,应该有较短的到期时间。令牌可以存储在任何地方本地存储、会话存储、cookie。我将使用本地存储或会话存储来防止 XSRF。
- 这容易受到 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 令牌后,它会停止工作,服务器会发布新的)。 您如何看待这个实现?在我看来,这限制了服务器对数据库的查找,因为它使用访问令牌,访问令牌是短暂的,并且用户不必经常登录,因为它使用刷新 token/cookie 受 XSRF 令牌保护。
这样可以吗?
谢谢!
关于访问令牌和刷新令牌
将访问令牌视为“脏”令牌。令牌你分享了很多。我不必是您将令牌传递给的一台服务器,可以是很多台。因此,攻击面上升。如果一台服务器做了一些愚蠢的事情,比如将令牌写入服务器日志,然后将日志暴露给世界,你想限制负面影响,因此访问令牌是短暂的,以限制攻击者可以做一些恶意的事情的时间。
另一方面,刷新令牌是“干净”令牌。您为自己存储的东西,仅在必要时才使用它。当然,如果攻击者获得了对您的计算机和用户代理的物理访问权限,那么游戏就结束了。但在这里,我们试图防止远程攻击者。刷新令牌只应在与 auth 服务器或 auth 端点对话时使用。如果您决定将其设为 cookie - 您可以 - 请记住将目录路径限制为令牌要传递到的 REST 端点。
关于您的解决方案
我觉得不错。也许我不会为了省力而实施 XSRF 令牌。我的意思是,如果有人试图通过 CSRF 进行攻击,最糟糕的情况是什么?他也许能让你刷新你的令牌。但是令牌不会仅仅因为 CSRF 而暴露给攻击者。
还有一件事
我喜欢你的问题。真的写的很好! :)
我正在制作 SPA,并决定将 JWT 用于 Authentication/Authorization,并且我阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本令牌授权的工作原理。问题是,我看不到刷新令牌如何适合它,在我看来它会降低安全性。让我解释一下,如我所见:
Cookie 方法
当您通过用户名和密码对用户进行身份验证时,您会创建与该用户关联的会话 ID。并将其设置为 cookie,每次客户端调用您的服务器时,它都会发送该 cookie,并且服务器可以在数据库或其他服务器端存储中查找关联的用户。
这种方式容易受到CSRF(Cross Site Request Forgery)的攻击 为了防止CSRF 你可以使用token with cookie
服务器还需要不断查找存储以查看 cookie 指向的用户。
令牌方法
当您通过用户名和密码对用户进行身份验证时,您会创建一个签名令牌,在有效负载中包含到期日期、电子邮件地址或用户 ID、角色等。对于安全令牌,应该有较短的到期时间。令牌可以存储在任何地方本地存储、会话存储、cookie。我将使用本地存储或会话存储来防止 XSRF。
- 这容易受到 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 令牌后,它会停止工作,服务器会发布新的)。 您如何看待这个实现?在我看来,这限制了服务器对数据库的查找,因为它使用访问令牌,访问令牌是短暂的,并且用户不必经常登录,因为它使用刷新 token/cookie 受 XSRF 令牌保护。
这样可以吗?
谢谢!
关于访问令牌和刷新令牌
将访问令牌视为“脏”令牌。令牌你分享了很多。我不必是您将令牌传递给的一台服务器,可以是很多台。因此,攻击面上升。如果一台服务器做了一些愚蠢的事情,比如将令牌写入服务器日志,然后将日志暴露给世界,你想限制负面影响,因此访问令牌是短暂的,以限制攻击者可以做一些恶意的事情的时间。
另一方面,刷新令牌是“干净”令牌。您为自己存储的东西,仅在必要时才使用它。当然,如果攻击者获得了对您的计算机和用户代理的物理访问权限,那么游戏就结束了。但在这里,我们试图防止远程攻击者。刷新令牌只应在与 auth 服务器或 auth 端点对话时使用。如果您决定将其设为 cookie - 您可以 - 请记住将目录路径限制为令牌要传递到的 REST 端点。
关于您的解决方案
我觉得不错。也许我不会为了省力而实施 XSRF 令牌。我的意思是,如果有人试图通过 CSRF 进行攻击,最糟糕的情况是什么?他也许能让你刷新你的令牌。但是令牌不会仅仅因为 CSRF 而暴露给攻击者。
还有一件事
我喜欢你的问题。真的写的很好! :)