JWT认证:cookie与header哪种更好?

29

目前有很多文章讨论在客户端存储JWT的最佳位置。简而言之,它们都涉及以下内容:

  • 仅限HTTP安全Cookie-无法遭受XSS攻击,但容易受到XSRF攻击

  • 头部(保存在本地存储或DOM中)-无法受到XSRF攻击,但容易受到XSS攻击

我认为我想出了一个非常聪明的解决方案,但是,由于我对安全问题完全没有经验,所以我不确定它是否真的聪明或愚蠢。

那么,如果将JWT分割并将其一部分保存在Cookie中,另一部分保存在头部中,会变得不可破解吗?

这也应该解决“注销”问题——删除头部部分将使浏览器无法登录。

1个回答

29

JWT需要保持完整,否则签名验证将无法工作。

防范XSRF很容易,只需另一个cookie即可。

永远不要使用本地存储来存储认证信息,它不遵循与Cookie相同的域和来源规则。在这里阅读更多信息:

https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet#Storage_APIs

免责声明:我在Stormpath工作,我们提供托管式用户管理解决方案,并花费大量时间处理安全问题。我写了两篇博客文章,讨论了JWT和前端认证:

单页应用程序(SPA)的基于令牌的身份验证

https://stormpath.com/blog/build-secure-user-interfaces-using-jwts/


1
但是,为了防止 XSRF 而添加额外的 cookie 意味着需要维护服务器端会话,对吗?如果是这样,那么将 JWT 粘合在一起要简单得多,并且更轻量级。而且,如果只有 JWT 的某些部分存储在本地存储中,那么它对攻击者是否有任何价值? - user656449
3
CSRF token不需要存储。在登录期间设置一个随机CSRF cookie,并在JS中将其值复制到标头中。在服务器端验证cookie和标头值是否匹配。这依赖于只有您自己域上的JS才能读取cookie值的事实。参考链接:https://en.wikipedia.org/wiki/Cross-site_request_forgery#Cookie-to-header_token - Sampo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接