单页面应用(SinglePageApplication)通过API调用与外界进行交互。在调用API时,我们通常需要在请求中附加一个访问令牌AccessToken。SPA开发人员需要确保令牌和其他敏感数据不易受到跨站点脚本(XSS)攻击,并且无法被恶意JavaScript读取。Auth0SDK建议将令牌存储在浏览器内存中作为最安全的选项。使用webworker处理令牌的传输和存储是保护令牌的最佳方式,因为webworker与应用程序的其余部分在不同的全局范围内运行。使用Auth0SPASDK,默认存储选项是利用WebWorkers的内存存储。如果WebWorkers由于某种原因无法使用,Auth0建议使用JavaScript闭包来模拟私有方法。使用内存存储作为默认存储选项的Auth0SPASDK,根据令牌类型利用WebWorker和JavaScript闭包。注意:以这种方式存储的访问令牌不会在页面刷新和浏览器选项卡之间提供持久性。浏览器本地存储方案使用浏览器本地存储可以替代需要从iframe检索访问令牌的机制和由于浏览器限制(例如ITP2)而无法实现的基于跨源cookie的身份验证。将令牌存储在浏览器本地存储中可提供跨页面刷新和浏览器选项卡的持久性,但如果攻击者可以使用跨站点脚本(XSS)攻击在SPA中运行JavaScript,他们就可以检索存储在本地存储中的令牌。允许XSS攻击成功的漏洞可能存在于SPA的源代码中,或存在于SPA中包含的任何第三方JavaScript代码(例如引导程序、jQuery或GoogleAnalytics)中。如果SPA使用隐式(行业规范是推荐使用PKCE的授权码流)或者混合流,为了降低安全风险,可以缩短token的过期时间。这减少了反射XSS攻击的影响。为了减少过期时间,您可以在Dashboard>API>Settings中修改浏览器流的token过期时间,以秒为单位。将域外来源的第三方JavaScript代码量降至最低要求(例如,jQuery、Bootstrap、GoogleAnalytics等的链接)。减少第三方JS代码,减少XSS漏洞出现的可能性。在第三方脚本中执行子资源完整性(SRI)检查,以验证获取的资源是否可以安全交付而不会受到意外操作。
