【问题标题】:Where do I store the refresh token and access token and how do I use it?我在哪里存储刷新令牌和访问令牌以及如何使用它?
【发布时间】:2021-08-09 07:39:27
【问题描述】:

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

我理解的认证过程如下。

  1. XSS 可以使用 cookie 进行防御。
  2. 使用 cookie 容易受到 CSRF 的攻击。
  3. 但是,对于 cookie,它可以作为“document.cookie”被盗。因此,请使用“httponly”选项来阻止来自 javascript 的访问。
  4. cookie 在发出 http 请求时总是包含在 header 中,因此容易受到 CSRF 的攻击。所以,登录时,'refresh token'和'access token'会在后端创建,存储在DB中,然后返回给客户端。李>
  5. 使用访问令牌请求 api,如果过期,使用刷新令牌进行更新。

我参考了很多文章,都说XSS要用cookies来阻止,CSRF要用refresh tokens和access tokens来保护。

在刷新令牌的情况下,它存储在webStorage中。

但是,为了防止XSS,似乎在访问令牌的情况下,应该使用cookie来保护它们(+ httponly应用),而在刷新令牌的情况下,似乎应该将它们存储在客户。

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


总之……

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

任何想法都将不胜感激。

【问题讨论】:

  • 我都在正文中发送 - 但是,如果您要将它们作为 http-only cookie 发送,虽然它们无法在客户端代码中访问,但它们将在未来的请求中发送(只要当然,当您在请求中发送 cookie 时)
  • @JaromandaX 感谢您的想法。你在哪里发送令牌到正文并存储访问令牌?
  • 我在正文中从服务器发送令牌。我在客户端存储访问令牌

标签: javascript node.js cookies jwt token


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2021-07-16
    • 2021-09-13
    • 2021-01-23
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    相关资源
    最近更新 更多