【发布时间】:2020-04-14 01:59:23
【问题描述】:
Auth0 提供了描述身份验证最佳实践的广泛资源列表。其中有源源不断的建议不要使用 localStorage 作为存储 (JWT) 令牌的手段。
- https://auth0.com/docs/security/store-tokens#don-t-store-tokens-in-local-storage
- https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/HTML5_Security_Cheat_Sheet.md#local-storage
- https://github.com/auth0/docs/issues?utf8=%E2%9C%93&q=localstorage
我发现这些点有几个问题:
- 强烈假设 JWT 令牌是攻击者不得访问的敏感信息(通过 XSS)
- 从我的角度来看,访问令牌本身不会扩大攻击范围。如果攻击者可以控制受害者的浏览器,他们就可以使用令牌从受影响的浏览器本身执行调用。
- 访问令牌通常具有相当短的到期时间,并且可以固定在浏览器上,从而减少在 XSS 上下文之外使用它们的机会。
- Auth0 建议使用他们的 SDK 中的
auth0.getTokenSilently()来获取令牌,但据我所知,攻击者应该没有任何理由不能自己调用此方法(即注入另一个 sdk 脚本,使用现有的客户端密钥,只需从那里调用 getToken),从而以几乎与存储在localStorage中的方式相同的方式获取令牌 - 我知道 XSS 无法访问令牌的唯一方法基本上是使用 httpOnly cookie,但这会自行创建新向量 (CSRF),并且仍然不会阻止攻击者从内部调用 api受影响的浏览器。
所以我完全同意 OWASP 的建议,不要在localStorage 中存储敏感数据,我绝不会想到在其中存储信用卡号或密码甚至个人数据。但这只是因为这些东西会让攻击者扩大他们的攻击范围(访问银行账户,尝试在其他应用程序中重用用户密码等)。但我很难了解 accessTokens 是如何受此影响的。
【问题讨论】:
标签: jwt single-page-application auth0