如何配置Cookie实现dev.example.com各级子域名跨源正常携带
问题根因
该现象由浏览器默认的SameSite=LaxCookie规则导致:默认未显式配置SameSite的Cookie,仅允许在与Cookie设置时的顶级页面上下文同站的请求中携带,你当前的Cookie是在dev.example.com作为顶级页面时设置的,当顶级页面切换为sub3.dev.example.com后,请求被SameSite规则拦截。
1. 现有Cookie配置下的携带方案
针对你已经设置好的Cookie,要在sub3.dev.example.com下访问sub2.dev.example.com时携带,有两种可行方案:
- 若为GET请求场景,使用顶级页面跳转的方式访问
sub2.dev.example.com接口,SameSite=Lax规则允许顶级导航的GET请求携带Cookie - 若为异步AJAX/Fetch请求场景,首先给请求开启携带凭证配置:XHR请求设置
withCredentials = true,Fetch请求设置credentials: 'include';同时需要sub2.dev.example.com接口返回的CORS响应头配置允许sub3.dev.example.com跨域访问,且Access-Control-Allow-Credentials设置为true
2. 全子域名通用携带的Cookie配置方案
要让Cookie在所有*.dev.example.com子域名之间任意携带,不受设置源限制,直接调整Set-Cookie响应头的属性即可,参考配置如下:
Set-Cookie: [你的Cookie名称]=[Cookie值]; Domain=dev.example.com; Secure; HttpOnly; SameSite=None; Path=/
各属性作用说明:
Domain=dev.example.com:作用域覆盖所有dev.example.com的子域名,不管是几级子域名都能读取到该CookieSameSite=None:关闭SameSite的上下文限制,允许任意子域名下的请求携带该Cookie,注意Chrome 80+、Firefox 75+版本要求SameSite=None必须和Secure属性共同配置才会生效Path=/:匹配所有路径的请求,不会因为接口路径不同导致Cookie匹配失败HttpOnly和Secure保留原配置即可,若有HTTP站点使用需求可移除Secure(不建议,存在明文泄露风险)
注意:使用
SameSite=None会降低Cookie的CSRF防护能力,若Cookie存储身份凭证等敏感信息,建议额外增加CSRF Token校验等防护措施。
内容的提问来源于stack exchange,提问作者Luis Pais
相关产品推荐
相关产品推荐

