HttpOnly 是 Cookie 的安全标志,禁止 JavaScript 通过 document.cookie 读取敏感 Cookie(如 session_id),仅允许浏览器自动随请求发送,是防御 XSS 窃取会话凭证的底线配置。

HttpOnly 是什么,为什么必须设
HttpOnly 不是“让 Cookie 更安全的可选项”,而是防止 XSS 窃取 session_id 的底线配置。一旦没设,攻击者在页面注入一段 document.cookie 就能直接拿到明文令牌——哪怕你用了 JWT 或加密 session ID,只要值在 Cookie 里且没 HttpOnly,就等于白给。
它不阻止浏览器自动发送,只禁止 JS 读写。服务端用 c.Cookie() 依然能正常读取,完全不影响逻辑。
- 开发时容易漏:本地跑 HTTP 服务,
Secure: true会被浏览器静默丢弃,但HttpOnly: true不受协议影响,该设就得设 - 别信“我前端不用 JS 读,所以不用 HttpOnly”——XSS 攻击不依赖你是否主动读,只依赖 Cookie 是否可被脚本访问
- 如果用
gorilla/securecookie加密,HttpOnly 仍是必需的:加密防篡改,HttpOnly 防窃取,二者解决不同问题
怎么用 c.SetCookie() 正确设置 HttpOnly
Echo 不接受键值对式调用,必须传 *http.Cookie 实例。错写成 c.SetCookie("session_id", "abc123", ...) 会编译失败或行为不可控。
正确写法:
cookie := &http.Cookie{
Name: "session_id",
Value: "abc123",
MaxAge: 3600,
Path: "/",
Domain: "example.com", // 开发时若用 localhost,此处留空或填 "127.0.0.1"
HttpOnly: true,
Secure: false, // HTTP 环境必须为 false;HTTPS 生产环境才设 true
SameSite: http.SameSiteLaxMode,
}
c.SetCookie(cookie)
-
Domain填错会导致 HttpOnly 生效但浏览器不发送:比如后端地址是localhost:8080,却设Domain: "example.com",浏览器直接忽略整条 Set-Cookie -
Path必须覆盖请求路径:若你只在/api/下发请求,但设了Path: "/auth",那请求进不到该路径就不会带 Cookie -
Secure: true在 HTTP 下无效,Chrome 会直接不存;开发阶段务必确认这个布尔值是动态判断的(如根据c.Request().TLS != nil)
为什么 c.Cookie() 能读到 HttpOnly Cookie
这是常见误解的源头:c.Cookie() 读的是 HTTP 请求头里的原始 Cookie 字符串,不是前端 JS 的 document.cookie。HttpOnly 只限制 JS 访问,不限制浏览器在请求中自动携带——所以服务端永远能读到。
如果你发现 c.Cookie("session_id") 返回 http.ErrNoCookie,问题一定不在 HttpOnly 上,而在于:
- 浏览器 DevTools → Application → Cookies 里根本没这个条目(SetCookie 没生效)
- Domain/Path/Secure 匹配失败,导致浏览器压根没存
- SameSite=Lax 且请求来自外站跳转(如从微信内嵌浏览器点进来),浏览器按策略不发送
- 跨域请求没配
credentials: 'include'和响应头Access-Control-Allow-Credentials: true
容易被忽略的三个边界情况
HttpOnly 设对了,不代表万事大吉。这三个点线上最容易出问题,且很难复现:
- Chrome 91+ 对第三方上下文更敏感:如果 Cookie 的
SameSite是Lax且没设Secure: true,在 iframe 或跨站 POST 场景下可能被浏览器拦截,导致服务端收不到 —— 这时c.Cookie()自然为空,但和 HttpOnly 无关 - Nginx 等反向代理默认不透传 Cookie 头:需确认配置含
proxy_pass_request_headers on;,否则请求到 Echo 时 Header 已被清空 - 多个子域名共用同一 Cookie 时,
Domain必须显式设为顶级域(如example.com),不能留空;留空等价于当前 hostname(www.example.com),子域间无法共享


















