我已经对围绕这个的"最佳实践"进行了大量的研究,并在博客文章之后阅读了博客文章,在SO问题之后阅读了SO问题,在OWASP文章之后阅读了OWASP文章.我已经得到了一些明确的答案,但有些未知数.
首先,"做":
现在我开始假设拥有一个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验证.这种复杂情况令我担心,因为我不知道我是否能准确预见到这里的安全隐患.
总结一下上面的一系列想法:
我有什么理由不想采取这种方法吗?我假设如果我在我的SPA上使用XSS是一个严重的风险,那么我需要一个经典的登录页面进行身份验证以设置正确的cookie,因为如果我通过SPA进行身份验证,那么任何XSS攻击都可能会拦截它(两者都有)在手机和桌面上)!但是,在移动设备上,我需要将JWT注入到SPA中,可能通过一些自定义DOM元素(元标记?),但此时我可以让SPA执行登录,而不是将XSS视为移动设备上的威胁.Cordova将所有资产打包到安装包中,这样有点好,但为什么不在桌面版上采用相同的方法呢?
我的应用程序只需很少的用户输入,它主要是一个仪表板/报告工具.将有一个"消息中心",但它的内容应始终由用户创建(仅由该用户创建)并进行消毒.在我的用例中,是否可以偏离"最佳实践"并依赖localStorage不计算XSS作为我的SPA的严重风险?这将简化整个过程(按原计划使用HTML5 sessionStorage)并降低复杂性,这将减少潜在安全性失误的攻击面.我只想确保在继续前进之前了解风险.
除了通过构建移动本机应用程序而不使用Cordova将我的SPA转换为移动应用程序之外,还有其他安全方法可以使其安全吗?我讨厌这种情况,但它可能很好.
我很感激所有关于此事的想法!
我的应用需要登录,而且我有Remember username and password能力.然后存储用户名和密码
localStorage.setItem('username',username);
这种存储用户名和密码的方式有多安全?我特别在Android上担心的是,如果其他应用程序可以访问数据并且可以获取登录信息.
该应用程序适用于iOs和Android,我正在使用PhoneGap 2.9.