在 fiber 中设置 cookie 需正确配置 path、domain、secure 和 expires/maxage 四个参数;读取时注意大小写、samesite 策略及 httponly 限制;删除需覆盖并匹配原 path/domain。

如何在 Fiber 中设置和读取 Cookie
直接用 c.Cookie() 和 c.Cookies() 就能完成基础读写,但实际用起来常因路径、域名、安全标志或过期时间配置不当导致 Cookie 不生效或无法读回。
设置 Cookie 时必须注意的四个参数
Fiber 的 c.Cookie() 是封装了标准 HTTP Set-Cookie 头的便捷方法,但漏掉关键参数会让 Cookie 在浏览器里“消失”:
-
Path默认是/,如果设成/admin却在/下发请求,就写不进去 -
Domain必须匹配当前域名(如example.com),不能带http://或端口;本地开发用localhost时不能设Domain,否则浏览器直接忽略 -
Secure设为true时,只在 HTTPS 下发送;开发环境没配 HTTPS 就别开它,否则 Cookie 不会存 -
Expires或MaxAge至少填一个,否则是 Session Cookie,关浏览器就丢
示例:
c.Cookie(&fiber.Cookie{
Name: "session_id",
Value: "abc123",
Path: "/",
Domain: "example.com", // 生产环境才填;localhost 开发时删掉这行
Secure: true, // 仅限 HTTPS
HTTPOnly: true,
MaxAge: 3600,
})
读取 Cookie 为什么总是返回空字符串
常见原因不是代码写错,而是前端或网络层干扰:
- 浏览器没发送 Cookie:检查请求头是否有
Cookie:字段;若用了credentials: 'omit'(fetch 默认),浏览器根本不会附带 Cookie - 名称大小写敏感:
c.Cookies("Session_ID")≠c.Cookies("session_id") - SameSite 策略拦截:如果后端设了
SameSite: "Strict",跨站跳转后就不会带 Cookie;调试时建议先设SameSite: "Lax" - HTTPOnly 的 Cookie 只能服务端读,JS 用
document.cookie拿不到 —— 这是正常行为,不是 bug
安全起见,推荐始终用 c.Cookies("name") 读,它自动处理 URL 解码和空值判断:
sessionID := c.Cookies("session_id")
if sessionID == "" {
c.Status(fiber.StatusBadRequest).SendString("missing session_id")
return
}
删除 Cookie 的正确姿势
别用 c.ClearCookie("name") 就以为完事了 —— 它只是清内存里的副本,不发响应头。真正删 Cookie 要靠覆盖:
- 把
Value设为空字符串 - 把
Expires设为过去的时间(如time.Now().Add(-1 * time.Hour)) - 确保
Path和Domain与当初设置时完全一致,否则删的是另一个 Cookie
示例:
c.Cookie(&fiber.Cookie{
Name: "session_id",
Value: "",
Path: "/",
Domain: "example.com",
Expires: time.Now().Add(-1 * time.Second),
HTTPOnly: true,
})
最麻烦的其实是路径和域名不一致导致删不干净,尤其在子路径部署(比如 /api/v1)时,Path 必须对齐,否则旧 Cookie 会残留。











