共计 1282 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
在现代 Web 开发中,身份验证和授权是一个核心问题。传统的 Session 机制存在扩展性差、跨域问题多等缺点,而 Access Token(访问令牌)作为一种轻量级的解决方案,逐渐成为主流。开发者在使用 Access Token 时,常常会遇到以下几个痛点:

- Token 泄露 :如果 Token 被恶意获取,攻击者可以冒充用户进行操作。
- Token 过期 :如何优雅地处理 Token 过期,避免用户频繁登录。
- 跨域问题 :在微服务架构中,如何保证 Token 在不同服务间的有效传递。
- 安全攻击 :如 CSRF(跨站请求伪造)、XSS(跨站脚本攻击)等。
核心概念
什么是 Access Token?
Access Token 是一个短期的令牌,用于代表用户访问受保护的资源。它通常有一个较短的有效期(如 1 小时),过期后需要重新获取。
Refresh Token
Refresh Token 是一个长期的令牌,用于在 Access Token 过期后获取新的 Access Token。它的有效期较长(如 7 天),但只能用于刷新 Token,不能直接访问资源。
JWT(JSON Web Token)
JWT 是一种常见的 Token 格式,由三部分组成:
1. Header:指定 Token 的类型和签名算法。
2. Payload:包含用户信息和其他声明(如过期时间)。
3. Signature:用于验证 Token 的完整性和真实性。
技术实现
以下是一个使用 Node.js 生成和验证 JWT 的示例代码:
const jwt = require('jsonwebtoken');
const secret = 'your-secret-key';
// 生成 Access Token
function generateAccessToken(user) {
return jwt.sign({ userId: user.id, username: user.username},
secret,
{expiresIn: '1h'}
);
}
// 生成 Refresh Token
function generateRefreshToken(user) {
return jwt.sign({ userId: user.id},
secret,
{expiresIn: '7d'}
);
}
// 验证 Token
function verifyToken(token) {
try {return jwt.verify(token, secret);
} catch (err) {return null;}
}
安全与性能
Token 存储
- HttpOnly Cookie:防止 XSS 攻击,但需要注意 CSRF 防护。
- LocalStorage:易于实现,但容易受到 XSS 攻击。
防范重放攻击
- 使用一次性 Token(Nonce)。
- 限制 Token 的使用次数或时间窗口。
避坑指南
- 硬编码密钥 :密钥应存储在环境变量或配置文件中,避免直接写在代码里。
- 过长的过期时间 :Access Token 的过期时间不宜过长,通常建议 1 - 2 小时。
- 不验证 Token:每次请求都必须验证 Token 的有效性。
互动环节
思考题
如何实现分布式系统的 Token 撤销?
欢迎在评论区分享你的解决方案,或者动手实现一个简单的 Token 验证服务。
正文完
