一句话总结:
Cookie 是用户随身携带的会员卡,Session 是店里的会员档案,两者配合让服务器记住你是谁!
一、Cookie:用户的会员卡
作用:
- 身份标识:记录用户基本信息(如登录状态、语言偏好)。
- 跟踪行为:记录浏览历史、购物车内容。
原理:
- 
发卡:用户首次访问网站,服务器通过 Set-Cookie响应头下发“会员卡”。HTTP/1.1 200 OK Set-Cookie: user_id=123; Path=/; Expires=Wed, 21 Oct 2023 07:28:00 GMT
- 
出示:后续每次请求,浏览器自动在请求头中夹带 Cookie。 GET /profile HTTP/1.1 Cookie: user_id=123
特点:
- 存在客户端:浏览器存储,可被用户查看或禁用。
- 大小限制:单个 Cookie ≤4KB,每个域名下最多约50个。
安全贴士:
- 敏感信息别存Cookie:如密码,用 HttpOnly和Secure标志防XSS和明文传输。
二、Session:店里的会员档案
作用:
- 安全存储:保存敏感信息(如用户ID、权限、购物车详情)。
原理:
- 建档:用户登录后,服务器创建Session(如存入Redis),生成唯一 Session ID。
- 关联:将 Session ID通过Cookie发给用户(如JSESSIONID=abc123)。
- 查档:用户后续请求携带 Session ID,服务器据此读取档案。
代码示例(Java):
// 创建Session并存数据  
HttpSession session = request.getSession();  
session.setAttribute("user", loggedInUser);  
// 读取Session数据  
User user = (User) session.getAttribute("user");  
特点:
- 存在服务端:内存、数据库或Redis,用户无法直接修改。
- 依赖Cookie传ID:若禁用Cookie,需URL重写(如 ;jsessionid=abc123)。
三、Cookie vs Session 对比表
| 特性 | Cookie | Session | 
|---|---|---|
| 存储位置 | 浏览器 | 服务器 | 
| 安全性 | 低(用户可篡改) | 高(服务端控制) | 
| 数据大小 | 小(≤4KB) | 大(受服务器内存限制) | 
| 生命周期 | 可设置长期有效 | 通常随会话结束(浏览器关闭) | 
| 性能影响 | 无(客户端存储) | 有(服务器查询开销) | 
四、协作流程(咖啡店会员为例)
- 
首次进店(无卡) : - 你点咖啡,店员(服务器)问手机号(登录)→ 创建档案(Session)→ 给你会员卡(Cookie含Session ID)。
 
- 
再次进店(有卡) : - 出示会员卡(Cookie)→ 店员查档案(Session)→ 直接按喜好推荐咖啡。
 
- 
会员卡丢了(Cookie失效) : - 需重新登录 → 发新卡(新Session ID)。
 
五、常见问题
1. 禁用Cookie怎么办?
- URL重写:将Session ID附加在URL后(如 <a href="/cart;jsessionid=abc123">),但安全性差。
2. 如何防止Session劫持?
- HTTPS:加密传输Session ID。
- 定期更换Session ID:用户登录后生成新ID。
- 绑定IP/User-Agent:校验来源一致性。
3. 分布式系统如何共享Session?
- 集中存储:用Redis或数据库存Session,多服务器共享。
总结口诀
“Cookie小卡随身带,Session档案存后台。
登录状态靠它俩,无状态HTTP不再衰。
敏感数据放Session,Cookie传ID别乱来!”