必须显式设置 allowcredentials 为 true 且 alloworigins 不能为 "*",因浏览器在 withcredentials:true 时会静默丢弃通配符响应;需用具体域名或 alloworiginfunc 动态校验,并确保 cookie 含 samesite=none(secure 根据环境设)。

必须显式设置 AllowCredentials 为 true,且 AllowOrigins 不能用 "*" —— 这是 Fiber 中携带 Cookie 的硬性前提,否则浏览器直接拒绝响应。
为什么 AllowOrigins 不能写 "*"?
浏览器在检测到请求启用了 withCredentials: true(如 Axios 的 withCredentials: true 或 Fetch 的 credentials: "include")时,会强制校验响应头中的 Access-Control-Allow-Origin:如果它是通配符 "*",整个响应会被静默丢弃,前端收不到任何数据,控制台只显示“CORS error”,连状态码都看不到。
解决方法只有两个:
- 把
AllowOrigins改成具体域名,例如http://localhost:5173、https://myapp.com - 或使用
AllowOriginFunc动态判断并返回匹配的源(适合多环境部署)
如何在 Fiber 中正确启用带 Cookie 的 CORS?
Fiber 官方推荐用 github.com/gofiber/fiber/v2/middleware/cors 包。关键点不是加中间件,而是参数配置是否踩中安全规则:
- 必须设置
AllowCredentials: true -
AllowOrigins必须是字符串切片,且每个元素都是完整协议+域名+端口,不能省略http://或https:// - 如果前端发的是预检请求(比如带自定义 header 或非简单 method),要确保
AllowHeaders包含实际用到的字段,例如"Content-Type"、"Authorization" - 建议显式设置
MaxAge(如3600),避免每次请求都触发 OPTIONS 预检
示例配置:
app.Use(cors.New(cors.Config{
AllowOrigins: []string{"http://localhost:5173", "https://myapp.com"},
AllowCredentials: true,
AllowHeaders: []string{"Content-Type", "Authorization"},
MaxAge: 3600,
}))
动态 Origin 场景下怎么安全放行?
当后端要服务多个前端域名(比如测试/预发/生产共用一套 API),又不想硬编码所有域名时,不能靠字符串匹配拼接,得用 AllowOriginFunc:
- 函数接收
origin string参数,返回bool表示是否允许 - 务必做白名单校验,比如检查
strings.HasSuffix(origin, ".mycompany.com"),而不是简单地strings.Contains(origin, "mycompany")(防子域劫持) - 函数内禁止直接返回
true,否则等同于开放"*" - 注意:Fiber 的
cors中间件在预检请求中也会调用该函数,所以逻辑要轻量
简写示例:
app.Use(cors.New(cors.Config{
AllowOriginFunc: func(origin string) bool {
for _, allowed := range []string{"http://localhost:5173", "https://prod.myapp.com"} {
if origin == allowed {
return true
}
}
return false
},
AllowCredentials: true,
MaxAge: 3600,
}))
Cookie 能传过去,但后端拿不到?检查 SameSite 和 Secure 属性
即使 CORS 配置完全正确,后端仍可能收不到 Cookie,常见原因不在跨域本身,而在 Cookie 自身属性:
- 如果后端用
ctx.Cookie或ctx.Cookies()拿不到值,先确认 Set-Cookie 响应头里是否带了SameSite=None; Secure -
SameSite=None是跨域场景下传递 Cookie 的必要条件;而Secure表示只在 HTTPS 下发送 —— 如果本地开发用 HTTP(如http://localhost:5173),则不能设Secure,否则浏览器直接忽略该 Cookie - Fiber 中设置 Cookie 示例:
ctx.Cookie(&fiber.Cookie{Name: "session_id", Value: "abc123", HTTPOnly: true, SameSite: "None", Secure: false})(开发环境)
这个环节最容易被忽略:CORS 配好了,Cookie 却因为 SameSite 规则被浏览器拦截,前端没报错,后端也收不到,排查起来像黑盒。











