SFAuthenticationSession的Cookie限制、网站数据范围及跨实例共享问题问询
我来帮你梳理一下这些关于SFAuthenticationSession的问题,结合Apple官方文档和实际开发经验逐一解答:
1. Cookie的共享存在哪些限制?
SFAuthenticationSession和用户的Safari浏览器共享Cookie池,但这个共享有不少严格的限制:
- 域名同源限制:仅共享与认证会话中使用的域名属于同一注册域名(符合公共后缀列表,比如
example.com和sub.example.com属于同一组,example.com和another-example.com则不属于)的Cookie,跨域名的Cookie完全不会被共享。 - 隐私设置限制:如果用户在Safari中开启了「阻止跨网站跟踪」或者使用了隐私浏览模式,Cookie共享会被直接禁止,无论域名是否同源。
- Cookie属性限制:
- 带有
SameSite=Strict的Cookie,只有当认证会话的顶级域名与Cookie的域名完全匹配时才会被共享; SameSite=Lax的Cookie在跳转场景下可以正常共享;SameSite=None的Cookie必须同时设置Secure属性才能被共享(因为SFAuthenticationSession强制要求使用HTTPS);
- 带有
- 第三方Cookie限制:在iOS 14+ / macOS 11+及以上版本中,第三方Cookie默认会被阻止,除非用户手动允许你的域名,或者你的域名被Apple列入了隐私例外名单。
2. 此处的“网站数据”具体包含哪些内容?
这里的「网站数据」指的是Safari浏览器中为网站存储的各类持久化/会话级数据,具体包括:
- 本地存储(LocalStorage):持久化的键值对数据,除非用户手动清除,否则会一直保留;
- IndexedDB:浏览器端的NoSQL数据库,用于存储大量结构化数据;
- Web SQL数据库(虽然已被标准废弃,但部分网站仍在使用);
- 缓存存储(Cache Storage):比如Service Worker用来缓存静态资源的存储区域;
- 网站偏好设置:比如用户在网站上设置的主题、语言偏好等通过浏览器API持久化的设置;
- 注意:会话存储(SessionStorage)是会话级别的数据,仅在当前浏览器会话中有效,不会在SFAuthenticationSession和Safari或其他实例之间共享。
3. 不同SFAuthenticationSession实例间Cookie未共享时的情况,以及查看Cookie的工具
特定类型Cookie才可传递的情况
当不同SFAuthenticationSession实例间出现Cookie未共享的问题时,确实只有符合特定条件的Cookie才能被传递:
- 必须满足前面提到的域名同源限制;
- Cookie的
SameSite、Secure属性必须符合要求(比如SameSite=None必须搭配Secure); - 没有被Safari的隐私设置(比如跨网站跟踪阻止)拦截;
- 如果是第三方Cookie,必须在系统设置中被用户允许。
查看SFAuthenticationSession中Cookie的工具
有几种方式可以查看实例中的具体Cookie:
- Safari Web Inspector:这是开发阶段最常用的工具。当你的App运行在模拟器或真机上时,打开Mac上的Safari浏览器,开启「开发」菜单(在偏好设置-高级中勾选「显示开发菜单」),然后选择对应的设备和App的SFAuthenticationSession页面,在「存储」标签页就能看到所有的Cookie和网站数据;
- 代码方式获取:在App中可以通过
HTTPCookieStorage.shared来获取当前App可访问的Cookie,但只能获取符合同源策略的Cookie,且受隐私设置影响;如果你使用的是ASWebAuthenticationSession(SFAuthenticationSession的后续替代),还可以通过webAuthenticationSession.configuration.httpCookieStorage来访问对应的Cookie存储; - 注意:出于隐私保护,你无法直接获取其他域名的Cookie,即使是同一App中的不同认证实例,跨域名的Cookie也无法通过代码访问。
内容的提问来源于stack exchange,提问作者Locksleyu
相关产品推荐
相关产品推荐

