You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现JWT授权:客户端是否需同时持有公钥与私钥?

关于JWT授权中客户端与服务器的密钥持有逻辑

核心结论

客户端绝对不需要持有私钥,私钥必须严格保管在服务器端,客户端仅需持有公钥(仅在需要本地验证Token合法性的场景下使用)。


具体细节说明

  • 客户端所需密钥:仅需公钥(可选)。正常业务流程中,客户端只需接收服务器返回的JWT,后续请求受保护API时将Token放在Authorization请求头即可,Token有效性验证工作由服务器完成。
  • 授权API调用流程:客户端不需要向授权API发送任何密钥。正确流程为:
    1. 客户端提交身份凭证(如账号密码、第三方授权码等)至授权API;
    2. 服务器验证身份凭证合法后,使用自身私钥生成并签名JWT;
    3. 服务器将签名后的JWT返回给客户端;
    4. 客户端后续请求API时携带该JWT,服务器用公钥验证签名有效性,完成授权。
  • 当前做法的风险:让客户端传递私钥给授权API是严重的安全漏洞。私钥是服务器签发合法JWT的核心凭证,一旦泄露,攻击者可伪造任意JWT绕过授权,完全破坏API的安全性,必须立即修改该逻辑。

C# .NET Core 示例代码

服务器端生成JWT

// 注意:私钥需存储在服务器安全配置中(如环境变量、密钥管理器),禁止硬编码或泄露给客户端
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Environment.GetEnvironmentVariable("JWT_PRIVATE_KEY")));
var signingCredentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);

var jwtToken = new JwtSecurityToken(
    issuer: "your-api-domain",
    audience: "your-api-audience",
    claims: new List<Claim> { new Claim(ClaimTypes.NameIdentifier, "user-12345") },
    expires: DateTime.UtcNow.AddHours(1),
    signingCredentials: signingCredentials);

var tokenString = new JwtSecurityTokenHandler().WriteToken(jwtToken);
// 将tokenString返回给客户端

客户端验证JWT(可选)

// 客户端使用服务器公开的公钥验证Token
var validationParams = new TokenValidationParameters
{
    ValidateIssuer = true,
    ValidIssuer = "your-api-domain",
    ValidateAudience = true,
    ValidAudience = "your-api-audience",
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("服务器公开的JWT_PUBLIC_KEY"))
};

var handler = new JwtSecurityTokenHandler();
try
{
    var claimsPrincipal = handler.ValidateToken(clientReceivedToken, validationParams, out _);
    // Token验证通过,可从claimsPrincipal中获取用户信息
}
catch (SecurityTokenValidationException)
{
    // Token无效,处理授权失败逻辑
}

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:10:29