拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

jose 远程 JWKS 缓存类型 JWKSCacheInput 全解析:在无状态云运行时中持久化 JWKS 缓存

jose 远程 JWKS 缓存类型 JWKSCacheInput 全解析:在无状态云运行时中持久化 JWKS 缓存 网络安全认证鉴权后端【免费下载链接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes项目地址https://gitcode.com/gh_mirrors/jo/jose点击查看免费下载在 Node.js、浏览器、Cloudflare Workers 等无状态云运行时中createRemoteJWKSet默认的内存缓存会在每次函数调用后丢失导致频繁的 HTTP 拉取。本文以 jose 仓库中JWKSCacheInput类型别名docs/jwks/remote/type-aliases/JWKSCacheInput.md为主线讲解如何利用jwksCache选项将远程 JWKS 缓存种子化并持久化到外部存储彻底规避无状态环境下的重复请求与冷启动延迟。读完本文你将掌握JWKSCacheInput的精确类型结构、uat时间戳的刷新判定机制以及一套可直接上线的缓存读写实战模式。JWKSCacheInput 是什么一行类型别名背后的双重形态JWKSCacheInput是 jose 为远程 JWKS 解析器createRemoteJWKSet定义的缓存注入类型它本身是一行非常简洁的联合类型JWKSCacheInput ExportedJWKSCache | Recordstring, never也就是说传入[jwksCache]选项的对象要么是一个结构完整的导出缓存对象ExportedJWKSCache即从持久化存储中读回的、包含jwks与uat的已缓存数据一个空对象{}即Recordstring, never表示当前没有任何历史缓存需要解析器通过 HTTP 请求拉取并回填。这个设计的核心用意在源码 src/jwks/remote.ts 中写得很直白JWKSCacheInput ExportedJWKSCache | Recordstring, never。它让调用方在有缓存与无缓存两种状态下使用同一个选项位置而解析器会通过运行时检查typeof cache object与isJwkSet(jwks)自动区分两种形态见 src/jwks/remote.ts。完整的类型定义与文档参见 docs/jwks/remote/type-aliases/JWKSCacheInput.md它由 jwksCache 变量文档链接引出属于RemoteJWKSetOptions的四个核心选项之一docs/jwks/remote/interfaces/RemoteJWKSetOptions.md。ExportedJWKSCache缓存对象的具体字段JWKSCacheInput的第一种形态由接口ExportedJWKSCache描述docs/jwks/remote/interfaces/ExportedJWKSCache.md它只有两个字段字段类型说明jwksJSONWebKeySet当前缓存的 JSON Web Key Set 内容uatnumberLast Updated At 时间戳单位为自 epoch 起的毫秒数milliseconds since epoch其中uat是这套缓存机制的时间轴核心解析器每次成功抓取 JWKS 后都会用Date.now()刷新它源码 src/jwks/remote.ts而调用方正是通过对比读入时记录的 uat与验证后对象上的 uat是否变化来判断是否需要回写持久化存储。jwks字段则保存本次缓存的实际密钥集数据供后续验证直接复用。jwksCache一个 unique symbol 选项JWKSCacheInput出现在RemoteJWKSetOptions中是通过[jwksCache]这个计算属性键访问的。jwksCache本身是一个unique symbolsrc/jwks/remote.ts在文档中被定义为变量 jwksCache。该选项有两个明确的作用作为 JWKS 的初始值如果传入的缓存对象满足新鲜度条件解析器就无需触发 HTTP 请求直接用种子数据构造本地解析器作为抓取结果的回写目标当解析器因缺少匹配键或缓存过期而触发 HTTP 请求成功后会把新的jwks与uat直接赋值为传入对象的属性。[!WARNING] 该选项具有安全影响必须确保传入的缓存对象只能被你自己的代码写入。如果该对象被不可信代码篡改攻击者就能注入伪造的 JWKS从而用自己掌控的公钥通过签名验证。文档在 jwksCache 中对此给出了明确警告。底层原理缓存新鲜度与冷启动避免结合源码 src/jwks/remote.ts这套机制依赖两个时间窗口cacheMaxAge默认 600000 ms即 10 分钟判断种子/缓存的 JWKS 是否仍然新鲜fresh。isFreshFor(uat, cacheMaxAge)通过Number.isFinite(timestamp) Date.now() timestamp duration判定。若种子数据不新鲜解析器会直接忽略它并触发拉取。cooldownDuration默认 30000 ms即 30 秒一次成功抓取后的冷却窗口防止在窗口期内因JWKSNoMatchingKey反复打爆远程端点。因此即使你从存储中读回了过期的缓存对象也不会产生错误——解析器会把它当作无效种子走正常的网络拉取流程并把新结果回填到同一个对象上。测试 test/jwks/remote.test.ts 专门验证了这一点对uat为NaN、Infinity或明显过期时间戳的缓存resolver.jwks()一律返回undefined即种子不被采用。完整实战模式无状态运行时的缓存读写循环jwksCache 文档给出了这套机制的标准用法核心流程分为四步验证前从云运行时提供的低延迟键值存储如 Cloudflare KV中取出上次持久化的缓存对象兜底若无历史缓存默认使用空对象{}注入将对象作为[jwksCache]选项传给createRemoteJWKSet回写验证完成后若对象的uat属性已发生变化则把整个对象写回键值存储。完整示例来自 jwksCache 的 Example 部分// Prerequisites let url!: URL let jwt!: string let getPreviouslyCachedJWKS!: () Promisejose.ExportedJWKSCache let storeNewJWKScache!: (cache: jose.ExportedJWKSCache) Promisevoid // Load JSON Web Key Set cache —— 从 KV 存储读回无缓存时兜底为 {} const jwksCache: jose.JWKSCacheInput (await getPreviouslyCachedJWKS()) || {} const { uat } jwksCache // 记录读入时的 uat用于判断缓存是否更新 const JWKS jose.createRemoteJWKSet(url, { [jose.jwksCache]: jwksCache, }) // Use JSON Web Key Set cache —— 正常验证 JWT await jose.jwtVerify(jwt, JWKS) if (uat ! jwksCache.uat) { // Update JSON Web Key Set cache —— uat 变了说明发生过拉取回写存储 await storeNewJWKScache(jwksCache) }适用场景边界不要在有内存缓存的运行时使用文档明确强调jwksCache专为无法在两次调用之间保留内存缓存的云运行时设计例如 Cloudflare Workers、Vercel Edge 等无状态执行环境。源码 src/jwks/remote.ts 中也出现了针对 Cloudflare Workers / Vercel Edge 的环境检测逻辑印证了这一设计初衷。而在能跨请求保留内存缓存的传统运行时长驻的 Node.js 进程、Bun、Deno 服务等中直接使用该选项反而不合适——解析器自身已经具备内存缓存再引入外部存储反而增加读路径延迟。这类场景应使用默认行为让createRemoteJWKSet自行维护内存缓存即可。关联能力完整的远程 JWKS 选项家族JWKSCacheInput只是RemoteJWKSetOptions的一个组成部分docs/jwks/remote/interfaces/RemoteJWKSetOptions.md其余选项可在同一场景下组合使用选项类型默认值约束说明timeoutDurationnumber5000非负整数HTTP 请求超时毫秒超时后请求被中止、验证失败cooldownDurationnumber30000不可为NaN一次成功抓取后的冷却期毫秒cacheMaxAgenumber600000不可为NaN两次成功 HTTP 请求之间的最大间隔毫秒headersRecordstring, string——随请求发送的 HTTP 头[jwksCache]JWKSCacheInput——缓存种子与回写对象[customFetch]FetchImplementation全局fetch—自定义 fetch 实现支持代理、重试等其中customFetch用于接入 HTTP 代理、网络错误重试与请求日志customFetch 文档给出了基于ky与undici的四种示例它和jwksCache一样是unique symbol选项。在解析器内部默认请求会以GET方法、redirect: manual、AbortSignal.timeout(timeoutDuration)发起并附带accept: application/json, application/jwk-setjson与默认 User-Agent 头源码 src/jwks/remote.ts非 200 响应或 JSON 解析失败都会抛出JOSEErrorsrc/jwks/remote.ts。小结JWKSCacheInput虽然只是一个一行联合类型但它承载了 jose 在无状态云运行时中消除 JWKS 冷启动请求的完整设计通过ExportedJWKSCachejwksuat与空对象两种形态配合jwksCachesymbol 选项与uat变化检测实现读缓存 → 注入种子 → 验证 → 回写的闭环。理解它的类型结构、新鲜度判定与安全边界是正确配置远程 JWKS 验证基础设施如 OIDCjwks_uri的关键一步。赞分享网络安全认证鉴权后端【免费下载链接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes项目地址https://gitcode.com/gh_mirrors/jo/jose点击查看免费下载相关推荐jose 远程 JWKS 缓存持久化深入理解 jwksCache 符号选项与无内存缓存云运行时的落地实践jose 远程 JWKS 缓存持久化深入理解 jwksCache 符号选项与无内存缓存云运行时的落地实践 jwksCache 是 jose 暴露给 creat网络安全认证鉴权后端jose 远程 JWKS 可导出缓存接口 ExportedJWKSCache 详解无状态云运行时的跨调用密钥缓存方案jose 远程 JWKS 可导出缓存接口 ExportedJWKSCache 详解无状态云运行时的跨调用密钥缓存方案 导读 在基于 HTTP S 端点如 O网络安全认证鉴权后端深入解析 jose 的 createRemoteJWKSet远程 JWKS 获取、缓存与密钥解析全指南深入解析 jose 的 createRemoteJWKSet远程 JWKS 获取、缓存与密钥解析全指南 createRemoteJWKSet 是 jose h网络安全认证鉴权后端上一篇使用gVisor配置Falco进行容器安全监控下一篇AutoRound常见问题解答量化精度损失、部署报错与性能优化终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表