Go 操作 Cookie 必须用 http.SetCookie 和 r.Cookie 原生接口:自动处理 URL 编码、时间格式与多 Cookie 分隔;删除需完全匹配 Name/Path/Domain/Secure/SameSite;HttpOnly、Secure、SameSite 为安全必需项。

Go 里操作 Cookie 不是拼字符串或手动写 Set-Cookie 头,必须用 http.SetCookie 和 r.Cookie 这套原生接口——否则值不编码、过期时间格式错、特殊字符乱码,浏览器直接忽略。
设置 Cookie 必须用 http.SetCookie,不能手写响应头
很多人试过直接 w.Header().Set("Set-Cookie", "name=value; Path=/; Max-Age=3600"),这会出问题:Value 不做 URL 编码,空格、中文、等号全崩;Max-Age 格式不对时浏览器静默丢弃;多个 Cookie 还得自己分号拼接。
-
http.SetCookie(w, cookie)自动处理 URL 编码、Expires时间格式、多 Cookie 分隔 -
cookie.Value传原始字符串就行,比如"user@domain.com",不用提前url.QueryEscape - 若要设多个 Cookie,重复调用
http.SetCookie即可,不要合并成一个头
r.Cookie(name) 返回错误要显式判断 http.ErrNoCookie
直接 if err != nil 判断会把「没带 Cookie」和「解析失败」混为一谈,导致本该跳登录页的请求返回 500。
-
err == http.ErrNoCookie表示客户端根本没发这个 Cookie(比如首次访问) -
err != nil && err != http.ErrNoCookie才是真异常,比如 Cookie 值损坏、超长、编码错 -
cookie.Value已自动解码,拿到的就是原始字符串,不用再url.QueryUnescape
删除 Cookie 的本质是覆盖:MaxAge=0 + 完全一致的 Name/Path/Domain/Secure/SameSite
只设 MaxAge=0 不够。如果原 Cookie 是 Path="/admin",你删的时候用 Path="/",浏览器根本不会清除它。
立即学习“go语言免费学习笔记(深入)”;
- 构造删除用的
*http.Cookie时,Name和Path必须跟当初设置时完全一样 - 如果设置了
Domain(如"example.com"),删的时候也得带上;localhost开发时别设Domain,否则无效 -
Secure=true的 Cookie,删的时候也得设Secure=true,否则 HTTPS 页面下删不掉
HttpOnly 和 Secure 不是可选项,是上线前必须确认的开关
开发时关 Secure 能跑通,但一旦部署到真实域名,没开 Secure 就等于把 session ID 明文贴在 HTTP 流量里——中间人秒抓;不开 HttpOnly,XSS 攻击一行 JS 就能盗走 token。
-
Secure=true:生产环境强制开启;本地开发用http://localhost时可临时关,但代码里建议用配置开关控制 -
HttpOnly=true:只要 Cookie 存的是 session_id、auth_token 这类服务端凭证,就必须开 -
SameSite=http.SameSiteLaxMode:防 CSRF 的底线配置,比Strict兼容性好,比None安全
最容易被忽略的是路径和域名的一致性——设的时候 Path="/",删的时候却漏写了,或者开发时设了 Domain="localhost" 导致 Cookie 根本存不进浏览器。这些细节不验证,线上就表现为「登录后刷新就掉登」「删 Cookie 总失败」。


















