我围绕这一点做了很多关于“最佳实践”的研究,并阅读了一篇又一篇的博客文章,所以一个又一个的问题,以及OWASP文章一篇又一篇。我已经得到了一些明确的答案,但也有一些未知之处。
首先,"Do's":
使用JWT在HTTPOnly/ [2]
的HTML5 [3] [4] [5] (实际上,这一点是有争议的,哪一个更容易保护
现在我开始假设有一个SPA (使用Angular构建)并使用HTML5 sessionStorage对于短暂的令牌来说是足够安全的,但是有一点需要指出的是,XSS攻击可能来自于从CDN加载的许多库中的一个“坏角色”。
对于我的特定用例,我不打算使用长期令牌-不使用10分钟后过期,但我仍在考虑是按会话跟踪过期还是使用刷新令牌- StormPath建议使用前者(不再是无状态的?)但我相信使用JWTs的大玩家使用刷新令牌(谷歌使用它们,但声明您需要将它们存储在安全的长期存储中,这意味着HTML5 localStorage也是不可能的)。
我想让我的用户在刷新页面时不必重新登录(因此需要在客户端存储令牌)。我还想在Cordova的帮助下将我的SPA用作“移动应用程序”。这里明显的缺陷是,如果我使用cookie,Cordova没有内置的cookie支持/存储,所以我被要求改用HTML5本地存储。因为在移动端我真的不需要担心刷新页面,所以我可以让我的令牌留在内存中,并使用我确定的策略过期。
如果我采用这种方法,桌面上基于cookie的JWT,移动设备上的“持有者”头,我现在需要一个身份验证端点,它将以两种不同的方式提供令牌,当我在REST API端授权时,我需要同时支持基于cookie的JWT (使用CSRF)和基于头的JWT验证。这种复杂性让我很担心,因为我不知道我是否能准确地预见到这里的安全隐患。
总结一下上面一连串的想法:
我假设如果我在我的SPA上使用XSS是一个严重的风险,那么我需要一个经典的登录页面来设置正确的cookie,因为如果我通过SPA进行身份验证,那么任何XSS攻击都有可能拦截它(在移动和桌面上)!但是,在移动设备上,我需要将JWT注入到SPA中,可能是通过一些自定义的DOM元素(meta tag?),但在这一点上,我可以让SPA执行登录,而不是将XSS视为移动设备上的威胁。Cordova将所有资产打包到安装包中,这样会更好一些,但是为什么不在桌面版本上采用相同的方法呢?
我的应用程序只需要很少的用户输入,它主要是一个仪表板/报告工具。将会有一个“消息中心”,但它的内容应该始终是用户创建的(仅由该用户创建)并进行消毒。在我的用例中,是否可以背离“最佳实践”并依赖localStorage而不将视为我的SPA的严重风险?这将简化整个过程(按最初计划使用HTML5 sessionStorage )并降低复杂性,从而减少潜在安全错误的攻击面。我只想确保在继续之前了解其中的风险。
除了为移动设备构建一个本地应用程序,而不是使用将我的SPA转换为移动应用程序之外,有没有其他安全的方法来确保这一点?我讨厌这种情况,但它很可能是这样的。
我会感激所有关于这件事的想法!
发布于 2016-10-21 19:49:52
当考虑设计基于javascript的跨平台应用程序来运行移动设备时,设计常规的基于web浏览器的应用程序的许多注意事项并不一定适用。
就安全性而言,无论您决定使用JWT还是简单的OAuth令牌,都要确保所有通信都是通过https进行的。
请尽可能多地使用localStorage。如果你考虑一下http请求的结构,那么它实际上就是将一些基于文本的消息分成多个部分发送到服务器上。请求的头部并不比它的任何其他部分更安全,包括cookie。因此,从安全的角度来看,感兴趣的点是令牌的生成/验证/无效、令牌在设备上的存储以及请求的传输机制。
通常,这也是原生应用程序必须使用的全部内容。
https://stackoverflow.com/questions/32891741
复制相似问题