我已经对"最佳实践和#34;进行了大量研究。围绕这个并且在博客文章之后阅读博客文章,SO问题之后的SO问题,以及OWASP文章之后的OWASP文章。我已经得到了一些明确的答案,但有一些未知数。
首先,"做":
现在我开始假设拥有一个SPA(使用Angular构建)并使用HTML5 sessionStorage对于短期令牌来说足够安全,但是有一点可以说是XSS攻击可能来自&#34 ;坏演员"起源于从CDN加载的许多库中的一个。
对于我的特定用例,我不计划使用长期令牌 - 在不使用10分钟后过期但我仍然想知道我是否要按会话跟踪过期或使用刷新令牌 - StormPath推荐前者(不再是无状态?)但我相信使用JWT的大玩家使用刷新令牌(谷歌使用它们但声明你需要将它们存储在安全的长期存储中,这意味着HTML5 localStorage再次出现问题)
我想这样做,以便我的用户在刷新页面时不必重新登录(因此需要在客户端存储令牌)。我还想将我的SPA用作移动应用程序"在科尔多瓦的帮助下。这里显而易见的缺陷是,如果我使用cookie,Cordova没有烘焙cookie支持/存储,我要求转而使用HTML5本地存储。因为在移动设备上我并不需要担心刷新页面,所以我可以让我的令牌存在于内存中,并以我所采取的策略过期。
如果我采用这种方法,桌面上基于cookie的JWT," Bearer"移动设备上的标头,我现在需要一个认证端点,它将以两种不同的方式提供令牌,当我在REST API端授权时,我需要支持基于cookie的JWT(带有CSRF)和基于头的JWT验证。这种复杂情况令我担心,因为我不知道我是否能准确预见到安全问题。
总结一下上面的一系列想法:
我有什么理由不想采用这种方法吗?我认为如果我在SPA上使用XSS是一个严重的风险,那么我需要一个经典的登录页面用于设置正确cookie的身份验证,因为如果我通过SPA进行身份验证,那么任何XSS攻击都可能会拦截(在移动设备和桌面上)!但是,在移动设备上,我需要将JWT注入SPA,可能通过一些自定义DOM元素(元标记?),但此时我可以让SPA执行登录而不考虑XSS是一个威胁移动设备。 Cordova将所有资产打包到安装包中,以便更好一点,但为什么不在桌面版上采用相同的方法呢?
我的应用程序只需很少的用户输入,它主要是一个仪表板/报告工具。将有一个"消息中心"但它的内容应始终由用户创建(仅由该用户创建)并进行消毒。 在我的用例中,是否可以偏离"最佳实践"并依赖localStorage不计算XSS作为我的SPA的严重风险?这将简化整个事情(使用最初计划的HTML5 sessionStorage)并降低复杂性,这将减少潜在安全性失误的攻击面。我只想确保在继续前进之前了解风险。
除了通过构建移动设备的本机应用程序而不使用Cordova将我的SPA转换为移动应用程序之外,还有其他方法可以确保安全吗?我讨厌这样做是这样的,但它可能很好。
我很欣赏有关此事的所有想法!
答案 0 :(得分:2)
在考虑设计基于javascript的跨平台应用程序来运行移动设备时,许多关于设计基于Web浏览器的常规应用程序的注意事项并不一定适用。
就安全性而言,无论您决定使用JWT还是简单的OAuth令牌,请确保所有通信均通过https进行。
请尽可能多地使用localStorage。 如果你考虑一个http请求的解剖,它真的是发送一些基于文本的消息分成多个部分到服务器。请求的标头不比包括cookie在内的任何其他部分更安全。因此,从安全角度来看,兴趣点是令牌的生成/验证/无效,设备上令牌的存储以及请求的传输机制。
如何在设备上存储令牌受限于设备操作系统为您提供的功能。关于使用原生应用程序是否优于跨平台应用程序,我认为创建一个native-cordova插件可以使用任何特定的本机策略来存储您的令牌,如果一个人不满意开箱即用#34;一些(如本地存储)是可能的,虽然根据我的经验,这通常是矫枉过正。如果有人有不同的经历,很高兴在这个问题上得到纠正。
对于所有Web服务端点通信,请毫无例外地使用HTTPS ALWAYS。 HTTPS是万无一失的,不,但你不会因为专门的窃贼学会选择锁而没有前门而建造房屋。这大大确保了运输机制。
通常,无论如何,这都是本机应用程序必须使用的。