c.cookies("key") 返回原始编码字符串且不校验安全属性;读为空主因是前端未设credentials: "include"或secure/samesite配置不匹配;写cookie必须显式设置secure、httponly、samesite等属性,否则生产环境失效。

直接读 c.Cookies("key") 拿到的是原始未解码字符串,不校验 Secure/HttpOnly/过期,也不处理多 path 冲突;写 Cookie 必须显式设 Secure、HTTPOnly、SameSite,否则生产环境大概率失效。
读 Cookie 时为什么总是空?
常见现象是 c.Cookies("auth_token") 返回空字符串,但实际 Cookie 已存在。这不是 Fiber 的 bug,而是浏览器或请求链路没把 Cookie 带上来。
- 前端发请求时没加
credentials: "include"(Fetch)或withCredentials: true(Axios),Secure+SameSite=Strict 的 Cookie 就不会发送 - 开发环境用
http://localhost却设了Domain="example.com",浏览器静默丢弃该 Cookie - Cookie 是 URL 编码过的(比如含中文、空格),
c.Cookies()返回的是编码后值,需手动调url.QueryUnescape() - 多个同名 Cookie(如不同
Path)共存时,c.Cookies()只返回第一个匹配项(按请求头中 Cookie 字段顺序)
写 Cookie 必须配全安全属性
只设 Value 和 Name 是危险的,尤其在 HTTPS 生产环境。缺任意一项都可能导致 Cookie 不被发送、被篡改或遭 CSRF 利用。
-
Secure: true—— 强制仅通过 HTTPS 传输,HTTP 环境下设为false(但开发环境也建议用 https-localhost 或自签名证书) -
HTTPOnly: true—— 阻止 JS 访问,防 XSS 盗取 -
SameSite推荐用fiber.SameSiteLaxMode(默认)或fiber.SameSiteStrictMode;若需跨站 POST(如 OAuth 回调),才设fiber.SameSiteNoneMode,且必须搭配Secure: true -
MaxAge和Expires二选一即可,但 JWT 类 Cookie 建议让Expires与 token 的exp字段对齐,避免服务端已过期但浏览器仍发送
示例写法:
cookie := fiber.Cookie{
Name: "auth_token",
Value: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
Path: "/",
MaxAge: 3600,
HTTPOnly: true,
Secure: true,
SameSite: fiber.SameSiteLaxMode,
}
c.SetCookie(&cookie)
JWT 类 Cookie 要分两步解析
别以为 c.Cookies("jwt") 拿到的就是用户 ID——它只是 Base64Url 编码的三段字符串(header.payload.signature)。跳过解析直接用,等于完全信任前端传来的任意值。
- 不能
json.Unmarshal([]byte(c.Cookies("jwt")), &v):那是把整个 JWT 当 JSON 解,会失败 - 正确流程:取值 → 拆成三段 →
base64.RawURLEncoding.DecodeString()解码 payload → 用jwt.Parse()校验 signature 和exp/nbf - 校验必须检查
token.Valid == true,仅靠err == nil不够——过期 token 的err是jwt.ErrTokenExpired,但token对象非 nil
CORS + Cookie 组合最容易漏掉 AllowCredentials
如果前端带了 credentials: "include",而 Fiber 的 CORS 中间件没设 AllowCredentials: true,或者 AllowOrigins 写成 "*",浏览器会静默丢弃响应,连 401 都看不到。
-
AllowOrigins必须是具体域名切片,如[]string{"http://localhost:5173", "https://myapp.com"} - 动态判断可用
AllowOriginFunc,但注意别在函数里 panic(比如对 nilc.Hostname()直接操作) -
AllowHeaders要包含实际用到的字段,例如"Authorization"、"Content-Type",否则预检失败
关键配置片段:
app.Use(cors.New(cors.Config{
AllowCredentials: true,
AllowOrigins: []string{"http://localhost:5173"},
AllowHeaders: []string{"Content-Type", "Authorization"},
}))
最常被忽略的点:Cookie 的 SameSite、Secure、Domain 三者必须和前端请求协议、域名、路径完全匹配,差一点就拿不到;JWT 解析必须走完整校验链,不能只 decode payload 就完事。











