Auth0提供了大量资源列表,这些资源描述了认证的最佳实践。其中不断有建议不要使用localStorage
作为存储(JWT)令牌的手段。
我发现这些问题有几个问题:
auth0.getTokenSilently()
来获取令牌,但据我所知,攻击者没有任何理由不能自己调用此方法(即使用现有客户端注入另一个sdk脚本)键,然后从那里调用getToken),从而获得令牌的方式几乎与将其存储在localStorage
因此,我完全同意OWASP的建议,不要在localStorage
中存储敏感数据,我从不考虑在其中存储信用卡号或密码,甚至个人数据。但这仅仅是因为这些事情会使攻击者扩大攻击范围(访问银行帐户,并尝试在其他应用中重用用户的密码,等等)。但是我很难看到accessTokens对此有何影响。
尽管我对Auth0的实现,功能和设计决策了解不多,但从我对OAuth2和安全性的一般理解中,我可以尝试将各个方面联系起来。
单个建议本身并不能提供足够的安全性或所需的功能,但是当与其他相关建议结合使用时,我们可以达到所需的安全性和行为水平。
让我们来谈谈你提出的观点。
从我的角度来看,访问令牌本身并没有扩大攻击范围。如果攻击者可以控制受害者的浏览器,他们可以使用令牌从受影响的浏览器本身执行调用]
localstorage
的问题是:
localStorage
和sessionStorage
不跨子域共享。这是SSO功能的显示止挡器(有些解决方案使用iframe
,但看起来更像是变通方法,而不是一个好的解决方案。当使用响应标头X-Frame-Options来避免使用iframe
进行点击劫持攻击时,用iframe
表示的任何解决方案都是毫无疑问的)
XSS可以将访问和/或刷新令牌发送到攻击者控制的远程服务器,从而允许攻击者模拟用户
注:在第2点中提到的漏洞可以通过使用Sender Constrained Access Tokens方法来缓解,其中客户端必须证明他们确实拥有令牌。另一种选择是OWASP中提到的fingerprint approach,它需要一个cookie。但是,似乎Auth0并没有实现这些功能。因此,避免使用localstorage
的建议是有意义的。
Auth0建议从其SDK使用auth0.getTokenSilently()来获取令牌,但据我所知,没有任何理由使攻击者无法自行调用此方法
正确。这就是为什么
getTokenSilently()
方法要求您在仪表板的API设置中启用Allow Skipping User Consent
。尽管我对此没有特定的指导原则,但是我认为如果将令牌存储在cookie中,则不需要启用此选项,从而消除了滥用该方法的可能性。我知道XSS无法访问令牌的唯一方法基本上是使用httpOnly cookie,但是它自己创建了新的向量(CSRF),并且仍然无法阻止攻击者从受影响的内部调用api浏览器
是。但是您可以使用以下一种或多种方法来缓解这种情况:
SameSite
Cookie。请参考文档here。如果浏览器不支持SameSite
cookie,请遵循以下另一种方法Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
仅允许安全连接,以防止任何中间人覆盖子域的CSRF cookie