AWS HTTP API Gateway跨区域JWT校验延迟过高问题咨询
JWT授权延迟问题排查与优化方案
基础说明
你提供的SAM配置本身符合AWS规范,不存在配置语法错误,问题与配置逻辑无关。
HttpApi: Type: AWS::Serverless::HttpApi Properties: DisableExecuteApiEndpoint: true StageName: !Ref StageName DefinitionBody: 'Fn::Transform': Name: AWS::Include Parameters: Location: api.yaml Auth: DefaultAuthorizer: OAuth2Authorizer Authorizers: OAuth2Authorizer: IdentitySource: $request.header.Authorization JwtConfiguration: issuer: https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxxxxxxx audience: - xxxxxxxxx
核心原理澄清
- OAuth协议本身没有强制要求每次请求都拉取
.well-known/openid-configuration端点配置,服务端仅需要周期性拉取并缓存签名公钥(JWKS),在密钥未轮换的场景下可以直接用本地缓存完成JWT签名校验,无需额外网络调用。 - AWS HTTP API原生JWT授权器的默认JWKS缓存时长为1小时,仅在缓存冷启动、缓存失效、或者请求中的JWT签名密钥不在缓存中时,才会主动调用配置的issuer端点拉取最新配置。
延迟差异根因
观测到的跨区域部署的API网关延迟暴涨属于架构部署的正常现象:
- eu-west-1区域的API网关和Cognito用户池同区域,拉取配置的网络延迟极低,所以开启授权后延迟仅上涨25ms,属于正常的JWT校验逻辑开销。
- us-east-1区域的API网关需要跨大西洋调用eu-west-1的Cognito端点拉取配置,单次跨区调用的网络开销就可达200~300ms,叠加测试样本量较小(仅50次请求),包含了缓存冷启动的请求,最终平均延迟就会上涨到550ms的水平。如果做长时间稳态压测,稳定状态下的平均延迟会回落至200ms左右,仅缓存失效的少量请求会出现高延迟。
优化方案
方案1:同区域绑定身份提供商
在us-east-1区域独立部署一套Cognito用户池,该区域的API网关直接绑定同区域的Cognito作为JWT发行方,彻底消除跨区拉取配置的开销。如果需要多区域用户数据同步,可以通过Cognito用户导入导出、自定义触发器的方式实现数据同步。
方案2:改用自定义授权器缓存密钥
替换原生JWT授权器为Lambda自定义授权器,在Lambda代码中主动拉取JWKS并设置更长的缓存时长(比如24小时),同时监听Cognito的密钥轮换事件主动更新缓存,大幅降低缓存失效的频率,减少跨区调用的次数。
方案3:硬编码签名公钥
如果你的JWT采用RS256签名,且Cognito密钥轮换频率很低(默认轮换周期大于24小时),可以直接把签名公钥硬编码到自定义授权器逻辑中,完全消除运行时拉取OIDC配置的网络调用,实现最低的授权延迟。
内容的提问来源于stack exchange,提问作者Henk-Jan Uijterlinde
相关产品推荐
相关产品推荐

