文章目录
一、为什么我们需要它们?
当你登录淘宝查看订单时,系统怎么记住你是张三而不是李四?当你在B站刷视频突然断网,重新连接后为什么不需要重新登录?(灵魂发问)这都要归功于今天要讲的三大护法:Cookie、Session、Token!
二、Cookie:互联网世界的通行证
2.1 初识Cookie
想象一下你去游乐园,工作人员在你手上盖的隐形印章(肉眼不可见但紫外线灯下可见)。Cookie就是这样一个存在,服务器通过Set-Cookie
响应头给浏览器发的小纸条。
// 服务端设置Cookie示例(Node.js版)
response.setHeader('Set-Cookie', ['user_id=9527; Max-Age=3600', 'theme=dark; Secure']);
2.2 工作原理四部曲
- 首次访问:浏览器裸奔(没带Cookie)
- 服务端响应:塞给你身份证(Set-Cookie)
- 后续请求:自动出示身份证(自动携带Cookie)
- 服务端验票:核对身份证信息
2.3 优缺点大PK
✅ 优点 | ❌ 缺点 |
---|---|
简单易用 | 容易被CSRF攻击(后面会讲防御方案) |
客户端存储省资源 | 有4KB大小限制 |
支持跨域(配置得当) | 明文传输可能被窃听 |
2.4 适用场景推荐
- 记住用户语言偏好(如中英文切换)
- 存储非敏感主题配置(暗黑模式/明亮模式)
- 电商网站的浏览历史记录(用户未登录时)
三、Session:服务端的秘密小本本
3.1 Session的本质
服务端有个保险箱(内存/数据库),每个用户分配一个独立抽屉(SessionID)。这个抽屉钥匙就是通过Cookie传给浏览器的session_id
。
# Flask框架的session使用示例
from flask import session
@app.route('/login')
def login():
session['user'] = 'zhangsan' # 自动设置Cookie
return '登录成功'
3.2 生命周期全解析
- 用户登录:开保险箱新建抽屉(创建Session)
- 服务存储:用户信息锁进抽屉
- 请求到来:核对钥匙有效性(验证SessionID)
- 超时销毁:30分钟不用自动清空(可配置)
3.3 致命弱点预警
⚠️ 集群部署时会出现「抽屉找不到」的尴尬情况!这时候需要:
- 使用Redis等集中存储方案
- 配置Sticky Session粘性会话
- 或者…直接改用Token方案(伏笔)
四、Token:新时代的令牌侠
4.1 JWT结构解剖
一个标准的JWT令牌长这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
拆开看是三段式结构:
头.载荷.签名
↓ ↓ ↓
加密算法 用户数据 防伪标识
4.2 颁发流程全揭秘
(流程图说明:用户登录→验证通过→生成Token→返回给客户端→客户端存localStorage)
4.3 优势暴击三连
- 无状态:服务端不用存数据
- 防CSRF:不用自动携带
- 跨域友好:适合APP、小程序等移动端
五、世纪大对决:选型决策指南
5.1 同台竞技参数表
维度 | Cookie | Session | Token |
---|---|---|---|
存储位置 | 浏览器 | 服务端 | 客户端 |
安全性 | 较低 | 较高 | 中高 |
扩展性 | 受限(4KB) | 依赖存储方案 | 无限制 |
适用场景 | 简单状态保持 | 传统Web系统 | 分布式/跨平台 |
5.2 黄金选择法则
- 传统Web网站 → Session + Cookie(经典组合)
- 移动端/API服务 → Token方案(JWT/OAuth2)
- 简单配置存储 → Cookie足矣(比如主题切换)
六、防坑指南(血泪经验)
6.1 Cookie安全三板斧
- 设置HttpOnly防XSS
// Java设置安全Cookie
Cookie cookie = new Cookie("user","zhangsan");
cookie.setHttpOnly(true);
cookie.setSecure(true); // 仅HTTPS传输
- SameSite属性防CSRF
- 签名+加密敏感数据
6.2 Token续期方案
推荐双Token策略:
- Access Token(短效,2小时)
- Refresh Token(长效,7天)
当Access Token过期时,用Refresh Token静默续期
七、高频灵魂拷问
Q1:Token被盗怎么办?
立即拉黑!服务端维护Token黑名单,关键操作需二次验证(短信/邮箱)
Q2:Session和Token能混用吗?
可以但没必要!比如用Session存权限信息,用Token做API认证,会增加系统复杂度
Q3:移动端如何存Token?
推荐:
- iOS → Keychain
- Android → EncryptedSharedPreferences
- 跨平台 → 安全存储SDK
八、最佳实践路线图
最后说两句
三剑客没有绝对的好坏(重要的事情说三遍),就像选女朋友要看合不合适。最近在做微服务改造,把用了5年的Session方案迁移到JWT,过程中踩过的坑都能写本小说了。下次可以单独聊聊JWT的深水区玩法,比如动态秘钥轮转、无感刷新这些高阶姿势~