Session web应用基于令牌的身份验证:如何缓存令牌?

Session web应用基于令牌的身份验证:如何缓存令牌?,session,authentication,cookies,access-token,web-storage,Session,Authentication,Cookies,Access Token,Web Storage,我正在尝试将web应用程序从“传统的”基于cookie的身份验证机制切换到纯粹基于令牌的身份验证机制。一旦客户端接收到令牌,就应该缓存该令牌,以减少开销。存储代币的最佳方式是什么 这是我从谷歌搜索中学到的: 我研究的第一个有希望的途径是浏览器会话存储,然而,据我所知,这甚至在选项卡之间也不共享,这意味着如果用户使用新的选项卡跟踪站点的链接,他们将不得不再次登录 还有本地存储,但我希望用户在关闭浏览器时自动注销,而且我对存储中的令牌也有点不安,即使我让它们在服务器端过期。只是看起来不干净 另一种方

我正在尝试将web应用程序从“传统的”基于cookie的身份验证机制切换到纯粹基于令牌的身份验证机制。一旦客户端接收到令牌,就应该缓存该令牌,以减少开销。存储代币的最佳方式是什么

这是我从谷歌搜索中学到的:

我研究的第一个有希望的途径是浏览器会话存储,然而,据我所知,这甚至在选项卡之间也不共享,这意味着如果用户使用新的选项卡跟踪站点的链接,他们将不得不再次登录

还有本地存储,但我希望用户在关闭浏览器时自动注销,而且我对存储中的令牌也有点不安,即使我让它们在服务器端过期。只是看起来不干净

另一种方法是将令牌存储在会话cookie中,这意味着它在浏览器关闭时被终止,并且可以在选项卡之间共享。它几乎是理想的,除了cookie当然会在每次访问服务器时通过电线发送,如果可能的话,我希望避免这种情况。尽管这不是一个安全问题,但通过cookie以及HTTP授权头发送它似乎是多余的。我曾考虑将cookie路径设置为我的域中不存在的路径,但这也不是美的缩影

因此,面对三个非最优解决方案,我再次求助于So。你们是怎么做到的?最好的办法是什么


tl;dr在单页web应用程序中持久化身份验证令牌的标准方法是什么?t;dr我正在使用
localStorage
存储令牌

我使用
localStorage
在客户端存储令牌。您可以在我的文章中看到我的实现的详细信息:

localStorage
跨选项卡共享令牌,并且在您关闭选项卡时不会消失。
localStorage
中的数据会一直保留,直到显式删除为止。会话结束时,
sessionStorage
中的数据将被删除


互联网上有一些讨论认为,
localStorage
是不安全的,因为在发生攻击的情况下,黑客可以从中读取所有数据。这是真的。有一些讨论认为httpOnly cookie更适合存储令牌,因为黑客无法从httpOnly cookie访问和读取令牌。这是事实,但误解是Cookie不能阻止XSS(即使您使用的是httpOnly Cookie,XSS也可能发生)。更重要的是,Cookie支持攻击。而且,在XSS的情况下,黑客仍然可以对恶意请求使用set-httpOnly cookies(类似于CSRF)。所以这里没有明确的赢家。最安全的方法是不在客户端存储代币。

我的情况与您相同,您找到解决方案了吗?我认为唯一的解决方案是使用启用了安全标志的cookie来防止一些攻击。我同意你的看法,这不是一个很好的解决方案,但目前这是我仅有的解决方案。是的,这也是我的做法,因为它最类似于用户从基于会话的身份验证机制中获得的体验。设置安全标志是一个好主意,可以防止意外地在clear中传输令牌。也一定要使用HTTPS。