共计 2618 个字符,预计需要花费 7 分钟才能阅读完成。
认证机制的基本原理
在 Web 应用中,用户认证是确保系统安全的第一道防线。传统的 Session 机制虽然简单,但在分布式系统中面临扩展性问题。Token-Based 认证应运而生,其中 Access Token 和 Refresh Token 的组合成为主流方案。

- 为什么需要区分两种 Token
- Access Token 用于直接访问资源,生命周期较短(通常几分钟到几小时)
- Refresh Token 用于获取新的 Access Token,生命周期较长(几天到数月)
-
分离设计实现了 ” 纵向权限分离 ”:即使 Access Token 泄露,攻击窗口也很有限
-
Session 与 Token 的对比
- Session 依赖服务器存储,Token 是自包含的
- Token 天然支持跨域,更适合现代前后端分离架构
- 无状态特性更易实现水平扩展
JWT 与 OAuth2 的 Token 实现差异
- JWT 的实现特点
- 标准化结构(Header.Payload.Signature)
- 自包含声明(claims)减少数据库查询
-
签名验证确保完整性但无法撤销
-
OAuth2 的 Token 处理
- 不限定 Token 格式,常用不透明令牌(opaque token)
- 必须通过 Token Introspection 端点验证
-
集中式吊销机制更完善
-
混合方案最佳实践
- 用 JWT 作为 Access Token 减少验证开销
- Refresh Token 采用数据库存储实现可撤销性
- 关键操作要求重新认证(step-up authentication)
Spring Security + JWT 实战实现
核心依赖配置
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
}
Token 生成服务
@Service
public class TokenProvider {@Value("${jwt.secret}")
private String secretKey;
// Access Token 生成(有效期 30 分钟)public String createAccessToken(Authentication authentication) {return Jwts.builder()
.setSubject(authentication.getName())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1800000))
.signWith(SignatureAlgorithm.HS512, secretKey)
.compact();}
// Refresh Token 生成(有效期 7 天)public String createRefreshToken(Authentication authentication) {return Jwts.builder()
.setSubject(authentication.getName())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 604800000))
.signWith(SignatureAlgorithm.HS512, secretKey)
.compact();}
}
安全配置类
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
}
Token 生命周期管理策略
- 过期时间设置原则
- 金融类应用:Access Token 5-15 分钟,Refresh Token 24 小时
- 社交类应用:Access Token 2- 4 小时,Refresh Token 30 天
-
关键考虑因素:
- 业务敏感程度
- 用户活跃模式
- 合规性要求(如 GDPR)
-
动态调整策略
- 根据用户设备信任度调整有效期
- 异常地理位置触发立即过期
- 风险评估系统联动控制
安全防护措施
- 常见攻击防范
- CSRF 防护:
- 严格校验 Origin/Referer 头
- 关键操作要求二次认证
- XSS 防护:
- HttpOnly + Secure Cookie
- CSP 策略限制脚本加载
-
Token 泄露应对:
- 短期有效期 + 刷新机制
- 实时黑名单检查
-
传输安全要求
- 必须使用 HTTPS
- 避免 URL 参数传递
- 响应头设置
Cache-Control: no-store
生产环境避坑指南
-
存储最佳实践
- Refresh Token 必须持久化存储
- 使用加密存储(如 AES-GCM)
- 关联设备指纹信息
-
吊销方案对比
- 黑名单方案:适合中小规模系统
- 短期令牌 + 轮换:无需维护状态
- 分布式缓存:Redis 集群存储令牌状态
-
性能优化技巧
- 异步验证签名
- 热点 Token 本地缓存
- 批量吊销优化
进阶思考问题
- 如何实现跨域 SSO 场景下的 Token 共享与安全隔离?
- 在 Serverless 架构中如何设计无状态吊销机制?
- 量子计算时代如何升级现有签名算法体系?
通过这套组合方案,我们既能保证认证流程的安全性,又兼顾了用户体验。实际落地时还需要根据业务特点做针对性调整,建议从严格的策略开始,逐步放宽限制直到找到平衡点。
正文完
