Cookies 和 Sessions 都用于在 HTTP 请求之间携带用户信息,例如用户登录状态、用户权限等。
1. 简介
1.1 Cookies
Cookies 通常有大小限制(4KB)。携带少量信息,并存储在用户设备上,每次用户后续请求时,Cookies 都会被一同发送。用户可以在浏览器中选择禁用 Cookies。
1.2 Sessions
与 Cookies 不同,Sessions 在服务器端创建并存储。服务器通常会生成一个唯一的 Session ID,并将其与特定的用户会话绑定,这个 Session ID 会通过 Cookie 返回给客户端。Sessions 还可以存储更多的数据。
由于会话数据不直接被客户端访问,Sessions 在安全性上更有优势。
2. 详细对比
Cookies | Sessions | |
---|---|---|
存储位置 | 存储在客户端(浏览器)本地 | 存储在服务器端(内存、数据库、分布式缓存) |
存储容量 | 通常限制为约 4KB | 受服务器存储限制,可保存更多数据 |
生命周期 | 通过 Expires 或 Max-Age 设置过期时间,到期自动删除 |
默认 15~30 分钟不活动后失效,可通过Session Timeout 配置 |
安全性 | 数据可被用户查看或篡改(可用 HttpOnly 来防止 JS 读取,配合 Secure 标记强制 HTTPS 传输) |
只在客户端存储 Session ID,数据在服务器端,更安全 |
网络传输开销 | 每次请求自动携带 Cookie 数据,增加网络负载 | 仅传输 Session ID,数据本身不随请求发送 |
跨域限制 | 受同源策略限制,可通过 Domain 、Path 调整 |
依赖 Cookie 传输 Session ID,同样受跨域限制 |
可扩展性(分布式场景) | 天然支持跨服务器 | 需 Session 共享机制(Redis、Memcached)或 Sticky Session |
典型使用场景 | 用户偏好设置(主题、语言)、记住登录状态、用户行为跟踪 | 存储登录用户信息、权限数据、购物车等敏感信息 |
3. 衍生问题
1. 如果禁用 Cookies,Session 还能用吗?
不能直接用,因为客户端无法存储 Session ID,可以考虑将 Session ID 放在 URL 参数或其他存储方式中,但存在安全风险(容易被窃取)。
2. 如何防止 Session 固定攻击(Session Fixation)?
登录成功后生成新的 Session ID,避免复用旧的 ID。
3. Cookie 如何防止被 XSS 窃取?
设置 HttpOnly 和 Secure 属性,并配合 CSP(内容安全策略)防御 XSS。
4. Session 在分布式系统中如何保持一致?
使用集中式存储(Redis、Memcached)来保存 Session 数据,避免单机 Session 丢失。
5. Cookies 和 JWT 的区别?
JWT(JSON Web Token)是一种无状态的认证方式,信息保存在客户端,不需要服务器保存会话数据。Cookies 是一种存储机制,JWT 可以放在 Cookie 中,也可以放在 LocalStorage 里。