Session Cookie 和 Persistent Cookie 有什么区别?
Session Cookie 不设 Expires 和 Max-Age 属性,浏览器将其存在内存中,关闭浏览器即消失;Persistent Cookie 设有明确的过期时间,存储在磁盘上,过期前跨会话持久存在。服务端通过 Set-Cookie 响应头控制类型:不设过期属性是 Session Cookie,设 Max-Age 或 Expires 则为 Persistent Cookie。安全层面两者都应标记 HttpOnly 和 Secure,Persistent Cookie 因长期驻留磁盘更易被窃取,敏感数据应避免持久化。SameSite 属性(Strict/Lax/None)对两者同样适用,防止 CSRF 攻击。
追问
浏览器关闭后 Session Cookie 一定被清除吗? 不一定。现代浏览器有恢复会话功能(如 Chrome 的继续浏览上次打开的网页),会将 Session Cookie 写入磁盘以便恢复,实际表现等同于 Persistent Cookie。依赖关闭即清除做安全假设是不可靠的。
Max-Age 和 Expires 有什么区别? Max-Age 是相对秒数,从收到 Cookie 时起算;Expires 是绝对时间点,依赖客户端时钟。Max-Age 优先级更高(RFC 6265),两者都不设则为 Session Cookie。
Session Cookie 能存多少数据? 和 Persistent Cookie 一样受 4KB 限制,区别仅在于生命周期,不在容量。大量数据应改用 localStorage 或 IndexedDB。
如何强制 Session Cookie 在标签页关闭时清除? 无法可靠实现。可用的替代方案:用 sessionStorage(标签页级)或服务端维护有效期并主动使 Session 失效。
写段代码
javascript// 服务端设置两种 Cookie res.setHeader('Set-Cookie', [ 'sid=abc123; HttpOnly; Secure; SameSite=Lax', // Session Cookie 'theme=dark; Max-Age=31536000; HttpOnly; SameSite=Lax' // Persistent Cookie ]);