文章目录
一、三兄弟的诞生背景(为什么要有它们?)
互联网世界的认证难题就像咱们去银行办业务:
- 每次都要带身份证(烦!)
- 不带证件银行不认识你(惨!)
- 带复印件可能被盗用(危!)
传统Web开发的灵魂三问:
- 怎么记住用户登录状态?
- 怎么防止请求被伪造?
- 怎么保证数据传输安全?
(敲黑板)这就是三兄弟存在的根本原因!!!接下来咱们逐个解剖它们的"身体构造"
二、Cookie:会说话的饼干
2.1 基础结构解析
Set-Cookie: user=老王; Expires=Wed, 21 Oct 2025 07:28:00 GMT; Domain=rmsys.top; Path=/; Secure; HttpOnly
- 键值对存储(像Python字典)
- 过期时间控制(时间管理大师)
- Domain/Path限定作用范围(安全隔离)
- Secure强制HTTPS传输(防偷窥)
- HttpOnly禁止JS操作(防XSS)
2.2 实战中的骚操作
// 前端操作cookie的经典姿势
document.cookie = "theme=dark; max-age=3600";
// Node.js后端设置cookie
response.setHeader('Set-Cookie', ['token=abc123; SameSite=Strict']);
(注意坑点):
- 浏览器对cookie数量和大小的限制(4KB警告!)
- 跨域问题中的SameSite属性(现代浏览器的紧箍咒)
- 敏感信息裸奔风险(千万别存密码!)
三、Session:服务端的记事本
3.1 会话管理流程图解
用户登录 -> 生成sessionID -> 存入cookie -> 后续请求携带ID -> 服务端校验 -> 返回数据
3.2 内存型Session的实现
from uuid import uuid4
sessions = {}
def login(request):
session_id = str(uuid4())
sessions[session_id] = {
'user_id': 123,
'last_login': datetime.now()
}
response.set_cookie('sessionID', session_id)
return response
(致命缺陷警报):
- 单机部署没问题,集群部署要老命!
- 内存泄漏风险(程序员的噩梦)
- 横向扩展困难(加机器就崩)
四、Token:新时代的通行证
4.1 JWT结构拆解(三部分组成的艺术品)
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. # Header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. # Payload
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c # Signature
4.2 自研Token系统的核心逻辑
public String createToken(User user) {
String header = Base64.encode("{\"alg\":\"HS256\"}".getBytes());
String payload = Base64.encode(("{\"userId\":"+user.id+",\"exp\":"+(System.currentTimeMillis()+3600000)+"}").getBytes());
String signature = HMACSHA256(header + "." + payload, SECRET_KEY);
return header + "." + payload + "." + signature;
}
(超实用技巧):
- 在payload里埋彩蛋(记录登录设备/IP)
- 双Token机制(access_token + refresh_token)
- 黑名单方案处理即时失效
五、三兄弟的终极对决
Cookie | Session | Token | |
---|---|---|---|
存储位置 | 浏览器 | 服务端 | 客户端 |
安全性 | 较低(易被篡改) | 高 | 取决于实现 |
扩展性 | 天然支持跨域 | 集群环境需要中间件 | 天生适合分布式 |
性能 | 无状态 | 服务端内存消耗 | 解密消耗CPU |
典型场景 | 记住登录状态 | 敏感操作验证 | 移动端/API认证 |
(避坑指南):
- 金融系统用Session更稳妥(需要即时失效)
- 微服务架构首选Token(天生分布式友好)
- 永远不要用localStorage存敏感信息!(XSS漏洞重灾区)
六、现代认证的最佳实践
推荐组合拳方案:
- 首次登录生成Refresh Token(存数据库)
- 签发短期Access Token(建议1小时)
- 每次请求携带Access Token
- 过期后用Refresh Token续期
安全加固技巧:
# 强制HTTPS(HSTS头)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 防止点击劫持
add_header X-Frame-Options DENY;
# CSP内容安全策略
add_header Content-Security-Policy "default-src 'self'";
七、写给新手的建议(血泪经验)
- 不要重复造轮子!Spring Security、Passport.js等框架不香吗?
- 一定要理解OAuth2.0和OpenID Connect(现代授权标准)
- 定期更换加密密钥(建议使用密钥管理系统)
- 监控异常登录行为(异地登录提醒)
- 重要操作二次验证(短信/邮箱验证码)
(终极忠告):安全无小事!认证系统被攻破≈整个系统裸奔。建议至少每季度做一次安全审计,别忘了做渗透测试!
八、彩蛋:自研认证系统踩坑集锦
- 时间同步问题:JWT校验时发现服务器时间不同步(上NTP服务!)
- Token注销难题:采用短有效期+黑名单妥协方案
- 密钥管理事故:把密钥提交到GitHub(连夜跑路警告)
- 跨域认证陷阱:CORS配置错误导致认证失败
- 日志泄露敏感信息:错误日志打印了完整Token(记得脱敏!)
最后说句掏心窝的话:认证系统就像房子的门锁,你可以买最便宜的家具,但千万别在门锁上省钱!