苹果设备Safari拦截Cookie致Token刷新失败问题排查
结合你描述的前后端分离场景、跨域名情况以及Safari的特性,导致Cookie被拦截、Token刷新失败的核心原因主要有以下几点:
Safari第三方Cookie限制(ITP策略):Safari的智能跟踪预防(Intelligent Tracking Prevention,ITP)默认会严格限制第三方域名的Cookie存储和读取。如果你的API域名(api.xxx.xxx.xxx)和主域名(xxx-xxx.xxx)不属于同一个根域名(比如一个是
xxx.xxx,另一个是xxx-xxx.xxx),API域名会被判定为第三方域名,其Set-Cookie响应头会被Safari拦截,导致Cookie无法持久化存储,后续请求自然无法携带Cookie。Cookie的SameSite属性配置错误:如果后端在设置Cookie时,SameSite属性未设置为
None,或者未同时搭配Secure属性,跨域场景下Safari不会在请求中携带该Cookie。需要注意:- 当SameSite设为
None时,必须同时开启Secure(仅HTTPS环境生效),否则Safari会直接拒绝这个Cookie; - 如果设为
Strict或Lax,跨域请求时Safari不会自动携带Cookie,只有同域请求才会携带。
- 当SameSite设为
域名根域不匹配:如果API域名和主域名的根域完全不同(比如主域是
abc.com,API域是def.net),即使配置了SameSite=None,Safari的ITP仍可能将其视为第三方跟踪行为,限制Cookie的使用。这种情况下,需要确保两者共享同一根域,或者采用其他鉴权方式(比如将Token放在请求头的Authorization字段,而非依赖Cookie)。HTTP环境下的Secure属性限制:如果你的服务是在HTTP环境下运行(比如本地开发),而Cookie设置了
Secure属性,Safari会拒绝存储该Cookie,因为Secure要求Cookie只能通过HTTPS协议传输。
内容的提问来源于stack exchange,提问作者i chestor

