我在哪里存储刷新令牌和访问令牌以及如何使用它?

时间:2021-05-20 04:01:36

标签: javascript node.js cookies jwt token

我无法轻易决定如何从后端接收刷新令牌和访问令牌以及将其存储在哪里。

我理解的认证流程如下。

  1. XSS 可以用 cookie 来防御。
  2. 使用 cookie 容易受到 CSRF 的攻击。<​​/li>
  3. 然而,在cookie的情况下,它可以作为'document.cookie'被盗。因此,请使用“httponly”选项来阻止来自 javascript 的访问。
  4. cookie 在发起 http 请求时总是包含在 header 中,因此它容易受到 CSRF 的攻击。因此,在登录时,“刷新令牌”和“访问令牌”在后端创建,存储在数据库中,并返回给客户端。立>
  5. 使用访问令牌请求 api,如果它过期,使用刷新令牌更新它。

我参考了很多文章,都说XSS要用cookies屏蔽,CSRF用refresh token和access token保护。

如果是刷新令牌,则存储在 webStorage 中。

然而,为了防止XSS,似乎在access token的情况下,应该使用cookies来保护它们(+httponly apply),而在refresh token的情况下,似乎应该将它们存储在客户。

如果刷新令牌是在带有 httponly 选项的 cookie 中发送的,它是否可以从客户端访问?


总结...

在后端服务器中,是否应该将访问令牌作为 cookie 发送,并将刷新令牌包含在正文中?

任何想法将不胜感激。

1 个答案:

答案 0 :(得分:0)

令牌通常在响应正文中发回。通过这种方式,您的前端应用程序可以轻松读取它们并在需要的地方存储。通常将它们存储在内存中就足够了(在应用程序的变量或状态等中)。当用户刷新页面时,他们将不得不再次登录,但如果授权服务器支持“记住我”之类的内容,这应该不是问题。如果您使用的是符合 OpenID Connect 的授权服务器,那么您可以执行静默登录 - 因此无需将用户重定向到任何地方即可获取令牌。

如果您将令牌存储在仅限 http 的 cookie 中,那么您的应用将无法访问它们,因此您将无法从您的应用调用任何 API。我认为这不是您想要实现的目标。

将令牌保存在内存中可以帮助您更安全地免受 XSS 攻击,但您永远不会 100% 安全。看看这个演讲:https://pragmaticwebsecurity.com/talks/xssoauth.html 解释的地方。事实上,确保 XSS 攻击无法窃取您的令牌的唯一方法是将令牌保存在后端应用程序中,而不是保存在浏览器中。