这个问题要搞清楚,本质上是在理解 Web 登录的底层机制。
👉 Cookie 是客户端存储机制
👉 Session 是服务端存储机制
👉 两者是“配合使用”的,而不是对立关系
一、先用一句话理解
👉 Cookie:
浏览器帮你“记东西”
👉 Session:
服务器帮你“记身份”
二、Cookie 原理(客户端)
1️⃣ Cookie 是什么?
本质就是浏览器保存的一小段数据:
key=value
比如:
sessionId=abc123
2️⃣ Cookie 工作流程
第一次请求:
浏览器 → 服务器(没有cookie)
服务器返回:
Set-Cookie: sessionId=abc123
注意:sessionId 是服务器给每个用户会话分配的“唯一身份证号”
之后每次请求:
浏览器自动带上:
Cookie: sessionId=abc123
👉 重点:
Cookie 是浏览器自动带的,不需要你手动写代码
3️⃣ Cookie 特点
存在浏览器(客户端)
每次请求自动携带
有大小限制(约4KB)
可以设置过期时间
三、Session 原理(服务端)
1️⃣ Session 是什么?
服务器上的一块存储(内存 / Redis):
sessionId → 用户数据
比如:
abc123 → { userId: 1001, username: "yang" }
2️⃣ Session 工作流程
第一次登录:
1. 用户登录
2. 服务端创建 session
3. 生成 sessionId(如 abc123)
4. 返回给浏览器(通过 Cookie)
后续请求:
浏览器带 cookie(sessionId)
↓
服务器根据 sessionId 查 session
↓
找到用户信息 → 放行
四、Cookie + Session 关系(核心)
很多人误解,这里帮你理清:
Cookie:负责“传递 sessionId”
Session:负责“存储用户数据”
👉 完整链路:
浏览器(Cookie: sessionId)
↓
服务器(Session存用户信息)
五、为什么需要 Session?
因为:
👉 HTTP 是无状态的!
请求1:登录
请求2:访问接口
服务器默认不知道这两个请求是同一个人。
👉 Session 的作用:
让服务器“记住你是谁”
六、Cookie 和 Session 的区别
七、为什么说 Cookie 不安全?
因为:
可以被窃取(XSS)
可以被篡改
明文可见(除非加密)
👉 所以:
一般 Cookie 只存 sessionId
不存敏感数据
八、Session 的问题(你做后端必须知道)
❗1. 分布式问题
请求1 → 服务器A(有session)
请求2 → 服务器B(没有session ❌)
👉 解决:
Session共享(Redis)
❗2. 内存压力
用户多:
100万用户 → 100万session
❗3. 扩展性差
每次请求都要查:
内存 / Redis
九、这就是为什么出现 JWT
👉 对比一下:
👉 JWT:
不用存 session,直接靠 token 识别用户
十、总结(你可以记住这张图)
【Session方案】
浏览器
↓(Cookie: sessionId)
服务器
↓
Session(存用户)
【JWT方案】
浏览器
↓(token)
服务器
↓
解析token(不存状态)
十一、给你一个更深一层理解(关键)
👉 本质区别:
Session:
用“ID + 存储”换身份
JWT:
用“签名 + 自带信息”换身份