繁体   English   中英

如何使用Cordova保护SPA和移动应用程序的REST API

[英]How to secure REST API for SPA and Mobile App using Cordova

我已经对围绕这个的“最佳实践”进行了大量的研究,并在博客文章之后阅读了博客文章,在SO问题之后阅读了SO问题,在OWASP文章之后阅读了OWASP文章。 我已经得到了一些明确的答案,但有些未知数。

首先,“做”:

  1. 使用JWT在我的REST API上授权用户[1] [2]
  2. 将JWT存储在HTTPOnly / Secure cookie中并构建CSRF保护。 不要存储在HTML5本地存储[3] [4] [5]中 (实际上,这一点值得商榷,是否更容易防范XSS或CSRF? [6]
  3. 验证JWT的签名方法[7]

现在我开始假设拥有一个SPA(使用Angular构建)并使用HTML5 sessionStorage对于短期令牌来说足够安全,但有一点可以说XSS攻击可能来自一个源自“坏角色”的“坏角色”从CDN加载的许多库之一。

对于我的特定用例,我不计划使用长期令牌 - 在不使用10分钟后过期但我仍然想知道我是否要通过会话跟踪到期或使用刷新令牌 - StormPath推荐前者(不再是无国籍?)但我相信使用JWT的大玩家使用刷新令牌(谷歌使用它们但声明你需要将它们存储在安全的长期存储中,这意味着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转换为移动应用程序之外,还有其他方法可以确保安全吗? 我讨厌这种情况,但它可能很好。

我很感激所有关于此事的想法!

在考虑设计基于javascript的跨平台应用程序来运行移动设备时,许多关于设计基于Web浏览器的常规应用程序的注意事项并不一定适用。

就安全性而言,无论您决定使用JWT还是简单的OAuth令牌,都要确保所有通信都通过https进行。

请尽可能多地使用localStorage。 如果你考虑一个http请求的解剖,它真的是发送一些基于文本的消息分成多个部分到服务器。 请求的标头不比包括cookie在内的任何其他部分更安全。 因此,从安全角度来看,兴趣点是令牌的生成/验证/无效,令牌在设备上的存储以及请求的传输机制。

  1. 生成/验证/失效:在服务器上生成令牌。 使用一些技术/策略确保不会发生碰撞或流血。 此外,请确保您的策略允许您使服务器上的令牌无效,然后在进一步使用令牌时拒绝访问服务器请求的数据。 然后由您的应用程序决定在服务器拒绝访问资源时处理用户UI之旅。
  2. 如何将令牌存储在设备上受限于设备操作系统为您提供的功能。 关于使用本机应用程序是否优于跨平台应用程序,我认为创建一个native-cordova插件来使用任何特定的本机策略来存储您的令牌,如果对“开箱即用”(例如本地存储)不满意的话可能,虽然根据我的经验,这通常是矫枉过正。 如果有人有不同的经历,很高兴在这一个纠正。

  3. 对于所有Web服务端点通信,请毫无例外地使用HTTPS ALWAYS。 HTTPS是万无一失的,不,但是你不会因为专门的窃贼可以学会选择锁来建造一个没有前门的房子。 这大大保证了运输机制。

通常,无论如何,这都是本机应用程序必须使用的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM