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

Posted

技术标签:

【中文标题】Web 应用程序的基于令牌的身份验证:如何缓存令牌?【英文标题】:Token-based authentication for web app: how to cache token? 【发布时间】:2014-06-04 18:54:36 【问题描述】:

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

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

我研究的第一个有前途的途径是浏览器会话存储,但是,据我所知,这甚至不会跨标签共享,这意味着如果用户使用新标签点击来自网站的链接,他们将必须重新登录。

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

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

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

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

【问题讨论】:

我和你一样的情况,你找到解决办法了吗?我认为唯一的解决方案是使用启用了安全标志的 cookie 来防止一些攻击。我同意你的看法,这不是一个很好的解决方案,但目前是我唯一的解决方案。 是的,这也是我采用的方式,因为它最类似于用户从基于会话的身份验证机制中了解的体验。设置安全标志是防止意外以明文形式传输令牌的好主意。确保也使用 HTTPS。 【参考方案1】:

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 的情况下,黑客仍然可以使用 set httpOnly cookie 来处理恶意请求(类似于 CSRF)。所以这里没有明确的赢家。最安全的方法是不在客户端存储令牌。

【讨论】:

以上是关于Web 应用程序的基于令牌的身份验证:如何缓存令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌

基于令牌的身份验证中的会话

如何使用被盗令牌防止 Rest Web 服务身份验证

如何使用 Apache Shiro 实现基于 JWT 令牌的身份验证机制?

Web API 中基于令牌的身份验证,无需任何用户界面

如何跨不同 API 对 JSON Web 令牌 (JWT) 进行身份验证?