Beego中SetCookie和GetCookie基础用法:SetCookie(key,value,maxAge,path)写入明文Cookie,maxAge为秒数(-1表示会话级),path需显式指定(如"/");GetCookie(key)读取,返回空字符串可能因过期、path不匹配或域名不符;二者均不支持HttpOnly/Secure/SameSite,需用Ctx.Output.Cookie手动设置。

Beego 中 SetCookie 和 GetCookie 的基础用法
Beego 默认的 Cookie 读写是明文传输,不带加密或签名,直接调用 SetCookie 和 GetCookie 即可完成基本操作,但仅适用于非敏感字段(比如语言偏好、主题色)。
常见错误现象:浏览器开发者工具里看到 Cookie 值是纯文本(如 user_id=123),可被用户随意修改,服务端照单全收。
-
SetCookie第三个参数是过期秒数,设为负数(如-1)表示 Session Cookie(关闭浏览器即失效) - 第四个参数是
path,务必显式指定(如"/"),否则子路径无法读取 -
GetCookie返回空字符串时,不代表没设置,可能是过期、path 不匹配或域名不一致 - 若需 HttpOnly 或 Secure 标志,得用底层
Output.Cookie方法手动传参,SetCookie封装不支持
示例:
func (c *MainController) Get() {
c.Ctx.SetCookie("theme", "dark", 3600, "/")
theme := c.Ctx.GetCookie("theme") // 返回 "dark"
}Beego 原生加密 Cookie:启用 SecureCookie 引擎
Beego 内置了基于 gorilla/securecookie 的加密支持,但**不是默认开启**。它会对整个 Cookie 值做 HMAC 签名 + 可选加密(AES),防止篡改和窃读。
关键配置项必须写在 app.conf 中(代码中设置无效):
-
sessionon = true:必须开启 Session,因为加密 Cookie 实际是作为 Session provider 使用的 -
sessionprovider = "cookie":强制 Session 数据存于 Cookie 本身(即“无服务端存储”的模式) -
sessionname = "myapp_session":自定义 Cookie 名,避免和普通 Cookie 冲突 -
cookiekey = "a-32-byte-long-secret-key-here-12345678901234567890123456789012":32 字节密钥,用于 HMAC;若启用 AES 加密,还需额外配cookieencryptionkey
配置生效后,SetSession/GetSession 操作实际写入/读取的是加密后的 Cookie,而非明文。此时 GetCookie("myapp_session") 看到的是 Base64 编码+签名的乱码,无法伪造。
绕过 Session 机制,单独加密任意 Cookie 值
如果只想加密某个业务字段(如 user_token),又不想把它塞进 Session,就得手动集成 gorilla/securecookie。
步骤:
- 安装:
go get github.com/gorilla/securecookie - 全局初始化一个
*securecookie.SecureCookie实例(建议放在main.go初始化阶段) - 用
Encode(name, value)生成加密字符串,再传给Ctx.Output.Cookie - 读取时用
Decode(name, cookieValue, &dst)解包,失败则返回 error
注意点:
- 密钥长度必须是 32 或 64 字节,不足会 panic;可用
md5.Sum或crypto/rand生成 -
Encode输出的值不能直接给SetCookie,因为它不含Path/HttpOnly等属性,必须用Ctx.Output.Cookie手动构造 - 解码失败(如密钥不一致、被篡改)时,
Decode返回 error,不要忽略它
示例片段:
var sc = securecookie.New(
[]byte("32-byte-auth-key-xxxxxxxxxxxxxxxx"),
[]byte("32-byte-encrypt-key-yyyyyyyyyyyyyyyy"),
)
<p>func (c <em>MainController) SetEncryptedToken() {
token := map[string]interface{}{"uid": 123, "exp": time.Now().Add(24 </em> time.Hour).Unix()}
if encoded, err := sc.Encode("user_token", token); err == nil {
c.Ctx.Output.Cookie("user_token", encoded, 3600, "/", "", false, true)
}
}为什么 SetCookie 明文值在 HTTPS 下仍不安全
即使部署在 HTTPS 上,明文 Cookie 仍面临两个风险:一是用户本地篡改后重放(服务端无校验逻辑),二是跨站脚本(XSS)攻击下被 JS 直接读取并外泄。
Beego 的 cookie Session provider 和手动 securecookie 都能解决第一个问题(防篡改),但第二个问题必须配合 HttpOnly=true(阻止 JS 访问)和 SameSite=Strict(防 CSRF)一起用。
容易被忽略的地方:
-
SetCookie不支持HttpOnly参数,必须用Ctx.Output.Cookie(name, value, maxAge, path, domain, secure, httpOnly)全参数版本 -
SameSite在 Beego 1.12+ 才通过output.Cookie第 7 个参数支持(传"Strict"或"Lax"字符串) - 加密密钥一旦上线就不能轻易更换,否则所有存量 Cookie 解码失败,用户被迫登出


















