go语言处理cookie核心是http.setcookie写响应头、r.cookie读请求头;必须避免req.addcookie误用、未判err导致panic、httponly/secure/samesite缺失等三大高频错误。

Go 语言处理 Cookie 的核心就两件事:用 http.SetCookie 往响应头写,用 r.Cookie 或 r.Cookies() 从请求头读——但字段配错、错误没判、过期逻辑混用,90% 的问题都出在这三处。
设置 Cookie 必须用 http.SetCookie,不是 req.AddCookie
新手常误以为 req.AddCookie 是“发 Cookie 给浏览器”,其实它只是把已收到的 Cookie 再塞回 *http.Request 对象里,对响应完全无影响。真正下发必须走 http.SetCookie(w, cookie),其中 w 是 http.ResponseWriter。
-
http.Cookie结构体里,Name和Value必填,其他字段全可选但强烈建议显式设 -
Path默认是"/",但如果路由是/api/v1,又只想让该路径下携带 Cookie,就得手动写Path: "/api/v1" -
MaxAge和Expires别同时设——MaxAge优先级更高;设MaxAge: -1才算“立即删除”,设0反而可能被当成会话 Cookie(行为因浏览器而异) -
Secure: true在非 HTTPS 环境下会导致 Cookie 不被浏览器保存(开发时容易卡在这里)
r.Cookie("name") 返回指针,不判 err 就 panic
r.Cookie("name") 返回的是 *http.Cookie 和 error,找不到时返回 nil, http.ErrNoCookie。直接解引用 cookie.Value 而不检查 err,运行时必 panic。
- 正确写法是:
if cookie, err := r.Cookie("token"); err == nil { ... },别用:=在 if 条件里声明变量再在块外用 - 如果只是想取值,更安全的模式是:
cookie, _ := r.Cookie("theme"); val := "";if cookie != nil { val = cookie.Value } -
r.Cookies()返回[]*http.Cookie,遍历时仍要检查每个元素是否为nil(虽然通常不会,但某些解析异常可能导致)
HttpOnly、SameSite 不设等于裸奔
默认构造的 http.Cookie{} 所有安全字段都是零值:HttpOnly: false、SameSite: 0(即未设置),这会让 Cookie 暴露在 XSS 攻击下,或被跨站请求带上引发 CSRF。
-
HttpOnly: true能阻止前端 JS 读取敏感 Cookie(如 session ID),但后端读写不受影响 -
SameSite推荐设为http.SameSiteLaxMode(防大部分 CSRF)或http.SameSiteStrictMode(更严);设http.SameSiteDefaultMode会被现代浏览器拒绝(需配合Secure: true) -
Domain字段若留空,浏览器只允许同域匹配;若设为"example.com",则api.example.com和www.example.com都能收到——但注意不能设为"com"或带协议
删除 Cookie 实际是“覆盖一个已过期的 Cookie”
HTTP 协议没有“删除”动作,所谓删除,就是用相同 Name、Path、Domain 发一个 MaxAge: -1 的 Cookie,让浏览器立刻丢弃旧值。
- 关键点:新 Cookie 的
Path和Domain必须和原来一致,否则浏览器视为另一个 Cookie,旧的还在 - 示例:
http.SetCookie(w, &http.Cookie{Name: "session", Value: "", MaxAge: -1, Path: "/", Domain: "example.com"}) - 如果原 Cookie 是
HttpOnly: true,删除时也得保持HttpOnly: true,否则部分浏览器可能不认
最易忽略的是:同一个域名下多个子路径设置的 Cookie,Path 不一致就会互相看不见;还有本地开发用 http://localhost:8080 测试时设了 Secure: true,结果 Cookie 死活不存——这些细节不写死在代码里,光靠“应该可以”是扛不住真实环境的。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











