iris中设置cookie需用ctx.setcookie或setcookiekv并显式指定path、secure、httponly等属性,读取用ctx.getcookie;签名需通过cookieencode配合密钥,删除须覆盖同path/domain且maxage≤0的cookie。

如何在 Iris 中设置和读取 Cookie
Iris 默认支持标准 HTTP Cookie 操作,不需要额外中间件。关键在于正确使用 ctx.SetCookie 和 ctx.GetCookie,并注意底层 http.Cookie 的字段约束。
常见错误是直接传字符串给 SetCookie,或忽略 Path、Domain 导致前端读不到;还有人误用 ctx.Request().Cookie()(它不处理已解析的 Secure/HttpOnly 等属性,也不推荐)。
-
SetCookie接收的是*http.Cookie实例,不是 name/value 字符串对;用iris.Cookie辅助函数更安全 - 必须显式设置
Path(通常为"/"),否则浏览器默认设为当前请求路径,导致跨路由失效 - 若启用了 HTTPS,务必同时设
Secure: true和HttpOnly: true(尤其存敏感 token 时) -
GetCookie返回string或空字符串,不抛错;若需区分“不存在”和“值为空”,改用ctx.Request().Cookie(name)并判空指针
示例:
ctx.SetCookie(&http.Cookie{
Name: "session_id",
Value: "abc123",
Path: "/",
MaxAge: 3600,
HttpOnly: true,
Secure: ctx.Request().TLS != nil, // 自动适配 HTTPS
})
如何安全地签名和验证 Cookie
Iris 内置 securecookie 支持,但默认不启用。手动签名 Cookie 是防止客户端篡改 session 数据的关键步骤,尤其当 Cookie 存储用户 ID、权限等非加密敏感信息时。
直接写入未签名的 SetCookie 值等于把逻辑交给前端信任——这不可接受。
- 用
iris.NewCookie+iris.CookieEncoding配合密钥生成编码后 Cookie,比手撸securecookie更轻量 - 密钥必须固定且保密,建议从环境变量加载,不要硬编码;长度建议 ≥ 32 字节
- 签名 Cookie 的
Value是 base64 编码+HMAC,GetCookie会自动解码校验;校验失败时返回空字符串 - 避免对大结构体签名,只签必要字段(如
user_id:role),否则影响传输体积和解析性能
启用方式:
app := iris.New()
app.Use(iris.Compression)
// 启用全局 Cookie 编码(所有 SetCookie 自动签名)
app.Use(iris.CookieEncoding(iris.CookieEncodingConfig{
Key: []byte(os.Getenv("COOKIE_KEY")),
}))
如何删除 Cookie 或使其立即过期
删除 Cookie 不是调用 ctx.RemoveCookie 就完事——它只是清空响应头中的同名项,而浏览器是否清除取决于你发送的过期时间与域路径是否匹配原设置。
最可靠的方式是覆盖写入一个 MaxAge ≤ 0 且 Path/Domain 完全一致的 Cookie。
- 必须复用和原始 Cookie 完全相同的
Path和Domain,否则浏览器视为不同 Cookie,旧的仍存在 - 不要依赖
ctx.RemoveCookie("name")单独使用;它不发任何 Set-Cookie 头,实际无效 - 如果原 Cookie 设了
Secure或HttpOnly,删除时也得带上,否则可能被浏览器忽略 - MaxAge 设为
-1或0均可,但-1是明确语义(立即过期),0在某些旧客户端行为不一致
正确做法:
ctx.SetCookie(&http.Cookie{
Name: "session_id",
Value: "",
Path: "/",
MaxAge: -1,
HttpOnly: true,
Secure: ctx.Request().TLS != nil,
})
为什么 SameSite 设置容易出问题
Iris 12.2+ 支持 SameSite,但默认为 SameSiteDefaultMode,即不显式发送该字段。现代浏览器(Chrome 80+、Firefox 79+)会将其降级为 Lax,导致跨站 POST 请求丢失 Cookie。
如果你的应用有嵌入 iframe、OAuth 回调、或前后端分离跨域提交表单,必须显式控制 SameSite。
- 登录态 Cookie 应设
SameSite: http.SameSiteLaxMode(防 CSRF 且兼容大部分跳转) - 纯 API 场景且确认无跨站请求,可用
SameSiteNoneMode,但必须同时设Secure: true,否则浏览器拒绝 - Iris 不支持字符串字面量赋值(如
"Lax"),必须用http.SameSiteXXXMode常量 - 老版本 Iris(SameSite 字段,升级前先检查
iris.Version
示例(严格模式):
ctx.SetCookie(&http.Cookie{
Name: "auth_token",
Value: token,
Path: "/",
MaxAge: 7200,
HttpOnly: true,
Secure: true,
SameSite: http.SameSiteStrictMode,
})
SameSite 是浏览器策略,服务端无法绕过,配置不对就真拿不到 Cookie —— 这点比加密、过期时间还容易被忽略。











