我正在尝试将 Web 应用程序从“传统”基于 cookie 的身份验证机制切换为纯粹基于 token 的身份验证机制。客户端收到 token 后应进行缓存以减少开销。存储 token 的最佳方式是什么?
这是我从谷歌搜索中学到的:
我研究的第一个有希望的途径是浏览器 session 存储,但是,据我所知,即使跨选项卡也不会共享,这意味着如果用户使用新选项卡点击来自网站的链接,他们将不得不登录再进去。
还有本地存储,但我希望用户在关闭浏览器时自动注销,而且我对存储中的 token 也有点不安,即使我在服务器端使它们过期。只是看起来不干净。
另一种方法是将 token 存储在 session cookie 中,这意味着它会在浏览器关闭时被杀死,并且可以跨选项卡共享。这几乎是理想的,除了 cookie 当然会在每次访问服务器时通过网络发送,如果可能,我想避免这种情况。尽管这不是安全问题,但通过 cookie 以及 HTTP Authorization header 发送它似乎是多余的。我曾考虑将 cookie 路径设置为我的域中不存在的路径,但这也不完全是美的缩影......
因此,面对三个非最佳解决方案,我再次向 SO 寻求帮助。你们是怎么做的?最好的方法是什么?
tl;dr 在单页 Web 应用程序中持久化身份验证 token 的规范方法是什么?
最佳答案
t;dr 我正在使用 localStorage
存储 token 。
我正在使用 localStorage
用于在客户端存储 token 。你可以在我的文章中看到我的实现细节:React Token Based Authentication to Django REST API Backend .localStorage
跨选项卡共享 token ,并且在您关闭选项卡时不会消失。 localStorage
中的数据坚持直到明确删除。 sessionStorage
中的数据 session 结束时删除。
网上有一些讨论localStorage
是不安全的,因为在 XSS 的情况下攻击,黑客可以从中读取所有数据。这是真的。有一些讨论认为 httpOnly cookie 更好地存储 token ,因为黑客无法从 httpOnly cookie 访问和读取 token 。确实如此,但误解是 cookie 并不能阻止 XSS(即使您使用 httpOnly cookie 也可能发生 XSS)。更重要的是,cookies 启用 CSRF攻击。并且,在 XSS 的情况下,黑客仍然可以使用 set httpOnly cookie 进行恶意请求(类似于 CSRF)。所以这里没有明显的赢家。最安全的方法是不在客户端存储 token 。
关于session - Web 应用程序的基于 token 的身份验证 : how to cache token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185033/