Fiber中c.Cookie()读取前需先用c.SetCookie()显式设置,否则返回空或error;其读取的是客户端携带的原始Cookie(无签名校验),domain/path必须匹配请求源,SameSite需手动配置以防跨域丢失。

使用 c.Cookie() 读取前必须先用 c.SetCookie() 设置
Fiber 不会自动解析或维护 Cookie 状态,c.Cookie("name") 只能读取已由 c.SetCookie() 显式写入响应头的 Cookie,或客户端在请求中携带的原始 Cookie(不校验签名)。如果你跳过设置步骤直接读,会返回空字符串或 error。
常见错误现象:c.Cookie("session_id") 总是返回 "" 或 ErrNoCookie,但 c.Cookies() 却能看到原始键值——说明没走框架的签名/加密流程,只是裸数据。
- 必须调用
c.SetCookie(name, value, maxAge, path, domain, secure, httpOnly)才能让后续请求带上该 Cookie -
maxAge单位是秒,设为0表示会话级(浏览器关闭即失效),负数表示立即过期 -
secure和httpOnly建议始终设为true(开发环境若无 HTTPS,可临时设false,但上线前必须改回)
SetCookie() 的 domain 和 path 必须匹配请求来源
如果前端域名是 app.example.com,后端 API 在 api.example.com,且你想共享 Cookie,domain 必须设为 ".example.com"(注意开头的点),否则浏览器按同源策略拒绝发送。
路径不匹配也会导致 Cookie 不被携带:比如你设了 path: "/admin",但前端请求的是 /api/users,这个 Cookie 就不会附在请求头里。
-
path默认是"/",建议显式传入,避免隐式行为差异 -
domain若为空或未设,浏览器只在当前主机名下生效(如localhost或127.0.0.1不等价) - 本地开发时,
domain: "localhost"是安全的;生产环境必须用真实二级域并加点前缀
需要签名验证?Fiber v2 没内置,得自己加中间件
Fiber 官方 SetCookie() 不提供自动签名或加密,c.Cookie() 读到的就是明文。这意味着攻击者可篡改 Cookie 值绕过权限检查——除非你自己实现校验逻辑。
典型做法是:设置 Cookie 时,拼接 value + secret + timestamp 算出 HMAC,一并存入另一个 Cookie(如 session_sig);读取时重新计算比对。
- 不要依赖
httpOnly防篡改——它只防 XSS 读取,不防 MITM 或本地修改 - 若项目已引入
github.com/gofiber/fiber/v2/middleware/session,优先用它管理会话,底层自动签名+存储隔离 - 自定义签名中间件里,务必校验
maxAge对应的时间戳,防止重放
跨域请求下 Cookie 不生效?检查 SameSite 和前端配置
Fiber 默认不设置 SameSite 属性,现代浏览器(Chrome 80+)会默认按 Lax 处理。当你的前端发 POST 请求到 Fiber 后端且跨域时,Cookie 很可能被静默丢弃。
解决方法是手动在 SetCookie() 中指定 sameSite 参数(v2.50+ 支持):
c.SetCookie("token", "abc", 3600, "/", "example.com", true, true, "strict")
-
"strict"最安全,但会阻断所有跨站导航带 Cookie 的场景 -
"lax"平衡体验与安全,允许 GET 导航(如点击链接)携带 Cookie,但禁止 POST 表单提交 -
"none"必须搭配secure: true,且前端 fetch 要加credentials: "include"
容易被忽略的是:即使后端设置了 SameSite="none",前端 fetch 若没写 credentials,浏览器照样不发 Cookie。


















