メインコンテンツまでスキップ

ストレステスト結果

本ドキュメントでは、各エンドポイントに対するストレステストの結果を報告する。


テスト条件

項目
同時接続数 (VUs)120
テスト時間30秒
テストツールk6
テスト実施日2025-12-24

データ規模パターン

パターン構成総ユーザー数用途
マルチテナント(均等)10テナント × 10万ユーザー100万テナント分離の負荷検証
マルチテナント(大規模単一含む)1テナント×100万 + 9テナント×10万190万大規模テナントのスケーラビリティ検証
注記

「大規模単一テナント」テストは、10テナント構成のうち100万ユーザーを持つ最初のテナントを使用して実施。

判定基準

指標目標値
p(95)500ms以下
エラー率1%未満

結果サマリー

OAuth 2.0/OIDC エンドポイント

シナリオリクエスト数TPS平均応答時間p95エラー率判定
認可リクエスト77,5062,57746.4ms183.8ms0.00%PASS
Token (Client Credentials)44,2111,47181.4ms211.1ms0.00%PASS
JWKS80,6632,68444.6ms156.8ms0.00%PASS
Token Introspection74,0722,45348.7ms198.5ms0.00%PASS

CIBA フロー(マルチテナント: 10テナント × 10万ユーザー)

シナリオlogin_hintリクエスト数TPS平均応答時間p95エラー率判定
BC Requestsub39,6251,31790.9ms223.5ms0.00%PASS
CIBA Full (device)device44,5851,47281.2ms247.6ms0.00%PASS
CIBA Full (sub)sub43,2201,43083.6ms260.1ms0.00%PASS
CIBA Full (email)email43,0501,42583.9ms259.0ms0.00%PASS
CIBA Full (phone)phone40,7501,34888.6ms294.9ms0.00%PASS
CIBA Full (ex-sub)ex-sub41,5801,37486.9ms288.4ms0.00%PASS

CIBA フロー(大規模単一テナント: 100万ユーザー)

シナリオlogin_hintリクエスト数TPS平均応答時間p95エラー率判定
CIBA Full (device)device44,8651,48180.6ms226.9ms0.00%PASS
CIBA Full (sub)sub44,2701,46481.6ms247.0ms0.00%PASS
CIBA Full (email)email40,3751,33389.6ms266.7ms0.00%PASS
CIBA Full (phone)phone39,8351,31690.7ms292.0ms0.00%PASS
CIBA Full (ex-sub)ex-sub41,8551,38286.3ms285.1ms0.00%PASS
大規模単一テナントの考察

1テナントに100万ユーザーを集約した環境でも、マルチテナント環境とほぼ同等の性能を維持。 インデックスとキャッシュ戦略が効果的に機能していることを確認。


詳細結果

scenario-1: 認可リクエスト

認可エンドポイント (/authorizations) への GET リクエスト。

エンドポイント: GET /{tenant_id}/v1/authorizations

結果

指標
総リクエスト数77,506
スループット2,577 req/s
平均応答時間46.4 ms
中央値22.4 ms
p90116.0 ms
p95183.8 ms
最大応答時間1,420 ms
エラー率0.00%

考察

  • ステートレスな設計により高いスループットを実現
  • 100万ユーザー環境でも2,500 TPS以上を達成
  • レスポンス生成(ID Token含む)も含めて安定した性能

scenario-2: BC Request

CIBAバックチャンネル認証リクエスト (/backchannel/authentications)。

エンドポイント: POST /{tenant_id}/v1/backchannel/authentications
login_hint: sub:{user_id}

結果

指標
総リクエスト数39,625
スループット1,317 req/s
平均応答時間90.9 ms
p95223.5 ms
エラー率0.00%

考察

  • ユーザー検索とトランザクション登録を含むが、安定した性能
  • DB操作が含まれるがキャッシュ戦略が効果的

scenario-3: CIBA Full Flow

CIBAフロー全体(BC Request → Transaction → Binding → Token → JWKS)。

フロー:
1. POST /backchannel/authentications
2. GET /authentication-devices/{id}/authentications
3. POST /authentications/{id}/authentication-device-binding-message
4. POST /tokens (grant_type=urn:openid:params:grant-type:ciba)
5. GET /jwks

login_hint パターン別結果

パターン総リクエスト数TPS平均応答時間p95イテレーション/秒
device44,5851,47281.2ms247.6ms294
sub43,2201,43083.6ms260.1ms286
email43,0501,42583.9ms259.0ms285
phone40,7501,34888.6ms294.9ms270
ex-sub41,5801,37486.9ms288.4ms275

考察

  • device: 最高性能(デバイスID直接参照のため高速)
  • sub: findById検索で安定した性能
  • email: findByEmail検索、subと同等の性能
  • phone: findByPhone検索、やや遅め(インデックス最適化の余地あり)
  • ex-sub: 外部IdP連携検索、良好な性能

scenario-4: Token (Password Grant)

Resource Owner Password Credentials Grant。

エンドポイント: POST /{tenant_id}/v1/tokens
パラメータ: grant_type=password

結果

