jose、jwk-to-pem、node-forge、node-jose、pem、pem-jwk はいずれも JavaScript 環境で暗号操作や証明書・鍵の形式変換を扱うライブラリですが、目的や設計思想が異なります。これらのパッケージは、JSON Web Token(JWT)の署名・検証、JSON Web Key(JWK)と PEM 形式の相互変換、X.509 証明書の生成など、セキュリティ関連の機能を提供します。特にフロントエンド開発では、OAuth 2.0 や OpenID Connect といった認証フローとの連携で JWT を扱う場面が多く、適切なライブラリ選定が重要です。
JWT(JSON Web Token)や JWK(JSON Web Key)を扱う際、フロントエンド開発者には「どのライブラリを使えば安全で効率的か?」という課題があります。ここでは、代表的な6つの npm パッケージ — jose、jwk-to-pem、node-forge、node-jose、pem、pem-jwk — を、実際の開発シナリオに基づいて比較します。
まず重要な前提として、node-jose は公式に非推奨(deprecated) とされています。npm ページおよび GitHub リポジトリに明記されており、作者が後継として jose を推奨しています。新規プロジェクトで使用すべきではありません。
// ❌ node-jose は非推奨
// const jose = require('node-jose'); // 使用しないでください
以下では、残りの5つのパッケージを中心に比較します。
jose:標準準拠の JWT/JWK ハンドリングjose は IETF RFC 7515–7519(JWT/JWS/JWK)に完全準拠し、Web Crypto API と互換性のある設計を採用しています。フロントエンド(ブラウザ)と Node.js の両方で動作し、TypeScript 定義も完備。JWT の署名・検証、JWK の操作、JWE(暗号化トークン)まで対応。
// jose: JWT の検証例(フロントエンド/Node.js 両対応)
import { jwtVerify } from 'jose';
const { payload } = await jwtVerify(jwt, publicKey, {
issuer: 'https://example.com',
audience: 'my-app'
});
jwk-to-pem:JWK → PEM 変換専用このパッケージは JWK を PEM 形式の文字列に変換するだけ のシンプルなツールです。JWT の検証機能は一切含みません。
// jwk-to-pem: JWK から PEM 生成
import jwkToPem from 'jwk-to-pem';
const pem = jwkToPem(jwk); // 公開鍵 or 秘密鍵
// その後、Node.js の crypto.verify() や node-forge で使用
pem-jwk:PEM → JWK 変換専用jwk-to-pem の逆方向。PEM 文字列を JWK オブジェクトに変換します。
// pem-jwk: PEM から JWK 生成
import { pem2jwk } from 'pem-jwk';
const jwk = pem2jwk(pemString);
// その後、jose などで使用可能
node-forge:汎用暗号ライブラリRSA、AES、X.509、ASN.1 など、幅広い暗号機能を純 JavaScript で提供。ブラウザでも動作し、ネイティブ crypto に依存しません。ただし、JWT/JWK 専用の API はありません。
// node-forge: PEM から公開鍵を読み込み、署名検証
import forge from 'node-forge';
const publicKey = forge.pki.publicKeyFromPem(pem);
const verified = publicKey.verify(digest, signature);
pem:OpenSSL ラッパー(Node.js 専用)内部で OpenSSL コマンドを呼び出すため、Node.js 専用。ブラウザでは動作しません。主に証明書や鍵の生成に使われ、JWT とは直接関係ありません。
// pem: 自己署名証明書の生成(Node.js のみ)
import pem from 'pem';
pem.createCertificate({ days: 365, selfSigned: true }, (err, keys) => {
const { certificate, serviceKey } = keys;
// certificate は PEM 形式
});
OAuth 2.0 の ID トークンを検証するケースを想定します。JWK Set(jwks.json)から公開鍵を取得し、JWT を検証します。
jose を使った最適解// jose: JWKS からの自動キーフェッチと検証
import { createRemoteJWKSet, jwtVerify } from 'jose';
const JWKS = createRemoteJWKSet(new URL('https://example.com/.well-known/jwks.json'));
const { payload } = await jwtVerify(jwt, JWKS, {
issuer: 'https://example.com',
audience: 'my-app'
});
jwk-to-pem + Node.js crypto の組み合わせ// jwk-to-pem + crypto: 手動変換と検証(Node.js のみ)
import jwkToPem from 'jwk-to-pem';
import { createPublicKey, verify } from 'crypto';
const pem = jwkToPem(jwk);
const key = createPublicKey(pem);
const [header, payload, signature] = jwt.split('.');
const data = header + '.' + payload;
const isValid = verify('RS256', Buffer.from(data), key, Buffer.from(signature, 'base64url'));
node-forge での検証(ブラウザ対応)// node-forge: ブラウザで JWT 検証
import forge from 'node-forge';
const publicKey = forge.pki.publicKeyFromPem(pem);
const md = forge.md.sha256.create();
md.update(data, 'utf8');
const isValid = publicKey.verify(md.digest().bytes(), forge.util.decode64(signature));
💡 注意:
node-forgeは base64url ではなく standard base64 を期待するため、署名のデコードに注意が必要です。
| パッケージ | ブラウザ対応 | Node.js 対応 | ネイティブ crypto 依存 | 主な用途 |
|---|---|---|---|---|
jose | ✅ | ✅ | ❌(Web Crypto 互換) | JWT/JWK 全般 |
jwk-to-pem | ✅ | ✅ | ❌ | JWK → PEM 変換 |
pem-jwk | ✅ | ✅ | ❌ | PEM → JWK 変換 |
node-forge | ✅ | ✅ | ❌ | 汎用暗号操作 |
pem | ❌ | ✅ | ✅(OpenSSL コマンド) | 証明書/鍵生成 |
node-jose | ⚠️(非推奨) | ⚠️(非推奨) | ✅ | —(使用禁止) |
jwk-to-pem と pem-jwk は 互いに補完的 です。片方が欠けていると双方向変換が困難になります。jose は 変換不要 で JWK を直接扱えるため、多くのケースでこれら2つを不要にします。node-forge は PEM を直接扱えるため、jwk-to-pem と組み合わせて使うパターンもあります。✅ jose 一択。ブラウザ対応、TypeScript 対応、RFC 準拠、軽量。
crypto で使いたい✅ jwk-to-pem。シンプルで信頼性が高い。
✅ node-forge。ただし、JWT 専用なら jose の方が安全で簡単。
✅ pem。ただし、これは JWT とは無関係な用途。
jose を使う。これだけでほとんどのニーズをカバーできます。jwk-to-pem または pem-jwk を選ぶ。node-forge を検討する。node-jose は絶対に使わない。pem は JWT とは無関係。証明書生成専用と理解すること。現代のフロントエンド開発では、セキュリティと標準準拠が最重要です。jose はそのバランスを最もよく取った選択肢であり、多くのチームが移行を進めています。
jose は IETF 標準に完全準拠したモダンな JWT/JWK ライブラリであり、Web Crypto API と互換性のある API 設計を採用しています。フロントエンドでも動作し、TypeScript 対応も完璧です。新しいプロジェクトで JWT や JWK を扱う場合は、まずこのパッケージを検討すべきです。軽量で依存関係が少なく、メンテナンスも活発です。
jwk-to-pem は JWK を PEM 形式の公開鍵または秘密鍵に変換する単一目的のユーティリティです。JWT 関連の処理そのものは含まれず、他のライブラリと組み合わせて使う前提です。たとえば、JWK から PEM を生成して node-forge やネイティブの crypto モジュールで使うようなケースに適しています。機能が絞られている分、シンプルで信頼性が高いです。
node-forge は TLS、PKI、X.509 証明書、ASN.1、RSA、AES など幅広い暗号機能を提供する純 JavaScript 実装のライブラリです。ブラウザと Node.js の両方で動作し、ネイティブの crypto に依存しません。ただし、JWT や JWK に特化した API は持たないため、それらを直接扱いたい場合は別途ラッパーが必要です。汎用的な暗号操作が必要な場合に有効です。
node-jose は古くからある JWT/JWK ライブラリですが、公式に非推奨(deprecated)とされています。作者自身が後継として jose を推奨しており、新規プロジェクトでの使用は避けるべきです。既存コードの保守以外では選択しないでください。
pem は主に X.509 証明書や RSA 鍵の生成・変換に特化した Node.js 向けライブラリです。OpenSSL コマンドのラッパーとして動作し、内部で子プロセスを起動します。そのためブラウザ環境では使えません。JWT や JWK への直接対応はなく、PEM 形式の鍵管理に特化している点に注意が必要です。
pem-jwk は PEM 形式の鍵を JWK に変換する単機能ライブラリです。逆変換(JWK → PEM)はサポートしておらず、jwk-to-pem の逆方向のユースケースをカバーします。JWT の署名・検証機能は含まれないため、他の JWT ライブラリと組み合わせて使う必要があります。シンプルな変換だけが必要な場合に適しています。
jose is a JavaScript module for JSON Object Signing and Encryption, providing support for JSON Web Tokens (JWT), JSON Web Signature (JWS), JSON Web Encryption (JWE), JSON Web Key (JWK), JSON Web Key Set (JWKS), and more. The module is designed to work across various Web-interoperable runtimes including Node.js, browsers, Cloudflare Workers, Deno, Bun, and others.
If you want to quickly add JWT authentication to JavaScript apps, feel free to check out Auth0's JavaScript SDK and free plan. Create an Auth0 account; it's free!
Support from the community to continue maintaining and improving this module is welcome. If you find the module useful, please consider supporting the project by becoming a sponsor.
jose has no dependencies and it exports tree-shakeable ESM1.
jose is distributed via npmjs.com, jsr.io, jsdelivr.com, and github.com.
example ESM import1
import * as jose from 'jose'
The jose module supports JSON Web Tokens (JWT) and provides functionality for signing and verifying tokens, as well as their JWT Claims Set validation.
jwtVerify function
SignJWT classThe jose module supports encrypted JSON Web Tokens and provides functionality for encrypting and decrypting tokens, as well as their JWT Claims Set validation.
jwtDecrypt functionEncryptJWT classThe jose module supports importing, exporting, and generating keys and secrets in various formats, including PEM formats like SPKI, X.509 certificate, and PKCS #8, as well as JSON Web Key (JWK).
The jose module supports signing and verification of JWS messages with arbitrary payloads in Compact, Flattened JSON, and General JSON serialization syntaxes.
The jose module supports encryption and decryption of JWE messages with arbitrary plaintext in Compact, Flattened JSON, and General JSON serialization syntaxes.
The following are additional features and utilities provided by the jose module:
The jose module is compatible with JavaScript runtimes that support the utilized Web API globals and standard built-in objects or are Node.js.
The following runtimes are supported (this is not an exhaustive list):
Please note that certain algorithms may not be available depending on the runtime used. You can find a list of available algorithms for each runtime in the specific issue links provided above.
| Version | Security Fixes 🔑 | Other Bug Fixes 🐞 | New Features ⭐ | Runtime and Module type |
|---|---|---|---|---|
| v6.x | Security Policy | ✅ | ✅ | Universal2 ESM1 |
| v5.x | Security Policy | ❌ | ❌ | Universal2 CJS + ESM |
| v4.x | Security Policy | ❌ | ❌ | Universal2 CJS + ESM |
| v2.x | Security Policy | ❌ | ❌ | Node.js CJS |
The algorithm implementations in jose have been tested using test vectors from their respective specifications as well as RFC7520.