jose vs jwk-to-pem vs node-forge vs node-jose vs pem vs pem-jwk
JWT および JWK の処理と PEM 形式変換のための npm パッケージ比較
josejwk-to-pemnode-forgenode-josepempem-jwk類似パッケージ:

JWT および JWK の処理と PEM 形式変換のための npm パッケージ比較

josejwk-to-pemnode-forgenode-josepempem-jwk はいずれも JavaScript 環境で暗号操作や証明書・鍵の形式変換を扱うライブラリですが、目的や設計思想が異なります。これらのパッケージは、JSON Web Token(JWT)の署名・検証、JSON Web Key(JWK)と PEM 形式の相互変換、X.509 証明書の生成など、セキュリティ関連の機能を提供します。特にフロントエンド開発では、OAuth 2.0 や OpenID Connect といった認証フローとの連携で JWT を扱う場面が多く、適切なライブラリ選定が重要です。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
jose07,626258 kB21ヶ月前MIT
jwk-to-pem015522.6 kB142年前Apache-2.0
node-forge05,3071.65 MB4613ヶ月前(BSD-3-Clause OR GPL-2.0)
node-jose0721353 kB733年前Apache-2.0
pem0574338 kB213年前MIT
pem-jwk073-97年前MPL-2.0

JWT と鍵形式変換:jose、jwk-to-pem、node-forge などの技術的比較

JWT(JSON Web Token)や JWK(JSON Web Key)を扱う際、フロントエンド開発者には「どのライブラリを使えば安全で効率的か?」という課題があります。ここでは、代表的な6つの npm パッケージ — josejwk-to-pemnode-forgenode-josepempem-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 形式
});

🧪 実際の JWT 検証フローでの比較

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-pemJWK → PEM 変換
pem-jwkPEM → JWK 変換
node-forge汎用暗号操作
pem✅(OpenSSL コマンド)証明書/鍵生成
node-jose⚠️(非推奨)⚠️(非推奨)—(使用禁止)

🔄 相互変換の補完関係

  • jwk-to-pempem-jwk互いに補完的 です。片方が欠けていると双方向変換が困難になります。
  • jose変換不要 で JWK を直接扱えるため、多くのケースでこれら2つを不要にします。
  • node-forge は PEM を直接扱えるため、jwk-to-pem と組み合わせて使うパターンもあります。

🛠️ 実践的な選定ガイド

ケース1:フロントエンドで ID トークンを検証したい

jose 一択。ブラウザ対応、TypeScript 対応、RFC 準拠、軽量。

ケース2:Node.js で JWK を PEM に変換してネイティブ crypto で使いたい

jwk-to-pem。シンプルで信頼性が高い。

ケース3:ブラウザで OpenSSL 互換の暗号操作が必要(JWT 以外)

node-forge。ただし、JWT 専用なら jose の方が安全で簡単。

ケース4:自己署名証明書を Node.js で生成したい

pem。ただし、これは JWT とは無関係な用途。

📌 まとめ:推奨アーキテクチャ

  • 新規プロジェクトで JWT/JWK を扱うなら、jose を使う。これだけでほとんどのニーズをカバーできます。
  • 変換だけが必要なレガシー統合の場合jwk-to-pem または pem-jwk を選ぶ。
  • 汎用暗号操作が必要な特殊ケースnode-forge を検討する。
  • node-jose は絶対に使わない
  • pem は JWT とは無関係。証明書生成専用と理解すること。

現代のフロントエンド開発では、セキュリティと標準準拠が最重要です。jose はそのバランスを最もよく取った選択肢であり、多くのチームが移行を進めています。

