浏览器中存储访问令牌的最佳实践( 三 )


内存存储令牌的一个相当安全的方法是将其保存在内存中 。与其他方法相比,令牌不存储在文件系统中,从而减轻了与设备文件系统相关的风险 。
最佳实践建议在内存中存储令牌时将其保存在闭包中 。例如 , 您可以定义一个单独的方法来使用令牌调用API 。它不会向主应用程序(主线程)透露令牌 。下面的摘录显示了如何在JavaScript中使用内存处理令牌的示例 。
function protectedCalls(tokenResponse) {const accessToken = tokenResponse.accessToken;return {// call API with access tokengetOrders: () => {const req = new Request("https://server.example/orders");req.headers.set("Authorization", accessToken);return fetch(req)}}}const apiClient = protectedCalls(tokenResponse);// call protected APIapiClient.getOrders();请注意 , 攻击者可能无法在获取令牌后直接访问令牌,因此可能无法直接使用令牌调用API 。即便如此,通过持有令牌引用的apiClient,他们可以随时通过apiClient调用API 。但是,任何此类攻击都限于选项卡打开并且接口提供的功能的时段 。
除了与潜在的XSS漏洞相关的安全问题外,在内存中保持令牌的最大缺点是页面重载时令牌会丢失 。然后,应用程序必须获取一个新令牌,这可能会触发新的用户身份验证 。安全的设计应考虑到用户体验 。
使用服务工作者的体系结构通过在独立的线程中运行令牌处理功能来减轻可用性问题 , 该线程与主网页分离 。服务工作者实际上充当应用程序、浏览器和网络之间的代理 。因此,它们可以拦截请求和响应,例如缓存数据和启用离线访问,或者获取和添加令牌 。
在使用JavaScript闭包或服务工作者处理令牌和API请求时,XSS攻击可能会针对OAuth流程,如回调流或静默流来获取令牌 。它们可以取消注册并绕过任何服务工作者,或者使用原型污染“实时读取令牌”通过覆盖诸如window.fetch之类的方法 。因此 , 请出于方便而不是安全性考虑JavaScript闭包和服务工作者 。
CookieCookie是存储在浏览器中的数据片段 。由设计 , 浏览器会将cookie添加到对服务器的每个请求中 。因此,应用程序必须谨慎使用cookie 。如果未经仔细配置,浏览器可能会在跨站请求时追加cookie,并允许跨站请求伪造(CSRF)攻击 。
Cookie具有控制其安全属性的属性 。例如 , SameSite属性可以帮助缓解CSRF攻击的风险 。当一个cookie的SameSite属性设置为Strict时,浏览器只会将其添加到源自并目标与cookie的源站点相同的请求中 。当请求嵌入在任何第三方网站中时,浏览器不会添加cookie , 例如通过链接 。
【浏览器中存储访问令牌的最佳实践】您可以通过JavaScript设置和检索cookie 。但是,当使用JavaScript读取cookie时,应用程序会变得容易受到XSS攻击(除了CSRF之外) 。因此 , 首选的选择是让后端组件设置cookie并将其标记为HttpOnly 。该标志可以缓解通过XSS攻击泄露数据的问题,因为它指示浏览器cookie不能通过JavaScript访问 。
为防止cookie通过中间人攻击泄露,这可能导致会话劫持,cookie应仅通过加密连接(HTTPS)发送 。要指示浏览器仅在HTTPS请求中发送cookie,必须将Secure属性设置为cookie 。
Set-Cookie:token=myvalue;SameSite=Strict;Secure;HttpOnly与浏览器中的任何其他永久存储解决方案一样,cookie可能会驻留在文件系统中,即使浏览器已关闭(例如 , cookie不必过期,或者浏览器可以将会话cookie作为恢复会话功能的一部分保留) 。为了减轻从文件系统中窃取令牌的风险 , 只能在cookie中存储加密的令牌 。因此,后端组件只能在Set-Cookie头中返回加密的令牌 。
威胁矩阵下表总结了浏览器中存储解决方案的威胁评估,主要威胁向量标记为红色 。橙色威胁需要除Web技术之外的缓解措施 。绿色威胁已经或可以通过适当的设置成功消除 。

浏览器中存储访问令牌的最佳实践

文章插图
无论攻击者何时设法窃取令牌 , 只要令牌有效,他们就可以独立于用户和应用程序使用访问令牌 。如果攻击者设法窃取刷新令牌,他们可以显着延长攻击时间并增加损害,因为他们可以续新访问令牌 。黑客甚至可以将攻击扩展到除JavaScript应用程序使用的API之外的其他API 。例如 , 攻击者可以尝试重放访问令牌并利用不同API中的漏洞 。
被盗的访问令牌可能会造成严重损害,XSS仍然是Web应用程序的主要问题 。因此,避免在客户端代码可以访问的地方存储访问令牌 。相反 , 将访问令牌存储在cookie中 。当使用适当的属性配置cookie时,浏览器泄露访问令牌的风险为零 。然后,XSS攻击与在同一站点上的会话劫持攻击相当 。


推荐阅读