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

Javascript 我在哪里存储刷新令牌和访问令牌,以及如何使用它?,javascript,node.js,cookies,jwt,token,Javascript,Node.js,Cookies,Jwt,Token,我无法轻松决定如何从后端接收刷新令牌和访问令牌以及将其存储在何处 我理解的认证过程如下 XSS可以用cookie进行防御 使用cookie容易受到CSRF的攻击 但是,在cookie的情况下,它可以作为“document.cookie”被盗。因此,使用“httponly”选项来阻止javascript的访问 发出http请求时,cookie始终包含在标头中,因此容易受到CSRF的攻击。因此,在登录时,“刷新令牌”和“访问令牌”在后端创建,存储在数据库中,并返回到客户端 使用访问令牌请求api,如

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

我理解的认证过程如下

  • XSS可以用cookie进行防御
  • 使用cookie容易受到CSRF的攻击
  • 但是,在cookie的情况下,它可以作为“document.cookie”被盗。因此,使用“httponly”选项来阻止javascript的访问
  • 发出http请求时,cookie始终包含在标头中,因此容易受到CSRF的攻击。因此,在登录时,“刷新令牌”和“访问令牌”在后端创建,存储在数据库中,并返回到客户端
  • 使用访问令牌请求api,如果api过期,则使用刷新令牌进行更新
  • 正如我提到的许多文章一样,据说XSS将被cookie阻止,而CSRF将被刷新令牌和访问令牌保护

    对于刷新令牌,它存储在webStorage中

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

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


    总之

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


    如果您有任何想法,我们将不胜感激。

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

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


    将令牌保存在内存中可以帮助您更安全地抵御XSS攻击,但您永远不会100%安全。看一看这个演讲:它是在哪里被解释的。事实上,确保XSS攻击不会窃取您的令牌的唯一方法是将令牌保存在后端应用程序中,而不是浏览器中。

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