setcookie 七个参数必须严格按 name, value, maxage, path, domain, secure, httponly 顺序填写:name/value需非空且url编码;maxage单位为秒,-1立即删除;path推荐"/";domain本地用"localhost"、上线用完整域名;secure仅https设true;httponly敏感信息必为true。

SetCookie 的七个参数怎么填才不踩坑
直接看 SetCookie 函数签名:func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)。这七个参数顺序固定,漏掉或错位会导致编译失败或行为异常。
常见错误是把 maxAge 当成毫秒或传负数但没意识到它等于删除操作;还有本地调试时硬写 "localhost" 却忘了生产环境必须用真实域名(否则浏览器拒绝发送)。
-
name和value:必须非空,且value不能含控制字符或未编码的特殊符号(如空格、分号),建议先用url.QueryEscape处理 -
maxAge:单位是秒。0 表示不设Max-Age字段(依赖浏览器会话生命周期);-1 表示立即删除;正数才是有效过期时间 -
path:推荐用"/",除非你明确要限制到子路径(比如"/admin");注意路径区分大小写 -
domain:开发时可填"localhost",但上线必须填完整域名(如"example.com"),不能带端口;若想覆盖子域,需加前导点(".example.com"),但当前主流浏览器对localhost不支持该写法 -
secure:HTTP 环境下必须为false,否则浏览器直接忽略该 Cookie;HTTPS 环境下建议设为true -
httpOnly:涉及敏感信息(如 session token)务必设为true,否则 JS 可读取,XSS 风险陡增
读 Cookie 时为什么总是 err != nil
c.Cookie("key") 返回两个值:string 和 error。很多新手只检查 err == nil 就认为有值,但其实只要客户端没发这个 key,或者浏览器因 Secure/Domain 不匹配而没携带,都会返回 error。
典型现象:本地跑正常,部署后读不到 —— 很可能是 domain 设成 "localhost" 但线上访问的是 "example.com",导致浏览器根本不会附带该 Cookie。
- 确认请求 URL 的协议、域名、端口和
SetCookie时的domain/path/secure完全匹配 - 用浏览器开发者工具的 Application → Cookies 面板,直接查看当前域名下实际存了哪些 Cookie、属性是否符合预期
- 不要依赖
err判断“用户未登录”,而应结合业务逻辑(比如 fallback 到无状态 token 或重定向登录)
删除 Cookie 的正确姿势是设 maxAge = -1
很多人误以为删 Cookie 要调用单独的删除方法,其实 Gin 没提供 DeleteCookie,而是复用 SetCookie:把 maxAge 设为 -1,浏览器收到 Max-Age: 0 就立刻丢弃。
注意:必须保证 name、path、domain 三个参数和当初设置时完全一致,否则旧 Cookie 不会被覆盖或清除。
- 错误写法:
c.SetCookie("token", "", -1, "/api", "example.com", true, true)—— 如果原来设的是path="/",这里用"/api"就清不掉 - 安全起见,删除时
value可任意(甚至空字符串),但path和domain必须严格复刻设置时的值 - 如果设置了
httpOnly,JS 无法手动清除,只能靠服务端下发删除指令
SameSite 属性 Gin 原生不支持,得绕一下
Gin 的 SetCookie 没暴露 SameSite 参数,但现代浏览器默认按 Lax 处理,跨站 POST 请求可能被拦截(比如从第三方页面提交表单到你的 API)。
解决办法是不用 c.SetCookie,改用标准库的 http.SetCookie 手动构造:
cookie := &http.Cookie{
Name: "session_id",
Value: "abc123",
MaxAge: 3600,
Path: "/",
Domain: "example.com",
Secure: true,
HttpOnly: true,
SameSite: http.SameSiteLaxMode, // 或 http.SameSiteStrictMode / http.SameSiteNoneMode
}
http.SetCookie(c.Writer, cookie)
注意:SameSite=None 必须搭配 Secure: true,否则浏览器拒绝接受;调试时若用 HTTP + None,会静默失败。
真正容易被忽略的是:不同浏览器对 SameSite 的默认策略差异很大,尤其老版本 Chrome 和 Safari 行为不一致,上线前务必在目标用户常用浏览器中实测跨站场景。











