共计 2066 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点
传统 Session 认证在 Web 应用中广泛使用,但它存在一些明显的局限性。Session 通常存储在服务器内存或数据库中,当用户量增大时,服务器内存压力会显著增加。此外,在分布式系统中,Session 共享也是一个麻烦的问题,需要通过 Redis 等外部存储来解决,增加了系统复杂性。

相比之下,JWT(JSON Web Token)采用无状态设计,所有必要信息都包含在 Token 本身中,服务器不需要保存任何会话信息,这使得它特别适合分布式系统和微服务架构。
JWT 核心原理
JWT 由三部分组成,用点 (.) 分隔:
- Header – 包含 token 类型和使用的算法
- Payload – 包含声明(claims),即用户数据和其他元数据
- Signature – 用于验证消息在传输过程中未被篡改
JWT 的工作流程很简单:
- 用户使用凭证登录
- 服务器验证凭证并生成 JWT
- 客户端存储 JWT 并在后续请求中发送
- 服务器验证 JWT 并处理请求
.NET 实现
基本配置
首先安装必要的 NuGet 包:
dotnet add package System.IdentityModel.Tokens.Jwt
Token 生成
// 配置 JWT 参数
var jwtSettings = new JwtSettings
{
Secret = "your-256-bit-secret",
TokenLifetime = TimeSpan.FromHours(1)
};
// 创建 token
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(jwtSettings.Secret);
var tokenDescriptor = new SecurityTokenDescriptor
{Subject = new ClaimsIdentity(new[]
{new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Role, "Admin")
}),
Expires = DateTime.UtcNow.Add(jwtSettings.TokenLifetime),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key),
SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
Token 验证
在 ASP.NET Core 中集成 JWT 认证:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII
.GetBytes(jwtSettings.Secret)),
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
安全考量
Token 过期和刷新
- 设置合理的过期时间(通常 1 - 2 小时)
- 实现刷新 Token 机制,允许用户在过期后获取新 Token 而无需重新登录
- 使用短生命周期的访问 Token 和较长生命周期的刷新 Token
防止攻击
- 始终使用 HTTPS 传输 JWT
- 避免在 URL 中传递 Token
- 设置适当的 CORS 策略
- 使用 HttpOnly 和 Secure 标志存储 Token
敏感信息
- 不要在 Payload 中存储敏感信息
- 即使加密了,也要假设 Payload 可以被读取
- 使用最小权限原则,只包含必要的声明
性能优化
大规模部署
- 考虑使用非对称加密算法 (RSA) 代替对称加密(HMAC)
- 实现 Token 黑名单用于立即撤销访问
- 使用缓存验证结果减少重复计算
分布式系统
- 所有服务共享相同的签名密钥
- 考虑使用中心化的密钥管理服务
- 实现 Token 验证结果的缓存共享
生产环境避坑指南
常见错误
- 密钥太弱或泄露
- 不验证 Token 签名
- 不检查 Token 过期时间
- 存储敏感信息在 Payload 中
监控建议
- 记录 Token 生成和验证失败
- 监控 Token 使用频率
- 设置异常 Token 使用的告警
总结与进阶思考
JWT 非常适合现代 Web 应用和微服务架构,特别是当需要跨域认证或减少服务器状态时。但它不是万能的,对于需要即时撤销访问的场景,可能需要结合其他机制。
进一步学习方向:
- OAuth 2.0 和 OpenID Connect
- 多因素认证集成
- 无密码认证(如 Magic Link)
- 硬件安全模块 (HSM) 集成
正文完
