我们打开网页时,有时会弹出弹窗,询问是否接受cookie?那么究竟什么是cookie,其又有什么作用?
一、各自是什么?
| 名称 | 存放位置 | 作用 | 生命周期(默认) |
|---|---|---|---|
| Cookie | 浏览器本地(随域名保存的小键值对) | 把数据随每次 HTTP 请求自动带给同一域名的服务器 | 浏览器关闭或 Expires/Max-Age 到期 |
| Session | 服务器内存 / Redis / 数据库等 | 保存“一整份”与用户相关的会话数据(登录状态、购物车、权限等) | 通常设闲置超时 + 服务器重启即失效 |
二、它们怎么协作?——会话识别 流程
-
首次请求
浏览器 → 服务器(没有 Cookie)。 -
服务器创建 Session
-
生成 随机的 SessionID(如
2f8e5c9aa...)。 -
把用户状态存在服务器端的 Session 存储里,键就是这个 ID。
-
-
服务器回响应
-
在
Set-Cookie里写入session_id=2f8e5c9aa...; Path=/; HttpOnly; Secure。
-
-
后续请求
-
浏览器自动带上
Cookie: session_id=2f8e5c9aa...。 -
服务器按
session_id找回 Session 数据,识别出同一位用户。
-
关键点:
Cookie 里通常只放一个轻量的 Session 标识;真正的会话数据仍在服务器,因此更安全,可存任意复杂结构。
如果浏览器禁用 Cookie,可以用 URL 重写、隐藏表单字段等方式携带 SessionID,但体验与安全性都会下降。
三、两者的典型区别
| 维度 | Cookie | Session |
|---|---|---|
| 存储方 | 客户端 | 服务器 |
| 容量 | 单个 ~4 KB,域名上限约 20 个 | 取决于服务器资源 |
| 安全性 | 容易被窃取/篡改,需要加 HttpOnly、Secure、SameSite | 服务端掌控,配合 HTTPS 更安全 |
| 跨域 | 受同源策略,无法跨二级域以外 | 不受限制,可在同一 DB 中共享 |
| 适用场景 | 记住主题色、上次搜索词、简单持久化 | 登录态、购物车、权限控制、临时大数据 |
四、衍生方案:无状态 Token 与持久化 Session
| 方案 | 核心思路 | 与 Cookie/Session 的关系 |
|---|---|---|
| JWT / OAuth2 Token | 服务端只生成签名过的 Token 并返回,后续校验 Token 签名,不依赖服务器存储 | Token 可放在 Cookie 或 Header,减少服务器 Session 压力 |
| Session 持久化(Redis、DB) | 把 Session 数据持久化,支持分布式、断电恢复 | 仍需 Cookie 储存 SessionID,但服务器可水平扩展 |
五、总结一句话
Cookie 是客户端保存的“凭条”;Session 是服务器保存的“档案”。浏览器拿着 Cookie(SessionID)来办事,服务器据此查档,才能认出它是谁。
二者结合使用,就能在 “HTTP 无状态” 的世界里,为同一位用户维持有状态且安全的交互体验。
1127

被折叠的 条评论
为什么被折叠?



