使用安全cookie存储的JWT无状态登录:如何实现注销

JWT stateless sign-on with secure cookie storage : how to implement log out?

本文关键字:何实现 注销 实现 登录 状态 cookie 安全 存储 JWT      更新时间:2023-09-26

我开始使用Stormpath文章中描述的机制实现基于JWT的单点登录系统(用于同一域下的几个单页应用程序,例如app1.mydomain.com, app2.mydomain.com, auth.mydomain.com)。

为了保护我的签名JWT令牌免受XSS攻击,我想将令牌存储在安全的(仅HTTPS)和仅http的cookie中。SPA本身将从响应体中获取用户信息。

我的主要问题是我们如何在JavaScript中实现"注销"功能,因为cookie是,按照设计,不能从JS代码访问?

我猜我将不得不做一个服务器调用,将过期的cookie。是否有一种纯客户端的方式来做到这一点?

最好的方法是按照用户JEY的建议在服务器端进行清理。

另外,我想在可能性上扩展位,所以它不适合注释。

在处理基于浏览器的应用程序时,选择令牌存储几乎是一个选择你的毒药游戏。如果使用安全的仅http cookie,则不必担心XSS漏洞导致令牌泄露。但是,由于其他一系列原因,您仍然必须确保不容易受到XSS的攻击。

这意味着你没有节省任何实际的工作,你只是有一种模糊的感觉,如果你被XSS攻击了,至少令牌是安全的。

另一方面,通过使用cookie, CSRF现在需要在您的雷达上,这是事情可能变得有趣的地方,一些防止CSRF的琐碎方法,如双重提交cookie,可以以这样的方式实现,它们实际上是无用的,例如在子域中存在可利用的XSS漏洞。

我并不是说在cookie中存储令牌是完全错误的,它不是,同样地,将它们存储在Web存储中也是可以接受的。在这两种情况下,你都需要了解你的选择的后果和每一个选择带来的可能性。

在这种情况下,Web存储将从客户端角度简化注销场景,因此您需要问自己哪一组优点和缺点更适合您的场景。

鉴于您提到了子域中的多个应用程序,需要注意的一件事是:

使用基于令牌的验证,您可以选择在哪里存储JWT。通常,JWT放在浏览器的本地存储中,这对于大多数用例都很有效。在本地存储中存储jwt需要注意一些问题。与cookie不同,本地存储被沙盒化到特定的域,其数据不能被任何其他域(包括子域)访问。

(重点是我的,来源:在哪里存储令牌? cookie vs Tokens:权威指南

(披露:我是Auth0工程师。)