session - Web 应用程序的基于 token 的身份验证 : how to cache token?

标签 session authentication cookies access-token web-storage

我正在尝试将 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/

相关文章:

PHP 自定义 session.serialize_handler JSON

php - 使用 memcached 作为 CodeIgniter 的 session 存储

php - 在 codeigniter 中取消设置一些 session 数据

c# - 没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme Cookies Authentication

javascript - 桌面版 Internet Explorer 11 中的 Instagram 登录字段未激活

javascript - jQuery 无法使用 jquery.cookie 插件读取 cookie

c# - 浏览器关闭时的 Session_End 代码

javascript - 通过 Response.ContentType、Response.End 输出文件时如何显示进度状态/微调器?

php - 子文件夹中设置的 Cookie 未在根目录中设置 - PHP

php - 使用 PHP 从 p12 证书文件中获取信息