【发布时间】:2015-12-29 18:04:47
【问题描述】:
我对围绕此的“最佳实践”进行了大量研究,并阅读了一篇又一篇博客文章、一个又一个问题的 SO 问题,以及一个又一个 OWASP 文章的文章。我已经得出了一些明确的答案,但还有一些未知数。
首先,“做”:
- 使用 JWT 在我的 REST API 上授权用户 [1] [2]
- 将 JWT 存储在 HTTPOnly/Secure cookie 中并内置 CSRF 保护。不要存储在 HTML5 本地存储中[3][4][5](其实这点值得商榷,是不是更容易防范 XSS 或 CSRF?[6])
- 验证JWT[7]的签名方式
现在我开始假设拥有 SPA(使用 Angular 构建)并使用 HTML5 sessionStorage 对于短期令牌来说足够安全,但有一点需要指出,XSS 攻击可能来自“不良行为者” " 源自从 CDN 加载的众多库之一。
对于我的特定用例,我不打算使用长期令牌 - 10 分钟不使用后过期,但我仍在考虑是否要按会话跟踪过期或使用刷新令牌 - StormPath 建议前者(不再是无状态的?),但我相信使用 JWT 的大玩家使用刷新令牌(Google 使用它们,但声明您需要将它们存储在安全的长期存储中,这意味着 HTML5 localStorage 又是不可能的)。
我想这样做,以便我的用户在刷新页面时不必重新登录(因此需要将令牌存储在客户端)。我还想在 Cordova 的帮助下将我的 SPA 用作“移动应用程序”。这里明显的缺陷是,如果我使用 cookie,Cordova 没有内置的 cookie 支持/存储,我被敦促改用 HTML5 本地存储。由于在移动设备上我真的不需要担心刷新页面,我可以让我的令牌存在于内存中,并随着我确定的策略过期。
如果我采用这种方法,桌面上基于 cookie 的 JWT,移动设备上的“Bearer”标头,我现在需要一个身份验证端点,它将以两种不同的方式提供令牌,当我在 REST API 端进行授权时,我需要同时支持基于 cookie 的 JWT(使用 CSRF)和基于标头的 JWT 验证。这种复杂性让我很担心,因为我不知道我是否可以准确地预见到这里的安全隐患。
总结一下上面的思路:
- 创建一个身份验证处理程序,该处理程序将通过 HttpOnly/Secure cookie 将令牌分发到桌面,并通过有效负载分发到移动设备。
- 在我的 REST API 上,支持两种验证方法 - 基于标头和基于 cookie - 包括对基于 cookie 方法的 CSRF 保护。
我有什么理由不想采用这种方法吗?我假设如果我将 SPA 上的 XSS 视为严重风险,那么我需要一个经典的登录页面来进行身份验证设置正确的 cookie,因为如果我通过 SPA 进行身份验证,那么任何 XSS 攻击也可能会拦截它(在移动设备和桌面设备上)!但是,在移动设备上,我需要将 JWT 注入 SPA,可能是通过一些自定义 DOM 元素(元标记?),但那时我可以让 SPA 执行登录,而不认为 XSS 对移动设备构成威胁. Cordova 将所有资产打包到安装包中,这样会更好一些,但为什么不在桌面版本上采用相同的方法呢?
我的应用程序需要很少的用户输入,它主要是一个仪表板/报告工具。将有一个“消息中心”,但其内容应始终由用户创建(仅由该用户创建)并进行清理。 那么在我的用例中,是否可以偏离“最佳实践”并依赖 localStorage 而不是将 XSS 视为我的 SPA 的严重风险?这将简化整个事情(使用 HTML5 sessionStorage按照最初的计划)并降低复杂性,这将减少潜在安全错误的攻击面。我只是想确保在继续之前了解风险。
除了为移动设备构建本机应用程序并且不使用 Cordova 将我的 SPA 转换为移动应用程序之外,没有其他安全方法可以确保安全吗?我不喜欢这样情况,但很可能是这样。
感谢您对此事的所有想法!
【问题讨论】:
-
我有非常相似的问题。你最后做了什么?
-
不要使用 Cordova(原生或回家!) - 在 Secure/HTTPOnly cookie 以及所有请求的标头中使用 JWT(以防止 CSRF)在两个位置检查 JWT。
-
@someone1 你有没有机会看看这个链接 - security.stackexchange.com/questions/100129/…
-
@Gandhi - 感谢您的链接,这是一个有趣的讨论,但我认为它不适用于我的问题。具体来说,我不太担心使用 TLS 来保护我的 API 端点的安全性以及防止暴力破解密码的方法,而是对如何将 JWT 安全地存储在 Cordova 转换的应用程序中更感兴趣。如前所述,我认为如果不将原生组件引入移动应用程序,我认为没有办法做到这一点。
-
@someone1 lol @ 去本地或回家,典型的纯粹主义者,但对于任何阅读本文的人来说都是完全不准确的。如果您对 HTTP 和您尝试使用的 Web 技术以及您在本机应用程序上的存储选项有全面的了解,您将意识到您可以在 cordova 应用程序上实现相同的功能,而无需承担相当大的额外风险,毕竟 http不会因为您从本机应用程序调用而改变,如果您不喜欢 localStorage,请编写一个插件来存储您想要的方式
标签: angularjs cordova rest cookies jwt