未设置max-age或expires的cookie默认为会话级,仅存于浏览器内存,关闭浏览器即清除;ie等旧版浏览器仅认expires,稳妥做法应同时设置两者。

因为浏览器将其视为“会话级 Cookie”,只保留在内存中,不写入磁盘,关闭浏览器时自动清除。
浏览器对未设过期时间的 Cookie 有默认处理规则
当服务端通过 Set-Cookie 响应头下发 Cookie 时,若既没指定 Max-Age(单位秒),也没指定 Expires(GMT 时间戳),浏览器就按规范将其标记为会话 Cookie。此时 Cookie 的 Max-Age 实际被设为 -1,意味着它仅存在于当前浏览器进程的内存里,不落盘、不持久化。
- 关闭单个标签页?不影响该 Cookie(只要浏览器主进程还在)
- 关闭整个浏览器(包括所有窗口)?内存释放,Cookie 立即丢失
- 重启浏览器?无法恢复,因为没有文件或数据库记录它
这不是服务端问题,而是客户端行为
服务端生成的 session 数据(比如存在内存、Redis 或文件中)通常不会因浏览器关闭而自动删除;失效的是客户端发不出有效的 Cookie: session=xxx 请求头。没有这个标识,服务端就无法关联用户上下文,表现就是“登出”或“状态丢失”。
- 换用 Flask-Session 存到 Redis?行为不变——只要 Cookie 丢了,ID 就找不回来
- 后端日志显示 session 还在?正常。问题出在请求链路前端
- 用 curl 或 Postman 模拟请求?只要没带 cookie,同样拿不到 session
IE 和部分旧环境还有兼容性陷阱
某些浏览器(尤其是旧版 IE)完全不识别 Max-Age,只认 Expires。如果服务端只设了 Max-Age 而没同步设 Expires,IE 会把它当作会话 Cookie 处理,关浏览器就丢。
- Chrome/Firefox/Safari:优先用 Max-Age,忽略 Expires(若两者冲突)
- IE/旧 Edge:忽略 Max-Age,只看 Expires;没设 Expires → 当作会话 Cookie
- 稳妥做法:两个都设,例如 Max-Age=1800; Expires=Wed, 11 Sep 2026 16:27:00 GMT
用户端设置也可能覆盖服务端策略
即使服务端正确设置了 Max-Age 和 Expires,如果用户在 Chrome/Edge 中开启了「退出时清除 Cookie 和网站数据」,浏览器会在关闭时强制清空所有 Cookie,包括本该持久化的那些。
- 路径:设置 → 隐私和安全 → Cookies 及其他网站数据 → “退出时清除”
- 该设置优先级高于服务端任何过期参数
- 开发者无法绕过,只能在登录页提示用户检查该选项










