コンテンツにスキップ

リフレッシュトークン負荷テスト

項目詳細
テスト日2025年12月
対象エンドポイントPOST /token (grant_type=refresh_token)
目的盗難検知付きリフレッシュトークンローテーションのパフォーマンスを測定
コンポーネントテクノロジー説明
WorkerCloudflare WorkersOAuth2/OIDCエンドポイント処理
Durable ObjectsCloudflare DORefreshTokenRotator(トークンローテーション管理)
DatabaseCloudflare D1ユーザー情報、セッション、監査ログ
CacheCloudflare KVJWKキャッシュ、RBACクレームキャッシュ、ユーザーキャッシュ
flowchart TB
    subgraph Local["テスト環境"]
        k6["k6 OSS / K6 Cloud"]
    end

    subgraph CF["Cloudflare"]
        Edge["Cloudflare Edge"]

        subgraph Worker["ar-token Worker"]
            W["トークン処理 + JWT署名"]
        end

        subgraph Cache["キャッシュ層"]
            KV["KV: JWK / RBAC / ユーザーキャッシュ"]
        end

        subgraph DO["Durable Objects"]
            RTR["RefreshTokenRotator"]
        end

        subgraph DB["Database"]
            D1["D1: sessions / audit_logs"]
        end
    end

    k6 -->|HTTPS| Edge
    Edge --> W
    W --> KV
    W --> RTR
    W --> D1
    RTR --> D1
設定項目本番推奨
REFRESH_TOKEN_ROTATION_ENABLEDtruetrue
REFRESH_TOKEN_EXPIRY30日30日
ACCESS_TOKEN_EXPIRY1時間1時間
RBAC_CACHE_TTL5分5分
USER_CACHE_TTL1時間1時間

本番環境でのリフレッシュトークンローテーション動作をシミュレート:

項目設定
トークンローテーション有効(毎回新しいリフレッシュトークンを発行)
VU設計VUごとに独立したトークンファミリー
テストパターン正常ローテーションパスのみ(エラーケースなし)
Think Time0ms(連続リクエスト)

バージョンベースの盗難検知:

{
"sub": "user_id",
"client_id": "client_id",
"rtv": 5, // Refresh Token Version
"jti": "unique_id",
"exp": 1735689600
}
  • rtv (Refresh Token Version): トークンファミリー内のバージョン番号
  • 古いバージョンのトークン使用 → 盗難として全トークン無効化
  • 状態管理はDurable Objects、監査永続化はD1
プリセット目標RPS時間最大VUユースケース
rps100100 RPS2分120本番ベースライン
rps200200 RPS2分240高トラフィックシナリオ
rps300300 RPS2分360ピーク負荷検証

実行日時: 2025年12月3日 09:33 JST

メトリクス
総リクエスト数29,186
成功率100%
トークンローテーション成功率100%
エラー0
メトリクス備考
Worker Duration P509.35 msMedian
Worker Duration P99816.24 msTail latency
CPU Time P504.80 ms
CPU Time P9914.40 ms
DO Wall Time P509.16 msDurable Objects処理時間
DO Wall Time P9918.43 ms
D1 Reads10,5100.36/リクエスト
D1 Writes23,5180.81/リクエスト
メトリクス計算値説明
DOリクエスト/Workerリクエスト3.09サブリクエスト効率
D1 Reads/リクエスト0.36RBACキャッシュヒット率 > 95%
D1 Writes/リクエスト0.81監査ログとセッション更新

結果 - 3,000 RPSテスト(シャーディング)

Section titled “結果 - 3,000 RPSテスト(シャーディング)”
シャード数DO P99DOエラーHTTP失敗
32781ms11,972多数
4843ms00

劇的な改善:

  • DO P99: 781ms → 43ms(95%削減)
  • DOエラー: 11,972 → 0(100%解消)
メトリクス32シャード48シャード改善
Worker P5012ms12ms同等
Worker P95100ms39ms-61%
Worker P99781ms43ms-94%
DOエラー11,9720-100%
成功率~96%100%
最適化段階D1 Reads/リクエスト改善
V1(キャッシュなし)~14.6ベースライン
V2(RBACキャッシュ前)9.7-34%
V2(RBACキャッシュ後)0.36-96%
日付最適化効果
2025-12-01TokenFamilyV2(バージョンベース盗難検知)DOストレージI/O削減
2025-12-01UserCache(KV Read-Through)D1ユーザークエリ削減
2025-12-03非同期監査ログ(Fire-and-Forget)レスポンスレイテンシ削減
2025-12-03RBACクレームキャッシュ(5分TTL)D1 RBACクエリ96%削減
キャッシュTTL目的
USER_CACHE1時間ユーザー情報(Read-Through)
REBAC_CACHE5分RBACクレーム(ロール、権限、グループ)
CLIENTS_CACHE1時間クライアント情報
KeyManager5分JWK署名鍵(Workerメモリ)
用途推奨RPS根拠
通常運用≤200P99 < 500ms維持
ピーク対応≤2,50048シャード使用
絶対上限≤3,00048シャードでゼロエラー
RPSトークン発行/時間トークン発行/日推定MAU
100360,0008.6M200K-400K
200720,00017.3M500K-1M
3001,080,00025.9M1M-2M

換算式:

RPS = (MAU × DAU率 × リクエスト/DAU) / (稼働時間 × 3600) × ピーク係数
≈ MAU / 5,000

48シャードで3,000 RPSのエラーを完全解消(32シャードでは11,972件のDOエラー)。

2. RBACキャッシュでD1負荷96%削減

Section titled “2. RBACキャッシュでD1負荷96%削減”

D1 readsが14.6/リクエスト→0.36/リクエストに減少。

3. トークンローテーションは信頼性高

Section titled “3. トークンローテーションは信頼性高”

200 RPSでローテーション有効で100%成功率。

CPU時間は負荷下でも4-15msを維持。

メトリクス目標結果状態
成功率> 99.9%100%
トークンローテーション> 99%100%
Worker Duration P99< 1000ms816ms / 43ms
DO Wall Time P99< 100ms18.43ms / 43ms
D1 Reads/リクエスト< 50.36

Authrimのリフレッシュトークンエンドポイント(ローテーション有効)は:

  • 200 RPSで100%成功率
  • 100%トークンローテーション成功
  • 0.36 D1 reads/リクエスト(キャッシュで96%削減)
  • 3,000 RPSでゼロエラー(48シャード使用)

重要なポイント: 適切なシャーディング(48シャード)により、システムは不安定(11,972エラー)から完全に信頼性の高い状態(0エラー)に変わります。

TokenFamilyV2設計はセキュリティ(盗難検知)とパフォーマンス(バージョンベース状態管理)の両方を提供します。