Token是API认证的核心凭证,Token安全直接关系到整个系统的安全。访问令牌一旦泄露,攻击者可以冒充用户执行任意操作。本文从Token的全生命周期出发,介绍各环节的安全防护措施和实践经验。
Token生成安全
Token必须具有足够的熵值防止暴力猜测。推荐使用安全的随机数生成器生成至少32字节的随机令牌。令牌内容不要包含用户信息,用户信息应该从服务端查询而非从令牌解析。JWT虽然包含用户信息,但敏感数据不应放入JWT。令牌的签名密钥必须妥善保管,定期轮换。生产环境和测试环境使用不同的密钥,防止测试环境的密钥泄露影响生产系统。
Token传输安全
Token必须通过HTTPS传输,禁止在HTTP连接中传递Token。Token放在HTTP Authorization头中,使用Bearer方案,格式为 Authorization: Bearer
Token存储安全
服务端不存储JWT本身(无状态),但需要存储刷新令牌和黑名单。刷新令牌需要加密存储在数据库中。前端存储Token有三种方式:内存(最安全但页面刷新后丢失)、HttpOnly Cookie(安全但需防CSRF)、LocalStorage(方便但易受XSS攻击)。推荐短时间Token放在内存,刷新令牌放在HttpOnly Cookie中。对于移动端,使用系统提供的安全存储区域。
Token生命周期管理
Token应设置合理的过期时间,访问令牌15分钟到2小时,刷新令牌7天到30天。过期后通过刷新令牌获取新令牌,减少Token泄露的影响。用户修改密码或登出时,所有Token应立即失效。实现方式有刷新令牌轮换和Token黑名单两种。刷新令牌轮换更优雅:每次刷新令牌时同时撤销旧刷新令牌并发放新令牌。Token黑名单将作废的Token加入Redis,每次请求时检查。