为何macOS与iOS端Safari会随机清除Cookie及LocalStorage数据?
问题现象
- 站点设置的有效期5年的身份认证令牌存储在Cookie中时,桌面端、移动端Safari均会不定期清除该Cookie,存储留存时长无固定规律,短则1周、长则2个月,清除时机完全不可预测。
- 将相同令牌改为存储在LocalStorage后,出现完全一致的被随机清除的问题。
- 以上Cookie、LocalStorage条目均通过客户端JavaScript/AngularJS写入,对应实现代码如下:
// LocalStorage 写入逻辑 window.localStorage.setItem('token', 'secret-token');
// AngularJS Cookie 写入逻辑 angular.module('app', ['ngCookies']) .controller('Ctrl', ['$cookies', function($cookies) { var expireDate = new Date(); expireDate.setDate(expireDate.getDate() + 5*365); $cookies.put('token', 'secret-token', { 'expires': expireDate }); }]);
- 现有公开文档中暂未检索到对该类随机清除行为的明确说明。
根本原因
该现象是Safari默认启用的*智能跟踪防护(Intelligent Tracking Prevention, 简称ITP)*机制的默认策略,不属于代码bug:
- ITP对所有前端脚本可读写的存储资源(包括JS写入的非HttpOnly Cookie、LocalStorage、SessionStorage、IndexedDB等)设置了强制淘汰规则:如果用户连续7天未与对应域名产生直接的主动交互,该域名下所有前端脚本写入的存储数据会被全量清除,与代码中手动设置的5年过期时间无关。
- 观察到的“留存时长不固定”是规则触发条件导致的:如果用户在7天周期内主动访问站点、产生交互行为,淘汰计时会自动重置;如果用户开启了增强隐私拦截、手动清理过网站数据,或者域名被ITP判定存在跨站跟踪行为,淘汰周期会进一步缩短,因此会出现有时留存2个月、有时1周就被清除的情况。
- 由于LocalStorage和普通JS写入的Cookie同属ITP管控的前端可读写存储范畴,因此两种存储方式的表现完全一致。
适配方案
- 长期有效的身份认证令牌不要通过前端JS写入,改为由服务端通过
Set-Cookie响应头下发,同时添加HttpOnly、Secure、SameSite=Lax/Strict属性。这类服务端设置的第一方认证Cookie属于ITP规则豁免范围,不会被7天非交互清理策略影响,同时还能规避XSS窃取令牌的安全风险。 - 不建议将身份认证令牌存储在LocalStorage中,除了会被Safari随机清理外,本身存在明确的安全隐患。
- 如果业务场景必须保留前端读写令牌的逻辑,需要在用户每次访问站点时静默刷新存储的令牌有效期,保证用户两次访问站点的间隔不触发7天清理阈值,但该方案无法覆盖用户连续7天以上未访问站点的场景。
注意:不要尝试通过伪造用户交互、高频重写存储等方式绕过ITP检测,这类绕过手段在近年的ITP版本迭代中已经被全量识别拦截,反而可能导致域名被标记为恶意跟踪源,触发更严格的全量存储拦截策略。
内容的提问来源于stack exchange,提问作者adamsfamily
相关产品推荐
相关产品推荐

