authia 0.3.4

High-performance JWT verification library for Ed25519 using WebAssembly
Documentation
# authia


[English]./README.md | [日本語]./README.ja.md

WebAssemblyを使用した高性能なEd25519 JWT検証ライブラリ

## 特徴


- 🚀 Rust + WebAssemblyによる高速なEd25519 JWT検証
-**v0.3.0 最適化**: 同期的なシングルパスJSONパースによる最高速のパフォーマンス
- 🔒 セキュアな設計 - アルゴリズムはEd25519に固定
- 🌐 ユニバーサルランタイム対応(Node.js、ブラウザ、Cloudflare Workers)
- 📦 ランタイム依存なし
- 🎯 TypeScript型定義を同梱
- ⚡ 自動的なWasm初期化

## 📊 ベンチマーク


パフォーマンスは実行環境によって大きく異なります:

**Cloudflare Workers / エッジランタイム:**

| ライブラリ        | 平均 (ms)  | p50 (ms)   | p95 (ms)   |
| :---------------- | :--------- | :--------- | :--------- |
| **authia (WASM)** | **0.20ms** | **0.17ms** | **0.36ms** |
| jose (WebCrypto)  | 0.30ms     | 0.28ms     | 0.50ms     |

**Node.js (ネイティブcrypto):**

| ライブラリ    | 平均 (ms)          |
| :------------ | :----------------- |
| jose (native) | **0.01-0.03ms**|
| authia (WASM) | 0.17-0.20ms        |

_Node.jsでは、joseはネイティブC++暗号バインディングを使用するため大幅に高速です。authiaは両方のライブラリが同様のAPIを使用するエッジランタイムに最適化されています。_

## インストール


```bash
npm install authia
```

## 使い方


ライブラリは環境(Node.jsまたはBundler/Workers)を自動検出し、WebAssemblyの読み込みを処理します。

### アクセストークンの検証


```typescript
import { verifyAccessToken } from "authia";

try {
  // ⚡ 推奨: publicKeyJwkRawでパフォーマンス向上 (v0.2.0+)
  const payload = await verifyAccessToken(token, {
    publicKeyJwkRaw: process.env.JWT_PUBLIC_KEY, // 生のJWK JSON文字列
    audience: "kapock-app",
    issuer: "https://auth.kapock.com",
  });

  console.log(`ユーザーID: ${payload.sub}, メール: ${payload.email}`);
} catch (error) {
  console.error("トークン検証失敗:", error);
}
```

**レガシー(サポート継続、ただし低速):**

```typescript
// Base64エンコードされたJWK(後方互換性)
const payload = await verifyAccessToken(token, {
  publicKeyJwk: btoa(process.env.JWT_PUBLIC_KEY), // Base64エンコードが必要
  audience: "kapock-app",
  issuer: "https://auth.kapock.com",
});
```

### リフレッシュトークンの検証


```typescript
import { verifyRefreshToken } from "authia";

const payload = await verifyRefreshToken(token, {
  publicKeyJwkRaw: process.env.JWT_PUBLIC_KEY, // 生JWKでパフォーマンス向上
  audience: "kapock-app",
  issuer: "https://auth.kapock.com",
});

console.log(`JTI: ${payload.jti}`);
```

### パフォーマンスのコツ


1. **`publicKeyJwkRaw`を使用**`publicKeyJwk`より2〜5倍高速(高スループットシナリオ)
2. **検証オプションをWorker/プロセスレベルでキャッシュ**
3. ライブラリ内部で自動的に公開鍵をキャッシュ

```typescript
// Worker-levelキャッシングの例(Cloudflare Workers)
let cachedPublicKey: string | null = null;

export async function verifyToken(token: string, env: Env) {
  if (!cachedPublicKey) {
    cachedPublicKey = env.JWT_PUBLIC_KEY.trim();
  }

  return verifyAccessToken(token, {
    publicKeyJwkRaw: cachedPublicKey, // 繰り返しのtrim()呼び出しを回避
    audience: "kapock-app",
    issuer: "https://auth.kapock.com",
  });
}
```

## ランタイムの動作


### Node.js


検証は**同期的**です。WebAssemblyモジュールは、起動時に最適化されたNode.jsターゲットとして読み込まれ、インスタンス化されます。

### Cloudflare Workers / バンドラー


検証も**同期的**です。ライブラリは、モジュールのロード時にWebAssemblyのインスタンス化を自動的に処理します。例にある `await` は互換性のために維持されていますが、検証自体はペイロードを直接返します。

## API


詳細は[APIドキュメント](./docs/api.md)を参照してください。

## 既知の問題と制限事項


⚠️ **本番環境での使用に関する重要な注意事項**

### パフォーマンスに関する考慮事項


**Node.js環境:**

- authiaには **JS ↔ WASM境界のオーバーヘッド** が1回あたり約0.1-0.15ms発生します
- 人気の`jose`ライブラリはネイティブC++暗号バインディングを使用し、通常**Node.jsではより高速**です(0.01-0.03ms)
- **推奨**: Node.jsバックエンドでは、authiaの代わりに`jose`の使用を検討してください

**Cloudflare Workers / エッジランタイム:**

- authiaはこれらの環境で**競争力のあるパフォーマンス**を発揮します(`jose`もWebCrypto APIを使用するため)
- WASMアプローチは異なるエッジプラットフォーム間で**一貫したパフォーマンス**を提供します
- **推奨**: authiaはEd25519トークンを使用するCloudflare Workersに適しています

### スキーマ検証(v0.3.x)


- **厳格なスキーマ検証**: v0.3.1-v0.3.3はJWTクレームに対して厳格な型チェックを使用します
- オプションフィールド(`email`など)が欠けていると検証が失敗する可能性があります
- **回避策**: すべてのトークンに期待されるフィールドが含まれていることを確認するか、より寛容なパースのためにv0.2.xを使用してください
- **今後の改善**: `Option<T>`型を使用した柔軟なスキーマへの移行を計画中です

### 環境変数のパース


- 公開鍵形式の検出: ライブラリはJSONとBase64エンコードされたJWKを自動検出しようとします
- **ベストプラクティス**: `publicKeyJwkRaw`オプションには生のJSON形式を使用してください(推奨)
- Base64を使用する場合は、PEMヘッダーなしで適切にエンコードされていることを確認してください

### 推奨される使用ケース


✅ **適している場合:**

- Ed25519 JWTトークンを使用するCloudflare Workers
- 一貫したクロスプラットフォーム動作が必要なエッジランタイム
- Rust + WebAssembly開発の学習

❌ **代替案を検討すべき場合:**

- 高スループット要件のあるNode.jsバックエンド → `jose`を使用
- クレーム構造が変動するトークン → v0.2.xまたは`jose`を使用
- 最大限の安定性が必要な本番システム → `jose`を使用

## ライセンス


MIT