资讯动态

跨域请求时,如何让浏览器自动携带 Cookie?需要满足哪些条件?

发布时间:2026/9/9 12:46:19 来源:尧图企业网站定制
跨域请求时如何让浏览器自动携带 Cookie从原理到实战1. 引言两个小区的“门禁卡”2. 问题背景为什么跨域默认不带 Cookie2.1 同源策略与 Cookie 的“地域限制”2.2 需求场景3. 前置知识跨域请求与 Cookie 的基础概念4. 核心原理跨域携带 Cookie 的三大条件4.1 条件一服务端明确允许携带凭证4.2 条件二客户端明确告知“请携带”4.3 条件三Cookie 自身允许跨站发送5. 解决方案三步配置法5.1 服务端配置以 Spring Boot 为例5.2 前端配置以 Fetch 为例5.3 Cookie 自身配置6. 对比分析同域 vs 跨域携带条件7. 最佳实践与安全建议7.1 严格限制允许的源7.2 配合防御措施7.3 开发调试注意事项8. 常见误区9. 总结一张图看懂跨域携带 Cookie1. 引言两个小区的“门禁卡”想象你住在A小区想去B小区串门。B小区的门禁系统很严格除非你主动出示门禁卡Cookie并且B小区提前在访客名单上登记了A小区的来访许可CORS 配置否则保安不会放你进去。即使你揣着门禁卡保安也可能因为你没有“打招呼”而拒绝。这就是跨域请求携带 Cookie 的真实写照。浏览器为了安全默认禁止跨域请求携带 Cookie。如果你想实现“跨域登录态共享”比如前后端分离架构、单点登录就必须满足一系列条件。本文将带你彻底搞懂跨域携带 Cookie 的机制、条件和最佳实践。2. 问题背景为什么跨域默认不带 Cookie2.1 同源策略与 Cookie 的“地域限制”浏览器有个重要的安全机制——同源策略。它限制了一个源的网页只能访问同源的资源。对于 Cookie 来说浏览器默认只会在同源请求中自动携带跨域请求时则不会。为什么这样设计试想如果你在a.com上登录后访问b.com时b.com的恶意脚本也能通过跨域请求自动带上你的a.comCookie后果不堪设想。因此浏览器默认禁止跨域携带 Cookie这是保护用户凭证的第一道防线。2.2 需求场景但在实际工程中我们有时确实需要跨域共享凭证例如前后端分离前端web.example.com后端 APIapi.example.com单点登录SSO多个子域auth.example.com、app1.example.com、app2.example.com这时我们需要主动“告诉”浏览器这个跨域请求是安全的请带上 Cookie。3. 前置知识跨域请求与 Cookie 的基础概念在深入解决方案前先明确几个概念同源协议http/https、域名、端口完全相同。跨域协议、域名、端口任一不同。CORS跨域资源共享一套让服务器声明“允许哪些源访问”的机制。Cookie 的自动携带同域请求默认携带跨域请求默认不携带。4. 核心原理跨域携带 Cookie 的三大条件要让浏览器在跨域请求中自动携带 Cookie必须同时满足三个层面的条件缺一不可。4.1 条件一服务端明确允许携带凭证服务器必须在响应头中添加Access-Control-Allow-Credentials: true关键约束如果允许携带凭证Access-Control-Allow-Origin不能为*必须指定具体的请求源如https://a.com且要与请求的Origin头严格匹配。4.2 条件二客户端明确告知“请携带”前端在发起请求时必须显式设置凭证选项请求库设置方式说明原生 XHRxhr.withCredentials true必须写在open()之后Fetch APIcredentials: include告知浏览器携带凭证AxioswithCredentials: true同 Fetch4.3 条件三Cookie 自身允许跨站发送Cookie 的SameSite属性不能是Strict否则即使在 CORS 条件满足时也不会发送。SameSite 值跨站请求时是否携带Strict❌ 完全不携带Lax✅ 部分安全请求如 GET 导航携带POST 不携带None✅ 所有跨站请求携带但必须同时设置Secure仅 HTTPS推荐配置跨域认证场景下将 Cookie 设置为SameSiteNone; Secure且必须通过 HTTPS 传输。5. 解决方案三步配置法5.1 服务端配置以 Spring Boot 为例RestControllerCrossOrigin(originshttps://web.example.com,allowCredentialstrue)publicclassApiController{// ...}或在全局配置中设置ConfigurationpublicclassCorsConfigimplementsWebMvcConfigurer{OverridepublicvoidaddCorsMappings(CorsRegistryregistry){registry.addMapping(/**).allowedOrigins(https://web.example.com)// 必须具体.allowCredentials(true)// 必须 true.allowedMethods(*);}}5.2 前端配置以 Fetch 为例fetch(https://api.example.com/user,{method:GET,credentials:include,// 关键告知浏览器携带 Cookieheaders:{Content-Type:application/json}});5.3 Cookie 自身配置服务端下发 Cookie 时必须包含Set-Cookie: sessionIdabc123; Path/; HttpOnly; Secure; SameSiteNone注意SameSiteNone必须配合Secure且必须使用 HTTPS 连接。6. 对比分析同域 vs 跨域携带条件维度同域请求跨域请求需携带凭证前端配置无需特殊设置必须设置credentials: include/withCredentialstrue服务端 CORS不需要必须返回Access-Control-Allow-Credentials: true且Origin具体Cookie 属性无特殊要求SameSite不能为Strict跨站场景常用None; Secure预检请求无携带凭证的跨域请求会触发OPTIONS预检预检响应也必须满足 CORS 条件7. 最佳实践与安全建议7.1 严格限制允许的源永远不要使用Access-Control-Allow-Origin: *allowCredentials: true浏览器会直接拒绝。仅在必要时开放特定源避免将敏感 Cookie 暴露给不可信的第三方。7.2 配合防御措施CSRF 防护即使 Cookie 携带也应配合SameSiteLax或 CSRF Token防止恶意站点利用用户身份发起请求。HTTPS 全站SameSiteNone时必须使用 HTTPS同时确保 Cookie 设置Secure。最小化暴露Cookie 仅存 Session ID不存敏感信息。7.3 开发调试注意事项跨域请求携带 Cookie 时浏览器会先发送OPTIONS预检请求确保服务端 CORS 配置正确。本地开发时可使用localhost或配置代理绕过跨域但生产环境必须严格遵循规范。8. 常见误区误区正解“只要 CORS 配置好Cookie 就能自动带”❌ 前端必须显式设置credentials: include缺一不可。“Access-Control-Allow-Origin: *加上allowCredentials: true可行”❌ 浏览器会拒绝这种组合必须指定具体域名。“Cookie 设置SameSiteStrict也能跨域携带”❌Strict会完全禁止跨站携带需改为Lax或None。“预检请求不需要处理凭证”❌ 预检响应也必须包含Access-Control-Allow-Credentials: true及正确的Origin。9. 总结一张图看懂跨域携带 Cookie角色必须满足的条件一句话总结前端credentials: include/withCredentialstrue“我要带卡”服务端Access-Control-Allow-Credentials: true 具体Origin“允许带卡且我知道谁来”CookieSameSiteNone; Secure跨站场景“这张卡可以跨门用”核心结论跨域携带 Cookie 不是“自动”的而是三方显式协商的结果。前端声明携带后端明确允许Cookie 自身不阻拦。生产中务必严格控制允许的源配合 HTTPS 与SameSite在实现功能的同时守住安全底线。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价