選び方: jose vs jwk-to-pem vs node-forge vs node-jose vs pem vs pem-jwk

  • jose:

    jose は IETF 標準に完全準拠したモダンな JWT/JWK ライブラリであり、Web Crypto API と互換性のある API 設計を採用しています。フロントエンドでも動作し、TypeScript 対応も完璧です。新しいプロジェクトで JWT や JWK を扱う場合は、まずこのパッケージを検討すべきです。軽量で依存関係が少なく、メンテナンスも活発です。

  • jwk-to-pem:

    jwk-to-pem は JWK を PEM 形式の公開鍵または秘密鍵に変換する単一目的のユーティリティです。JWT 関連の処理そのものは含まれず、他のライブラリと組み合わせて使う前提です。たとえば、JWK から PEM を生成して node-forge やネイティブの crypto モジュールで使うようなケースに適しています。機能が絞られている分、シンプルで信頼性が高いです。

  • node-forge:

    node-forge は TLS、PKI、X.509 証明書、ASN.1、RSA、AES など幅広い暗号機能を提供する純 JavaScript 実装のライブラリです。ブラウザと Node.js の両方で動作し、ネイティブの crypto に依存しません。ただし、JWT や JWK に特化した API は持たないため、それらを直接扱いたい場合は別途ラッパーが必要です。汎用的な暗号操作が必要な場合に有効です。

  • node-jose:

    node-jose は古くからある JWT/JWK ライブラリですが、公式に非推奨(deprecated)とされています。作者自身が後継として jose を推奨しており、新規プロジェクトでの使用は避けるべきです。既存コードの保守以外では選択しないでください。

  • pem:

    pem は主に X.509 証明書や RSA 鍵の生成・変換に特化した Node.js 向けライブラリです。OpenSSL コマンドのラッパーとして動作し、内部で子プロセスを起動します。そのためブラウザ環境では使えません。JWT や JWK への直接対応はなく、PEM 形式の鍵管理に特化している点に注意が必要です。

  • pem-jwk:

    pem-jwk は PEM 形式の鍵を JWK に変換する単機能ライブラリです。逆変換(JWK → PEM)はサポートしておらず、jwk-to-pem の逆方向のユースケースをカバーします。JWT の署名・検証機能は含まれないため、他の JWT ライブラリと組み合わせて使う必要があります。シンプルな変換だけが必要な場合に適しています。

jose のREADME

jose

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.

Sponsor

Auth0 by Okta

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!

💗 Help the project

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.

Dependencies: 0

jose has no dependencies and it exports tree-shakeable ESM1.

Documentation

jose is distributed via npmjs.com, jsr.io, jsdelivr.com, and github.com.

example ESM import1

import * as jose from 'jose'

JSON Web Tokens (JWT)

The jose module supports JSON Web Tokens (JWT) and provides functionality for signing and verifying tokens, as well as their JWT Claims Set validation.

Encrypted JSON Web Tokens

The jose module supports encrypted JSON Web Tokens and provides functionality for encrypting and decrypting tokens, as well as their JWT Claims Set validation.

Key Utilities

The 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).

JSON Web Signature (JWS)

The jose module supports signing and verification of JWS messages with arbitrary payloads in Compact, Flattened JSON, and General JSON serialization syntaxes.

JSON Web Encryption (JWE)

The jose module supports encryption and decryption of JWE messages with arbitrary plaintext in Compact, Flattened JSON, and General JSON serialization syntaxes.

Other

The following are additional features and utilities provided by the jose module:

Supported Runtimes

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.

Supported Versions

VersionSecurity Fixes 🔑Other Bug Fixes 🐞New Features ⭐Runtime and Module type
v6.xSecurity PolicyUniversal2 ESM1
v5.xSecurity PolicyUniversal2 CJS + ESM
v4.xSecurity PolicyUniversal2 CJS + ESM
v2.xSecurity PolicyNode.js CJS

Specifications

Details

The algorithm implementations in jose have been tested using test vectors from their respective specifications as well as RFC7520.

Footnotes

  1. CJS style let jose = require('jose') is possible in Node.js versions where the require(esm) feature is enabled by default (^20.19.0 || ^22.12.0 || >= 23.0.0). 2 3

  2. Assumes runtime support of WebCryptoAPI and Fetch API 2 3