iris 中 cookie 和 session 是两套独立但常配合使用的状态管理机制:cookie 由客户端存储、服务端控制写入与读取;session 默认基于 cookie 传递 id,真实数据存在服务端(内存/redis 等)。

直接说结论:Iris 中 Cookie 和 Session 是两套独立但常配合使用的状态管理机制,Cookie 由客户端存储、服务端控制写入与读取;Session 默认基于 Cookie 传递 ID,真实数据存在服务端(内存/Redis 等)。别指望用 SetCookieKV 存用户登录态——该存 Session。
怎么安全地设置和读取 Cookie
Iris 提供了封装好的 SetCookieKV 和 GetCookie,比原生 net/http 更省事,但默认行为有陷阱:
-
SetCookieKV("theme", "dark")会设一个有效期 365 天的持久 Cookie,且HttpOnly=true、Secure=false—— 如果跑在 HTTPS 环境下却没显式开Secure,浏览器可能拒绝发送它 - 想关掉
HttpOnly(比如前端 JS 需要读取),必须用iris.CookieHTTPOnly(false)显式覆盖,默认值不给你改 - 路径默认是
/,若只希望某子路由可用,得加iris.CookiePath("/admin") - 编码/解码需配对使用:
iris.CookieEncode写入时生效,iris.CookieDecode读取时触发;若只设 encode 没设 decode,GetCookie返回的是乱码字符串
Session 初始化必须指定存储后端
只调 sessions.New 不够,它默认用内存存储(memory),重启服务就丢 Session。生产环境至少得连 Redis:
- 用 Redis:导入
github.com/kataras/iris/v12/sessions/sessiondb/redis,然后传redis.Config{Addr: "127.0.0.1:6379"}给sessions.Config{Database: ...} - Cookie 名不能硬写成
"mySession"—— 它会暴露 Session ID 的命名习惯,建议用随机字符串或从环境变量读 -
Cookie.HttpOnly默认 true(合理),但Cookie.Secure默认 false,HTTPS 站点务必手动设为 true,否则浏览器不发这个 Cookie - Session 过期时间靠
Expires字段控制(单位秒),不是靠 Cookie 的MaxAge;两者不同步时,以 Session 自身配置为准
Session.GetXXX 系列方法的类型安全边界
session.GetString、GetInt、GetBoolean 看似方便,但底层都走 interface{} 转换,失败时不 panic,而是静默返回零值:
-
sess.SetInt("age", "25")—— 存了个字符串,后面sess.GetInt("age")返回 0,不会报错也不会提示类型错 -
sess.GetFlash是一次性读取(读完自动删),适合存跳转提示消息,但不能当普通字段反复读 - 存结构体?必须先
json.Marshal成字节再SetString,读出来再json.Unmarshal;直接Set("user", userStruct)会 panic - 没有
SetFloat64,只有SetFloat(对应float32),存精度要求高的数字要小心
Cookie 和 Session 混用时最易忽略的点
很多人以为 “Session ID 在 Cookie 里,所以改 Cookie 就能伪造 Session”,其实 Iris 默认做了防护:
- Session ID 生成用的是 cryptographically secure 随机数,不是时间戳或自增 ID
- 如果启用了
Config.Decode(比如加了签名),服务端会校验 Cookie 值是否被篡改,非法修改直接拒掉,返回空 Session - 跨域请求(如前端在
http://a.com调http://api.b.com)时,Cookie默认不带,必须前后端同时配SameSite=none+Secure=true,且前端 fetch 加credentials: 'include' - Session 数据本身不加密,只是签名防篡改;敏感字段(如权限列表)仍建议服务端查库确认,别全信 Session 里的内容











