基于令牌的Web应用程序身份验证:如何缓存令牌?

Bad*_*ion 5 authentication cookies session web-storage access-token

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

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

我研究的第一个有希望的途径是浏览器会话存储,但据我所知,即使跨标签也不会共享,这意味着如果用户使用新标签跟踪网站的链接,他们将不得不登录再次.

还有本地存储,但是我希望用户在关闭浏览器时自动注销,而且我对存储中的令牌也感到有些不安,即使我将它们在服务器端到期.它看起来似乎不洁净.

另一种方法是将令牌存储在会话cookie中,这意味着它会在浏览器关闭时被杀死,并且可以跨选项卡共享.这几乎是理想的,除了cookie当然会在每次去服务器的时候通过线路发送,如果可能的话我想避免.尽管这不是安全问题,但通过cookie以及HTTP Authorization标头发送它似乎是多余的.我已经考虑过将cookie路径设置为我域上不存在的路径,但这不仅仅是美的一个缩影......

因此,面对三个非最佳解决方案,我再次求助于SO.你们是怎么做到的?什么是最好的方式?

tl; dr在单页面Web应用程序中持久化身份验证令牌的规范方法是什么?

ppl*_*ski 0

t;dr 我用来localStorage存储令牌。

我用于localStorage在客户端存储令牌。您可以在我的文章中查看我的实现细节:React Token Based Authentication to Django REST API Backend

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

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