指標
総リクエスト数1,432
スループット47 req/s
平均応答時間421.0 ms
p95576.2 ms
エラー率0.00%

考察

  • ボトルネック: bcryptによるパスワードハッシュ検証がCPUバウンド
  • Password Grantは非推奨であり、CIBAや他のフローへの移行を推奨
  • 高負荷時は並列処理の限界により性能劣化
警告

Password Grantは高負荷時にボトルネックとなる。本番環境での使用は推奨しない。


scenario-5: Token (Client Credentials Grant)

Client Credentials Grant。

エンドポイント: POST /{tenant_id}/v1/tokens
パラメータ: grant_type=client_credentials

結果

指標
総リクエスト数44,211
スループット1,471 req/s
平均応答時間81.4 ms
p95211.1 ms
エラー率0.00%

考察

  • クライアント認証のみで処理が単純
  • 高スループット・低レイテンシを実現
  • M2M通信に最適

scenario-6: JWKS

公開鍵取得エンドポイント。

エンドポイント: GET /{tenant_id}/v1/jwks

結果

指標
総リクエスト数80,663
スループット2,684 req/s
平均応答時間44.6 ms
p95156.8 ms
エラー率0.00%

考察

  • Redisキャッシュが効果的に機能
  • リソースサーバーからの頻繁なアクセスに対応可能
  • 最高TPSを達成

scenario-7: Token Introspection

トークン検証エンドポイント。

エンドポイント: POST /{tenant_id}/v1/tokens/introspection

結果

指標
総リクエスト数74,072
スループット2,453 req/s
平均応答時間48.7 ms
p95198.5 ms
エラー率0.00%

考察

  • 高スループットを達成
  • 軽量な処理とキャッシュ戦略の成果
  • リソースサーバーからの大量リクエストに対応可能

scenario-9: Identity Verification Application

本人確認申込フロー(インデックス最適化後)。

結果

指標
総リクエスト数9,760
スループット320 req/s
平均応答時間61.8 ms
p95231.8 ms
エラー率0.00%

考察

  • インデックス最適化により大幅改善(p95: 1,311ms → 232ms)
  • 複雑なフローでも目標値を達成

総合評価

性能ランキング(100万ユーザー環境)

順位エンドポイントTPSp95コメント
1JWKS2,684156.8ms最高性能
2Authorization2,577183.8ms高性能
3Token Introspection2,453198.5ms高性能
4CIBA Full (device)1,481226.9ms良好
5Token (Client Credentials)1,471211.1ms良好
6CIBA Full (sub)1,464247.0ms良好
7CIBA Full (ex-sub)1,382285.1ms良好

データ規模別比較(CIBA device パターン)

データ規模TPSp95性能差
マルチテナント(10×10万)1,472247.6ms基準
大規模単一(1×100万)1,481226.9ms+0.6%
注記

1テナントに100万ユーザーを集約しても性能劣化は見られず、むしろわずかに向上。 テナント間のコンテキストスイッチがないことが要因と考えられる。

判定結果

  • 全体: 全シナリオがp95目標(500ms以下)を達成
  • スケーラビリティ: 100万ユーザー環境でも高性能を維持
  • 最高TPS: JWKS エンドポイントが 2,684 req/s を達成
  • CIBA: 全login_hintパターンで安定した性能を確認
  • 大規模単一テナント: マルチテナントと同等以上の性能を確認

実行コマンド

# 環境変数でカスタマイズ可能
# VU_COUNT: 同時接続数(デフォルト: 120)
# DURATION: テスト時間(デフォルト: 30s)
# TENANT_INDEX: テナントインデックス(デフォルト: ランダム、0で最初のテナント固定)

# 認可リクエスト
k6 run --summary-export=./performance-test/result/stress/scenario-1-authorization-request.json \
./performance-test/stress/scenario-1-authorization-request.js

# CIBA (device)
k6 run --summary-export=./performance-test/result/stress/scenario-3-ciba-device.json \
./performance-test/stress/scenario-3-ciba-device.js

# CIBA (sub)
k6 run --summary-export=./performance-test/result/stress/scenario-3-ciba-sub.json \
./performance-test/stress/scenario-3-ciba-sub.js

# CIBA (email)
k6 run --summary-export=./performance-test/result/stress/scenario-3-ciba-email.json \
./performance-test/stress/scenario-3-ciba-email.js

# Token (Client Credentials)
k6 run --summary-export=./performance-test/result/stress/scenario-5-token-client-credentials.json \
./performance-test/stress/scenario-5-token-client-credentials.js

# Token Introspection
k6 run --summary-export=./performance-test/result/stress/scenario-7-token-introspection.json \
./performance-test/stress/scenario-7-token-introspection.js

# カスタム設定例
VU_COUNT=200 DURATION=1m k6 run ./performance-test/stress/scenario-6-jwks.js

# 大規模単一テナント(100万ユーザー)でのCIBAテスト
TENANT_INDEX=0 VU_COUNT=120 DURATION=30s k6 run \
--summary-export=./performance-test/result/stress/scenario-3-ciba-device-1m.json \
./performance-test/stress/scenario-3-ciba-device.js

関連ドキュメント