コンテンツにスキップ

トークン交換負荷テスト

テスト概要

項目詳細
テスト日2025年12月14日
対象エンドポイントPOST /token (grant_type=token-exchange)
目的マイクロサービス認証およびSSOオーディエンス切り替えのパフォーマンスを測定

テスト環境

K6 Cloud構成

コンポーネント詳細
負荷生成K6 Cloud (amazon:us:portland)
ターゲットhttps://conformance.authrim.com
プロトコルClient Secret (Basic Auth)

インフラ

コンポーネントテクノロジー
コンピュートCloudflare Workers (op-token)
失効チェックDurable Objects (TokenRevocationStore)
鍵管理Durable Objects (KeyManager)
データベースCloudflare D1

シャード構成

Durable Objectシャード数用途
AuthorizationCodeStore8認可コード管理
SessionStore8セッション管理
ChallengeStore8チャレンジ管理
TokenRevocationStore8トークン失効チェック(メインDO)
RefreshTokenRotator16リフレッシュトークン管理

テスト方法論

トークンミックス(RFC 8693 + 業界標準)

トークンタイプ比率期待結果検証項目
有効(標準)56%新トークン発行Scope/sub整合性
有効(actor付き)14%新トークン発行委譲フロー (RFC 8693)
期限切れ10%400エラー即時検出
無効署名10%400エラー署名検証
失効済み10%400エラーリアルタイム失効チェック

トークン交換バリエーション

バリエーション種類数
Target Audience20api.example.com/gateway, /users, /payments, …
Scope Patterns4openid, openid profile, openid profile email, full
Resource URI10resource.example.com/api/v1, data.example.com/graphql, …
Service Clients5service-gateway, service-bff, service-worker, …

結果 - パフォーマンスメトリクス

サマリー

RPS総リクエスト数K6 P95CF Worker P99CF DO P99状態
2,000292,343500ms307ms1,020ms⚠️
2,500365,624225ms313ms271ms
3,000390,4442,144ms316ms2,222ms

判定基準: ✅ K6 P95 < 300ms AND DO P99 < 500ms

K6クライアントレイテンシ(ms)

RPSMedianP95P99MinMax
2,000112500589403,448
2,50076225297395,075
3,0001,6572,1442,269534,236

RPS達成率

目標RPS平均RPSピークRPS達成率
2,0001,3732,137107%
2,5001,7172,494100%
3,0001,8332,71490%

: 3,000 RPSテストで”Insufficient VUs”警告発生

結果 - インフラメトリクス

Worker Duration (ms)

RPS総リクエストP50P75P90P99P999
2,000293,74723.8326.0460.67306.87309.91
2,500367,48423.0924.5226.43312.86315.63
3,000398,732204.33236.41265.56315.89337.54

Worker CPU Time (ms)

RPSP50P75P90P99P999
2,0002.273.063.648.4716.59
2,5002.232.523.198.4415.89
3,0002.132.373.034.977.23

重要な発見: CPU時間はP50で約2.3msで安定 - CPUはボトルネックではない

Durable Objects Wall Time (ms)

TokenRevocationStore + KeyManager DO:

RPS総DOリクエストDOエラーP50P75P90P99P999
2,000620,073017.7629.88102.051,019.691,312.22
2,500764,279015.0828.6346.66271.45378.61
3,000759,0108759.341,512.101,821.782,222.332,450.69

重要な発見:

  • 2,500 RPSがスイートスポット(P99 271ms)
  • 3,000 RPSでDOが飽和(P50が759msに急上昇)
  • 3,000 RPSでDOエラー発生開始

DO呼び出し並列化の効果

実装

// Before: 順次実行(2 RTT)
const publicKey = await getVerificationKeyFromJWKS(env, kid);
await verifyToken(...);
const revoked = await isTokenRevoked(env, jti);
// After: 並列実行(1 RTT)
const [publicKey, revoked] = await Promise.all([
getVerificationKeyFromJWKS(env, kid),
isTokenRevoked(env, jti)
]);
await verifyToken(...);

3,000 RPSでの影響

メトリクスBeforeAfter変化
DO P5049ms28ms-43%
DO P992,141ms2,222ms±同等
Worker P99307ms316ms±同等

P50が大幅改善。P99は高負荷時のキューイングが支配的なため変化なし。

キャパシティ推奨

用途推奨RPS根拠
通常運用≤1,500余裕のある安定動作
ピーク対応≤2,500K6 P95 225ms、DO P99 271ms - 最適点
絶対上限≤2,700ピークRPS達成可能な上限

主要な発見

1. CPU処理は高速で安定

CPU Time P50は全RPS帯で2.1-2.3ms - CPUはボトルネックではありません。

2. DOがボトルネック

3,000 RPSでDO P50が15ms→759msに急上昇(50倍悪化)。

3. 2,500 RPSがスイートスポット

最良のパフォーマンスは2,500 RPSで達成:

  • K6 P95: 225ms
  • DO P99: 271ms

4. 3,000 RPSでシステムが飽和

  • DOキューイング遅延が支配的
  • パフォーマンスが急激に劣化
  • DOエラー発生開始(8件)

5. 100%トークン検証精度

全トークンタイプが正確に検証:

  • 有効 → 新トークン発行
  • 期限切れ → 400エラー
  • 無効署名 → 400エラー
  • 失効済み → 400エラー(リアルタイムチェック)

結論

AuthrimのToken Exchange(RFC 8693)エンドポイントは:

  • 2,500 RPSまで: 安定動作(K6 P95 225ms、CF DO P99 271ms)
  • 3,000 RPS以上: 顕著な劣化(K6 P95 > 2,100ms、CF DO P50 > 750ms)

主要ボトルネックDurable Objectのキューイング遅延 - CPUや暗号操作ではありません。さらなるスケールアウトにはDO最適化またはアーキテクチャ変更(キャッシュレイヤー追加など)が必要です。

全RPS帯で100%成功率を達成 - スループット限界でもトークン検証の正確性は維持されています。