快速回答: SessionStorage 和 localStorage 都是基于浏览器的 Web 存储 API,允许网站在用户设备上存储数据,但它们在持久性和范围上存在关键差异。localStorage 在会话和标签之间无限期保留数据,而 sessionStorage 在浏览器标签关闭时会删除数据。从隐私的角度来看,localStorage 的风险显著更高,因为数据没有过期,成为跟踪、指纹识别和在 GDPR 等框架下接受监管审查的更具吸引力的目标。
关键要点
- localStorage 无限期保留,直到明确清除;sessionStorage 在标签或窗口关闭时被删除。
- 两种存储类型都易受跨站脚本(XSS)攻击,并且没有内置加密。
- 与 cookies 不同,localStorage 和 sessionStorage 数据不会自动传输到服务器,但任何在同一源上运行的 JavaScript 都可以完全读取它们。
- 如果第三方脚本在同一源上下文中运行,则可以访问 localStorage 数据。
- 根据 GDPR,在没有用户同意的情况下将非必要数据存储在 localStorage 中是合规违规,和放置跟踪 cookies 一样。
- 敏感数据,如身份验证令牌、密码和个人可识别信息(PII),在没有额外安全层的情况下,绝不应存储在这两种机制中。
- 私密/无痕浏览限制 localStorage 的持久性,但不会消除会话内的 sessionStorage 风险。
- 开发者应优先使用 sessionStorage 进行临时状态,服务器端会话或 HttpOnly cookies 进行身份验证,以及使用 Biscotti CMP 等同意管理平台来管理存储同意。
SessionStorage 和 LocalStorage 之间有什么区别?
SessionStorage 和 localStorage 都是 HTML5 Web 存储 API 的一部分,但它们的持久性和标签范围行为定义了不同的目的。
localStorage 存储没有过期日期的键值对。数据在浏览器重启、系统重启和无限期不活动期间存活,直到用户或应用程序明确删除它。它在同一源(协议 + 域 + 端口)下的所有标签和窗口之间共享。[1][5]
sessionStorage 仅在页面会话的生命周期内存储数据。当用户关闭标签或窗口时,数据就消失了。关键是,每个标签维护自己的隔离 sessionStorage,在第二个标签中打开相同的 URL 不会共享第一个标签的 sessionStorage 数据。[1]
| 特性 | localStorage | sessionStorage |
|---|---|---|
| 持久性 | 无限期 | 仅限标签/窗口生命周期 |
| 在标签间共享 | 是(同一源) | 否(每标签隔离) |
| 在页面重新加载后存活 | 是 | 是 |
| 在标签关闭后存活 | 是 | 否 |
| 存储容量 | ~5-10 MB 每个源 | ~5-10 MB 每个源 |
| 服务器传输 | 否 | 否 |
| HttpOnly 保护 | 不可用 | 不可用 |
这两个 API 都遵循同源策略,因此 https://example.com 上的页面无法读取 https://otherdomain.com 设置的存储。[4]
localStorage 相比 sessionStorage 是否存在隐私风险?
是的,localStorage 的隐私风险显著高于 sessionStorage,主要是由于其无限期的持久性和跨标签的可访问性。
写入 localStorage 的数据可以在几个月或几年内积累,而用户却不知情。广告商和分析供应商历史上将 localStorage 用作“超级 cookie”,一种在 cookie 删除后仍然存在的跟踪标识符,因为大多数用户不会想到手动清除浏览器存储。相比之下,sessionStorage 在标签关闭时自我销毁,使其成为一个远不如的跟踪向量。
localStorage 独特的关键隐私风险因素:
- 持久跟踪标识符: 存储在 localStorage 中的唯一 ID 可以在多次访问中跟踪用户,而无需任何服务器端 cookie。
- 跨标签数据泄露: 在同一源的任何标签中运行的任何脚本都可以读取所有 localStorage 数据。
- 存储事件广播: 对 localStorage 的更改会在同一源的其他打开标签中触发
storage事件,从而实现用户无法观察到的跨标签数据同步。[5] - 没有自动过期: 与支持
Max-Age和Expires属性的 cookies 不同,localStorage 没有 TTL 机制。
网站能否使用 localStorage 和 sessionStorage 跟踪用户?
网站可以并确实使用 localStorage 进行持久跟踪。sessionStorage 对于跟踪的用途较小,但在会话内仍然存在监视风险。
一行 JavaScript 代码 localStorage.setItem('uid', 'abc123') 创建了一个持久标识符,即使在清除 cookie 后也会存活。这种技术有时被称为“evercookie”或基于存储的重生,已在隐私研究中得到记录,这也是监管机构越来越将 localStorage 视为与 cookies 相同的同意规则的原因。
sessionStorage 可以在单个会话内跟踪行为(页面流、表单输入、导航模式),但当标签关闭时,该数据会消失,从而限制了其用于长期分析的效用。
数据在 SessionStorage 和 LocalStorage 中存留多久?
localStorage 数据会一直保留,直到被明确删除,无论是用户清除浏览器存储,网站调用 localStorage.removeItem() 或 localStorage.clear(),还是浏览器强制执行存储配额。[2]
sessionStorage 数据在创建它的标签或窗口关闭时会自动删除。它在同一标签内的页面重新加载中存活,但不会转移到新标签,即使用户在某些浏览器中复制标签。[1]
实际影响: 如果开发者将会话令牌存储在 localStorage 中而不是 sessionStorage 中,则该令牌在用户注销后仍然保留在设备上,除非应用程序明确删除它。这是一个常见且后果严重的错误。
SessionStorage 是否比 localStorage 更隐私?
对于大多数隐私用例,是的,sessionStorage 是更尊重隐私的选择。它在标签关闭时的自动删除意味着数据不会滞留,从而减少了设备共享、被盗设备或取证分析的暴露。
然而,sessionStorage 并不天生“私密”。在活动会话内,它与 localStorage 一样容易受到 XSS 攻击。任何注入的脚本都可以调用 sessionStorage.getItem() 并实时提取数据。[3]
选择 sessionStorage 的情况: 数据仅在当前用户交互中需要(例如,多步骤表单状态、一次性导航令牌)。
选择 localStorage 的情况: 数据确实需要在会话之间持久存在(例如,用户 UI 偏好、非敏感设置),并确保其不包含任何个人可识别信息。
哪些个人数据绝不应存储在 localStorage 中?
以下类别的数据绝不应存储在 localStorage 中(即使在 sessionStorage 中也应极其谨慎处理):[3]
- 身份验证令牌(JWT、OAuth 令牌、会话 ID)
- 密码或密码哈希
- 信用卡或支付信息
- 政府签发的身份证号码或社会安全号码
- 全名与电子邮件地址或电话号码结合
- 医疗或健康记录
- 根据 GDPR 分类为“特殊类别”的任何数据(生物识别数据、健康数据、政治观点)
存储在 localStorage 和 sessionStorage 中的数据默认是未加密的。任何拥有物理访问设备的人,或任何能够在页面上执行的脚本,都可以以明文形式读取它。[3]
第三方脚本可以访问 localStorage 数据吗?
如果第三方脚本在与主页面相同的源中加载并执行,则可以访问 localStorage 数据。这是一个关键且经常被低估的风险。
当一个网站通过 <script> 标签嵌入第三方分析或广告脚本时,该脚本在主页面的源上下文中运行。它可以自由读取和写入该网站的 localStorage。同源政策无法保护来自同一网站内部故意或无意加载的脚本。[4]
这在实践中意味着什么: 如果一个网站在 localStorage 中存储用户标识符,并且还加载了第三方广告脚本,则该广告脚本可以读取标识符并将其与跨站行为数据关联,而用户对此毫不知情或未获同意。
这也是同意管理平台重要性的原因之一。Biscotti CMP 使网站能够管理和记录用户对存储操作的同意,包括基于 localStorage 的跟踪,帮助网站满足 GDPR 和类似框架下的义务。
使用 localStorage 的 GDPR 影响是什么?
根据 GDPR,任何个人数据或跟踪标识符的存储,无论技术机制如何,都需要合法依据。对于通过 localStorage 进行的非必要跟踪,该依据几乎总是明确的用户同意。[2]
欧洲数据保护委员会已确认,用于分析、广告或用户分析的 localStorage 受与 cookies 相同的同意要求约束。在没有事先同意的情况下将跟踪标识符放入 localStorage 的网站面临与使用未同意的 cookies 相同的执法风险。
GDPR 下 localStorage 的合规检查清单:
- 审核所有由第一方和第三方脚本写入的 localStorage 键。
- 对每个键进行分类:它是否对服务绝对必要,还是用于分析/广告?
- 对于非必要存储,将写入操作限制在记录的用户同意之后。
- 为用户提供明确的机制以撤回同意并触发存储删除。
- 记录数据控制者的合法利益或同意记录。
一个配置正确的同意管理平台,如 Biscotti CMP,可以自动化大部分同意生命周期。
localStorage 是否可以跨不同网站访问?
不可以。localStorage 严格限制在创建它的源(协议 + 域 + 端口组合)内。位于 https://siteA.com 的脚本无法读取由 https://siteB.com 设置的 localStorage 数据。[4]
然而,这种保护是有限的。如果单个广告或分析提供商在 siteA.com 和 siteB.com 上加载其脚本,则每个实例独立写入各自网站的 localStorage。然后,提供商在服务器端关联数据,从而有效地实现跨站跟踪,而不违反同源政策。
无痕模式和私密浏览如何影响 localStorage?
私密/无痕浏览创建一个临时存储分区,在私密窗口关闭时被删除。在无痕会话中写入的 localStorage 不会持久保留到主浏览器配置文件中,也无法在常规浏览窗口中访问。
sessionStorage 在无痕模式下的行为与常规浏览相同:在标签关闭时被删除。
重要警告:
- 在活动的无痕会话中,localStorage 仍然可以被该会话的同源上下文中运行的所有脚本读取。
- 无痕模式不会防止基于 XSS 的实时数据提取。
- 如果用户登录浏览器同步,则某些浏览器会在设备之间同步 localStorage,这种行为可能会将“本地”数据移动到云基础设施中。
如何清除 SessionStorage 和 localStorage 以保护隐私?
清除浏览器存储很简单,但需要有意识的操作,因为浏览器不会自动清除 localStorage。
浏览器级清除:
- Chrome:设置 > 隐私与安全 > 清除浏览数据 > 缓存的图像和文件 + 网站数据
- Firefox:设置 > 隐私与安全 > Cookies 和网站数据 > 清除数据
- Safari:设置 > 隐私 > 管理网站数据
程序化清除(针对开发者):
localStorage.clear()删除该源的所有键。sessionStorage.clear()删除当前标签会话的所有键。localStorage.removeItem('keyName')删除特定键。
对于关注跟踪的最终用户: 在浏览器设置中清除“网站数据”或“cookies 和存储”将删除所有网站的 localStorage 和 sessionStorage 内容。旨在保护隐私的浏览器扩展可以在每个网站或每个会话的基础上自动化此操作。
开发者在 Web 存储中常犯的隐私错误是什么?
最严重的错误有一个共同根源:将客户端存储视为安全的服务器端数据库。
- 在 localStorage 中存储 JWT: 存储在 localStorage 中的身份验证令牌对页面上的任何脚本都是可访问的。单个 XSS 漏洞会暴露每个用户的令牌。应使用 HttpOnly cookies 存储身份验证令牌。
- 没有过期逻辑: localStorage 没有 TTL。开发者在存储数据时未构建过期逻辑,会将过时的敏感数据无限期保留在设备上。
- 假设同源意味着安全: 同源政策阻止外部网站,而不是从同一网站加载的恶意脚本(XSS、受损的第三方库)。
- 忽视第三方脚本访问: 嵌入分析或广告脚本而不审核它们从 localStorage 中读取的内容。
- 没有跟踪存储的同意门槛: 在获得用户同意之前将分析标识符写入 localStorage,直接违反 GDPR。[2]
- 存储冗余的 PII: 将包含完整用户档案的 API 响应缓存到 localStorage 中“以提高性能”,而不考虑暴露面。
IndexedDB 是否比 localStorage 更隐私?
IndexedDB 并不天生比 localStorage 更隐私。两者都受同源政策的约束,都可以被在页面上运行的 JavaScript 访问,并且都容易受到 XSS 攻击。
IndexedDB 提供更大的存储容量,并支持结构化数据和二进制大对象,使其适合复杂的离线应用程序。但从隐私和安全的角度来看,风险是相当的。存储在 IndexedDB 中的数据默认也是未加密的,并且会无限期保留,除非明确删除。
在 IndexedDB 和 localStorage 之间的选择应基于数据复杂性和容量需求,而不是隐私假设。在没有应用层加密和严格访问控制的情况下,两者都不适合存储敏感个人数据。
结论
SessionStorage 与 LocalStorage:Web 存储 API 的隐私影响辩论不仅仅是一个技术脚注,它对用户隐私、合规性和应用安全有直接影响。localStorage 的无限期持久性和跨标签可访问性使其在误用时成为高风险存储机制,而 sessionStorage 在标签关闭时的自动删除使其成为临时状态的更可辩护选择。
2026 年开发者和网站所有者的可操作下一步:
- 使用浏览器 DevTools(应用标签)审核所有 localStorage 和 sessionStorage 的使用情况,包括第一方和第三方脚本。
- 立即从客户端存储中删除任何身份验证令牌、PII 或敏感标识符。
- 用 HttpOnly、Secure cookies 替换基于 localStorage 的身份验证令牌存储,这些 cookies 由服务器端管理。
- 实施同意管理工作流程,使用 Biscotti CMP 等平台,将非必要的 localStorage 写入限制在记录的用户同意之后。
- 为必须持久存在的任何 localStorage 数据构建过期逻辑,并在注销时强制清理。
- 进行第三方脚本审核,以了解哪些外部代码可以从您源的存储中读取。
- 培训开发团队关于 XSS 预防作为针对这两种存储类型的主要攻击向量。
Web 存储 API 是强大的工具。如果没有隐私纪律,它们会成为责任向量。如果经过深思熟虑的范围、同意管理和安全卫生使用,它们可以在不妨碍信任您应用程序的用户的情况下,发挥其预期作用。
常见问题
问:sessionStorage 和 localStorage 之间的主要区别是什么?
localStorage 在会话之间无限期持久化数据,并在同一源的所有标签之间共享。sessionStorage 仅在当前标签的生命周期内存储数据,并在标签关闭时自动删除。
问:localStorage 可以在没有 cookies 的情况下用于跟踪用户吗?
可以。存储在 localStorage 中的唯一标识符在 cookie 删除后仍然存在,并可用于在多次访问同一网站时跟踪用户,充当持久跟踪机制。
问:sessionStorage 存储密码安全吗?
不安全。sessionStorage 没有加密,任何在页面上运行的 JavaScript,包括注入的恶意脚本,都可以访问。密码绝不应存储在任何客户端存储机制中。
问:GDPR 是否适用于 localStorage?
是的。根据 GDPR,在没有合法依据的情况下将跟踪标识符或个人数据存储在 localStorage 中,通常是针对非必要目的的明确用户同意,是合规违规,相当于未同意的 cookie 使用。
问:第三方脚本可以读取我的 localStorage 数据吗?
可以,如果这些脚本在同一源中加载并执行。通过 <script> 标签嵌入的第三方分析或广告脚本在主页面的源上下文中运行,可以读取该源的所有 localStorage 数据。
问:清除 cookies 是否也会清除 localStorage?
不一定。在大多数浏览器中,仅清除“cookies”不会清除 localStorage。用户必须特别清除“网站数据”或“cookies 和其他网站数据”以删除 localStorage 内容。
问:无痕模式是否可以防止 localStorage 跟踪?
无痕模式防止 localStorage 数据在私密窗口关闭后持久化,但在活动的无痕会话中,localStorage 仍然可以被页面上的所有脚本读取。
问:我应该使用什么替代 localStorage 存储身份验证令牌?
使用 HttpOnly、Secure、SameSite cookies 由服务器端管理。这些 cookies 对 JavaScript 不可访问,消除了 localStorage 带来的基于 XSS 的令牌盗窃风险。
问:IndexedDB 是否比 localStorage 更安全?
不。IndexedDB 受到与 localStorage 相同的 XSS 漏洞和同源政策的约束。它提供更大的容量和数据结构支持,但没有额外的隐私或安全保证。
问:localStorage 和 sessionStorage 可以存储多少数据?
大多数现代浏览器为每种存储类型每个源分配大约 5 到 10 MB 的存储,显著高于 cookies 通常的 4 KB 限制。[2]
参考文献
[1] Sessionstorage - https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage?utm_source=openai
[2] What Is Localstorage Sessionstorage - https://inspectwp.com/en/knowledge-base/what-is-localstorage-sessionstorage?utm_source=openai
[3] Html5 Web Storage Security Risks Safeguarding Localstorage And Sessionstorage - https://www.dopethemes.com/html5-web-storage-security-risks-safeguarding-localstorage-and-sessionstorage/?utm_source=openai
[4] Localstorage - https://javascript.info/localstorage?utm_source=openai
[5] Localstorage Sessionstorage - https://www.w3docs.com/learn-javascript/localstorage-sessionstorage?utm_source=openai
[6] Cookies Vs Localstorage Vs Sessionstorage What Each One Exactly Means - https://www.interserver.net/tips/kb/cookies-vs-localstorage-vs-sessionstorage-what-each-one-exactly-means/?utm_source=openai