fiber框架默认不内置session支持,必须显式集成github.com/gofiber/fiber/v2/middleware/session;开发用内存存储需设gcinterval≥5分钟,生产必须用redis等持久化存储并复用客户端,读写前须校验会话是否存在,cookie需正确配置domain、secure、samesite及maxage以匹配后端ttl。

Session 必须手动集成,不内置也不自动初始化
Fiber 框架压根没有默认 Session 支持,ctx.Session() 这类方法根本不存在——你调用就会 panic。必须显式引入 github.com/gofiber/fiber/v2/middleware/session 并调用 session.New() 初始化存储实例。
常见错误是直接写 session.New() 就跑,结果开发环境看似正常,一上生产就丢会话:
- 内存存储(默认)只适合单实例调试,重启即丢,且
GCInterval默认为 0,不设值会导致内存持续上涨 - 生产必须用持久化后端,Redis 是首选;传
&session.Config{Store: redis.New(&redis.Config{Addr: "127.0.0.1:6379"})},注意redis.New()要全局复用,别每次 new 一个新客户端 - 别在 handler 里反复调
session.New(),它返回的是 store 实例,不是 session 对象;session 对象要靠store.Get(ctx)拿
读写 Session 前必须检查是否存在,否则悄悄发 Cookie
store.Get(ctx) 返回 nil, err 是常态——用户首次访问、Cookie 过期、ID 被篡改都会导致失败。但很多人直接链式调用 store.Get(ctx).Set("user_id", 123),结果:err 被忽略,Session 自动新建,响应头塞了个无意义的 Set-Cookie,前端却没存下有效会话。
正确姿势是显式判空:
- 读取:先
sess, err := store.Get(ctx),再if err == nil && sess != nil { sess.Get("user_id") } - 写入:同样确认
sess != nil再sess.Set(),避免无效初始化 - 销毁会话用
sess.Destroy(),不是sess.Delete("key")——后者只删键,ID 还活着 - Cookie 名默认是
session_id,如需改名,初始化时传Config{Cookie: session.CookieConfig{Name: "my_sid"}}
Cookie 属性错一个,前端就收不到 Set-Cookie
抓包看到响应有 Set-Cookie: my_sid=xxx,但后续请求死活不带这个 Cookie——八成是属性配错了。
跨域、HTTPS、浏览器策略三者叠加,缺一不可:
- 前后端分离时,前端 fetch 必须带
credentials: 'include',Axios 要设withCredentials: true - 若 API 在
api.example.com,前端在www.example.com,必须设Cookie.Domain = ".example.com" - HTTPS 环境下
Cookie.Secure = true必开,否则 Chrome/Firefox 直接拒收 - Chrome 对
SameSite收紧,默认行为已不兼容多数场景,务必显式设为http.SameSiteLaxMode(Lax)或http.SameSiteStrictMode(Strict) -
Cookie.MaxAge和 Redis 中的 TTL(如EX 1800)必须一致,否则会话提前失效或滞留
CSRF 防护和 Session 不是自动绑定的
哪怕你已经用了 session.New(),csrf.New() 也不会自动关联 session——除非你明确把 session 中间件放在 csrf 之前,并且配置了 ContextKey 匹配。
更关键的是:CSRF 中间件默认不从 Cookie 提取 token,它只查表单字段 _csrf 和 header X-CSRF-Token。想让它读 csrf_token 这个 Cookie,必须手动配:
TokenLookup: "cookie:csrf_token"CookieName: "csrf_token"CookieSameSite: fiber.CookieSameSiteLaxMode
而且中间件不会自动下发这个 Cookie,你得在登录成功响应里手动写:c.Cookie(&fiber.Cookie{Name: "csrf_token", Value: token.String(), Secure: true, SameSite: fiber.CookieSameSiteLaxMode})。漏掉任何一环,403 就等着你。











