共计 1391 个字符,预计需要花费 4 分钟才能阅读完成。
为什么我们需要 Token?
在传统的 Web 开发中,我们通常使用 Session 和 Cookie 来进行用户身份验证。这种方式在单服务器环境下工作得很好,但在现代分布式系统中会遇到很多问题:

- 扩展性问题 :当应用部署在多台服务器上时,Session 需要在服务器间同步
- 跨域限制 :Cookie 默认不支持跨域请求
- 移动端兼容 :原生 App 难以处理基于 Cookie 的认证
认证方案对比
| 方案 | 适用场景 | 主要缺点 |
|---|---|---|
| Cookie | 传统 Web 应用 | 跨域问题、CSRF 风险 |
| Session | 服务端渲染应用 | 服务器内存消耗、扩展性差 |
| JWT | 前后端分离、分布式系统 | Token 无法主动失效 |
| OAuth2 | 第三方登录、开放平台 | 实现复杂度高 |
JWT 核心实现
Node.js 生成 Token 示例
const jwt = require('jsonwebtoken');
const secret = 'your-strong-secret'; // TODO: 生产环境应从配置读取
// 生成 Token
function generateToken(user) {
return jwt.sign({ userId: user.id}, // payload
secret,
{expiresIn: '1h'} // 过期时间
);
}
// 验证 Token
function verifyToken(token) {
try {return jwt.verify(token, secret);
} catch (err) {console.error('Token 验证失败:', err);
return null;
}
}
前端携带 Token 的两种方式
- Authorization Header (推荐)
axios.get('/api/data', {
headers: {'Authorization': `Bearer ${token}`
}
});
- URL Query 参数 (不推荐,会出现在日志中)
axios.get(`/api/data?token=${token}`);
安全实践要点
Token 存储方案
- LocalStorage:容易受 XSS 攻击,但能防止 CSRF
- HttpOnly Cookie:能防 XSS,但需额外处理 CSRF
防护措施
- 防 XSS(Cross-Site Scripting):
- 对所有用户输入进行转义
-
设置 Content-Security-Policy 头
-
防 CSRF(Cross-Site Request Forgery):
- 检查 Origin/Referer 头部
- 使用 CSRF Token
双 Token 刷新机制
sequenceDiagram
客户端 ->> 服务端: 使用 access_token 请求
服务端 -->> 客户端: token 已过期
客户端 ->> 服务端: 用 refresh_token 请求新 token
服务端 -->> 客户端: 返回新 access_token
常见问题排查
- Token 失效 :
- 检查时钟同步(JWT 依赖时间)
- 验证密钥是否一致
-
检查 Token 是否超过长度限制
-
生产环境配置 :
- 必须使用 RS256 等非对称算法
- 密钥长度至少 2048 位
- 设置合理的过期时间(建议 access_token 15 分钟)
延伸思考
当 Token 被中间人截获时,除了使用 HTTPS 外,我们还可以:
- 绑定客户端指纹(IP/User-Agent)
- 实现短期有效的 Token
- 关键操作增加二次验证
Token 认证是现代 Web 开发的必备技能,希望这篇指南能帮助你快速上手。在实际项目中,记得根据业务需求选择合适的方案,并始终把安全性放在首位。
正文完
