JWT无状态登录与安全cookie存储:如何实现注销?

时间:2016-10-19 08:29:40

标签: javascript security single-sign-on single-page-application jwt

我开始实施基于JWT的单点登录系统(针对同一域下的多个单页应用,所以类似app1.mydomain.comapp2.mydomain.comauth.mydomain.com)使用这些机制在this article from Stormpath中描述。

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

我的主要问题是我们如何实施"退出" JavaScript中的功能,因为根据设计,cookie无法从JS代码访问?

我猜我必须进行一次服务器调用才能使cookie过期。是否有纯粹的客户端方式来做到这一点?

1 个答案:

答案 0 :(得分:2)

最好的方法是像JEY用户建议的那样进行清理服务器端。

此外,我想对可能性进行扩展,因此这不符合评论。

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

这意味着你不保存任何实际的工作,你只是觉得如果你确实受到XSS的攻击,至少令牌是安全的。

另一方面,通过使用cookie,CSRF现在需要在您的雷达上,这里的事情可能会变得有趣,一些防止CSRF的简单方法,如双提交cookie,{{3例如,在子域中。

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

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

鉴于您提到子域中的多个应用程序,需要注意以下事项:

  

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

(重点是我的,来源:在哪里存储代币? implemented in such ways that they are virtually useless in the presence of exploitable XSS vulnerabilities部分)

披露:我是Auth0工程师。)