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

som*_*ne1 18 cookies rest jwt angularjs 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转换为移动应用程序之外,还有其他安全方法可以使其安全吗?我讨厌这种情况,但它可能很好.

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

Obi*_*Obi 2

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

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

请尽可能多地使用 localStorage。如果您考虑一下 http 请求的结构,它实际上就是向服务器发送一些基于文本的消息,分为多个部分。请求的标头并不比请求的任何其他部分(包括 cookie)更安全。因此,从安全角度来看,关注点是令牌的生成/验证/失效、令牌在设备上的存储以及请求的传输机制。

  1. 生成/验证/失效:在您的服务器上生成令牌。使用一些技术/策略来确保不存在碰撞或出血的可能性。另外,请确保您的策略允许您使服务器上的令牌无效,然后在进一步使用该令牌时拒绝访问服务器请求的数据。当服务器拒绝访问资源时,您就可以在应用程序中处理用户的 UI 旅程。
  2. 您在设备上存储令牌的方式受到设备操作系统向您提供的可用内容的限制。关于使用本机应用程序是否比跨平台更好,我认为如果对“开箱即用”的(例如本地存储)不满意,创建一个本机科尔多瓦插件来使用任何特定的本机策略存储您的令牌是有可能,尽管根据我的经验,这通常是矫枉过正的。如果有人有不同的经历,很高兴对此进行纠正。

  3. 对于所有 Web 服务端点通信,请始终使用 HTTPS,无一例外。HTTPS 是万无一失的吗?不,但是您不会仅仅因为专门的窃贼可以学会撬锁而建造没有前门的房子。这大大保证了传输机制的安全。

通常,这也是所有本机应用程序都必须使用的。