在 Go 语言中,this.SetSecureCookie()
通常出现在基于 Beego 框架的代码中(或其他类似 MVC 框架),用于设置加密的安全 Cookie。以下是详细用法和注意事项:
1. 基本语法(Beego 框架)
func (this *YourController) SomeAction() {
// 设置安全 Cookie
this.SetSecureCookie(secret, key, value, maxAge)
}
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
secret |
string |
是 | 加密密钥(需与 cookie_hash_key 配置一致),用于签名和验证 Cookie。 |
key |
string |
是 | Cookie 的名称(如 "user_token" )。 |
value |
string |
是 | Cookie 的值(如用户 ID 或 JWT)。 |
maxAge |
int |
是 | Cookie 有效期(秒),0 表示会话 Cookie,负数表示删除 Cookie。 |
2. 完整示例
(1) 设置安全 Cookie
func (this *MainController) Login() {
userID := "123"
// 设置加密 Cookie,有效期 7 天
this.SetSecureCookie("my-secret-key", "user_id", userID, 7*24*3600)
this.Data["json"] = map[string]string{"status": "success"}
this.ServeJSON()
}
(2) 读取安全 Cookie
func (this *MainController) Profile() {
// 读取加密 Cookie
userID := this.GetSecureCookie("my-secret-key", "user_id")
if userID == "" {
this.Abort("401") // 未登录
}
this.Data["user_id"] = userID
this.TplName = "profile.html"
}
(3) 删除 Cookie
func (this *MainController) Logout() {
// 设置 maxAge 为负数即可删除
this.SetSecureCookie("my-secret-key", "user_id", "", -1)
this.Redirect("/", 302)
}
3. 关键注意事项
(1) 加密密钥安全
- 不要硬编码密钥:应在配置文件(如
conf/app.conf
)中配置:
代码中通过cookie_hash_key = my-secret-key
beego.AppConfig.String("cookie_hash_key")
读取。
(2) 安全性增强
- 启用 HTTPS:
SecureCookie
依赖加密签名,但传输层仍需 HTTPS 防止中间人攻击。 - 配置 Cookie 属性(Beego 全局配置):
beego.BConfig.WebConfig.Session.SessionCookie = "my_session_id" beego.BConfig.WebConfig.Session.Secure = true // 仅 HTTPS 传输 beego.BConfig.WebConfig.Session.CookieSameSite = http.SameSiteStrictMode
(3) 数据限制
- 值大小:Cookie 总大小通常限制在 4KB 以内。
- 数据类型:
value
必须是字符串,复杂数据需序列化(如 JSON)。
4. 底层原理
- 签名验证:使用
secret
对key=value
生成 HMAC 签名,防止篡改。 - 编码存储:将
value
+ 签名拼接后 Base64 编码,存入 Cookie。 - 读取验证:解码后校验签名,确保数据未被修改。
5. 常见问题
(1) Cookie 未生效
- 检查
maxAge
是否为正数。 - 确保客户端未禁用 Cookie。
- 检查域名/路径是否匹配。
(2) 签名错误
// 错误:密钥不一致
this.SetSecureCookie("key1", "user_id", "123", 3600)
value := this.GetSecureCookie("key2", "user_id") // 返回空
(3) 替代方案
若未使用 Beego,标准库 net/http
的加密 Cookie 实现:
func SetSecureCookie(w http.ResponseWriter, secret, key, value string) {
encoded, _ := sc.Encode(key, value)
http.SetCookie(w, &http.Cookie{
Name: key,
Value: encoded,
HttpOnly: true,
Secure: true,
})
}