1.包名为什么叫 jose
https://github.com/panva/jose
jose 这个包名来自标准本身,不是作者随便起的。
JOSE 是 JavaScript Object Signing and Encryption 的缩写,指的是一整套和 JSON/Token 加密签名相关的标准族,主要包括:
JWS:JSON Web Signature,做签名JWE:JSON Web Encryption,做加密JWK:JSON Web Key,表示密钥JWA:JSON Web Algorithms,定义算法JWT:JSON Web Token,最常见的令牌格式之一
所以你在 jwt.ts 里写的:
1
import { SignJWT, jwtVerify } from 'jose'
本质上是在用一个实现了 JOSE 规范的 JavaScript 库。它不只是 JWT 库,名字叫 jose 是因为它覆盖的是整套 JOSE 能力,而 JWT 只是其中一部分。
简单理解:
JWT是具体令牌格式JOSE是 JWT 背后的那组签名/加密标准家族jose包就是这套标准在 JS 里的实现之一
如果你愿意,我也可以顺手解释一下为什么这个项目里用 jose 比 jsonwebtoken 更适合 Cloudflare Worker。
2.为什么这个项目里用 jose 比 jsonwebtoken 更适合 Cloudflare Worker
在这个项目里,用 jose 比 jsonwebtoken 更适合 Cloudflare Worker,核心原因是运行时兼容性。
jsonwebtoken 这类老牌 JWT 库最初主要面向 Node.js 设计,很多实现习惯依赖 Node 的 crypto API、Buffer 语义和传统服务端运行时。Cloudflare Worker 不是完整的 Node 运行时,它更接近 Web 标准运行时,优先提供的是 Web Crypto、TextEncoder、Request、Response 这一套能力。所以一到 Worker 环境,jsonwebtoken 往往就容易碰到兼容层、polyfill、bundle 体积或者边界行为问题。
jose 更适合的点主要有这几个:
- 它对 Web Crypto 支持更自然,能直接贴合 Worker 的原生能力。
- 它本身就是按 JOSE 标准族设计的,不只是“能发 JWT”,而是把签名、验签、密钥处理这些能力做得更规范。
- 它在 Edge Runtime、Browser、Worker 这类非 Node 环境里兼容性更稳定。
- 类型和 API 更现代,像你在 jwt.ts 里直接用
SignJWT、jwtVerify,语义就很清楚。 - 不需要为了 JWT 额外依赖 Node 风格的兼容层,部署到 Worker 时更省心。
结合你这个文件 jwt.ts 来看,jose 还有一个很实际的好处:它明确要求你把 secret 转成 Uint8Array,也就是你这里封装的 toSecret。这其实和 Worker 的运行时模型是对齐的,因为 Worker 本来就更偏 Web 标准二进制接口,而不是 Node 的 Buffer 隐式转换。
简单说:
jsonwebtoken更像传统 Node 服务端时代的选择jose更像 Worker / Edge / Web Crypto 时代的选择
如果你愿意,我可以继续顺手对比一下这两个库在这个项目里的具体写法差异,比如同样的 HS256 签发和校验在 jsonwebtoken 里会多出哪些 Worker 适配成本。