包名为什么叫 jose

JOSE 是 JavaScript Object Signing and Encryption 的缩写,指的是一整套和 JSON/Token 加密签名相关的标准族

Posted by chanweiyan on July 27, 2026

1.包名为什么叫 jose

https://github.com/panva/jose

jose 这个包名来自标准本身,不是作者随便起的。

JOSEJavaScript 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 里的实现之一

如果你愿意,我也可以顺手解释一下为什么这个项目里用 josejsonwebtoken 更适合 Cloudflare Worker。

2.为什么这个项目里用 josejsonwebtoken 更适合 Cloudflare Worker

在这个项目里,用 josejsonwebtoken 更适合 Cloudflare Worker,核心原因是运行时兼容性。

jsonwebtoken 这类老牌 JWT 库最初主要面向 Node.js 设计,很多实现习惯依赖 Node 的 crypto API、Buffer 语义和传统服务端运行时。Cloudflare Worker 不是完整的 Node 运行时,它更接近 Web 标准运行时,优先提供的是 Web Crypto、TextEncoderRequestResponse 这一套能力。所以一到 Worker 环境,jsonwebtoken 往往就容易碰到兼容层、polyfill、bundle 体积或者边界行为问题。

jose 更适合的点主要有这几个:

  1. 它对 Web Crypto 支持更自然,能直接贴合 Worker 的原生能力。
  2. 它本身就是按 JOSE 标准族设计的,不只是“能发 JWT”,而是把签名、验签、密钥处理这些能力做得更规范。
  3. 它在 Edge Runtime、Browser、Worker 这类非 Node 环境里兼容性更稳定。
  4. 类型和 API 更现代,像你在 jwt.ts 里直接用 SignJWTjwtVerify,语义就很清楚。
  5. 不需要为了 JWT 额外依赖 Node 风格的兼容层,部署到 Worker 时更省心。

结合你这个文件 jwt.ts 来看,jose 还有一个很实际的好处:它明确要求你把 secret 转成 Uint8Array,也就是你这里封装的 toSecret。这其实和 Worker 的运行时模型是对齐的,因为 Worker 本来就更偏 Web 标准二进制接口,而不是 Node 的 Buffer 隐式转换。

简单说:

  • jsonwebtoken 更像传统 Node 服务端时代的选择
  • jose 更像 Worker / Edge / Web Crypto 时代的选择

如果你愿意,我可以继续顺手对比一下这两个库在这个项目里的具体写法差异,比如同样的 HS256 签发和校验在 jsonwebtoken 里会多出哪些 Worker 适配成本。