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

时间:2014-04-20 16:48:23

标签: session authentication cookies access-token web-storage

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我正在使用localStorage在客户端存储令牌。您可以在我的文章React Token Based Authentication to Django REST API Backend中看到实现的详细信息。

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

互联网上有一些讨论认为localStorage是不安全的,因为在发生XSS攻击时,黑客可以从中读取所有数据。没错有一些讨论认为,最好使用httpOnly cookie来存储令牌,因为黑客无法访问并从httpOnly cookie中读取令牌。的确是这样,但误解是cookie不会阻止XSS(即使您使用httpOnly cookie也会发生XSS)。更重要的是,cookie启用了CSRF攻击。而且,在XSS的情况下,黑客仍然可以使用设置的httpOnly cookie来处理恶意请求(类似于CSRF)。因此,这里没有明确的赢家。最安全的方法是不在客户端存储令牌。