Table of Contents
AuthleteのAPIエンドポイントを使用する際、サービス品質の低下や、自らの過剰なリクエストによってDDoS状態に陥る事態の回避、およびピーク時における継続的な運用の確保のために、Authleteのレート制限ポリシーを考慮した上でアプリケーションを開発する必要があります。以下に、Authleteユーザーの皆様に対して当社が推奨する技術的ベストプラクティスを記載します。
キャッシングは、不要なAPIコールとレート制限違反に対する主要な防御手段です。Authleteの場合、定期的に使用されるエンドポイントの中に、レスポンス内容がほとんど変化しないものも含まれており、パフォーマンスの向上あるいは外部要因によるレート制限のリスク軽減を実現するためにキャッシュを使用することが有効です。以下がアプリケーションのキャッシングを設計する際に考慮すべきエンドポイントの一覧になります。
| エンドポイント | 用途 | 詳細 |
|---|---|---|
サービス設定の取得/api/{serviceId}/service/configuration |
OpenID ConnectおよびOpenID Connect Discovery 1.0をサポートするサービスの設定を行うために呼び出されるAPI | 多くのOpenID SDKおよびライブラリは、設定を簡略化するためにディスカバリーエンドポイントを使用します。これらのライブラリがWebアプリケーションやウェブサイトのコンポーネントとしてデプロイされる際、OpenIDプロバイダーが大量のリクエストを受信する可能性があります。サービス設定がそれほど頻繁に変更されるものではないため、このエンドポイントを安全にキャッシュすることができます。 |
JWKセットの取得/api/{serviceId}/service/jwks/get |
OpenID ConnectをサポートするサービスがJWKセット情報を公開しなければならないJWKセットエンドポイントの実装のために呼び出されるAPI | 多くのOpenID SDKおよびライブラリは、OpenIDプロバイダーの公開鍵を取得し設定を簡略化するためにJWKsエンドポイントを照会します。モバイルやWebアプリの場合、OpenIDプロバイダーのJWKsエンドポイントへのアクセスが増加します。鍵のローテーションは数週間から数ヶ月単位で行われるため、このエンドポイントを安全にキャッシュすることができます。 |
クライアントの取得/api/{serviceId}/client/get/{clientId} |
クライアントの詳細と設定を取得するAPI | 前述のエンドポイントとは異なり、このエンドポイントは特定のエンドポイントを直接サポートするものではありませんが、一部のプロセスにおいて一般的に使用されます。クライアントメタデータが通常のフローの一部として使用される場合、このエンドポイントのレスポンスをキャッシュすることを推奨します。 |
Verifiable Credential Issuerメタデータの取得/api/{serviceId}/vci/metadata |
OpenID for Verifiable Credentialsをサポートするサービスのメタデータエンドポイントの実装のために呼び出されるAPI | メタデータエンドポイントはウォレットによって使用されるよう設計されているため、その使用状況によって利用が変動します。他のサービス設定エンドポイントと同様に、レスポンス内容はそれほど頻繁に変更されないため、安全にキャッシュすることが可能になります。 |
JSON Web Keyセットの取得/api/{serviceId}/vci/jwks |
SD-JWTが導入されているサービスのJWKsエンドポイントの実装のために呼び出されるAPI | OpenIDのJWKsと同様に、公開鍵はウォレットによって定期的にリクエストされるため、大量のリクエストが発生する可能性があります。通常、鍵のローテーションは数週間から数ヶ月単位で行われるため、このエンドポイントを安全にキャッシュすることができます。 |
イントロスペクションリクエストの処理/api/{serviceId}/auth/introspection |
クライアントアプリケーションから提示されたアクセストークンの情報を取得するために、認可サーバーの導入において保護されたリソースエンドポイントの実装のために呼び出されるAPI | トークンに関連付けられた情報の取得は、アプリケーションとリソースサーバーの通信方法によっては複数回発生する場合があります。一部のケースにおいては、Authleteのイントロスペクションエンドポイントのレスポンスをキャッシュすることによって、リソースサーバーAPIのレスポンスパフォーマンスが向上し、Authleteサービスへの負荷を軽減することができます。 詳細については、こちらの記事を参照してください。 |
OAuth 2.0イントロスペクションリクエストの処理/api/{serviceId}/auth/introspection/standard |
サービスのイントロスペクションエンドポイントの実装のために呼び出されるAPI | このエンドポイントは第三者が管理するリソースサーバーがトークンの状態を検証するための標準的な方法をサポートしています。標準イントロスペクションエンドポイントを使用するリソースサーバーを制御することが困難なため、短時間内に同じトークンを複数回検証しようとする可能性があります。このシナリオにおいてはキャッシングが有効な場合があります。 |
アプリケーションにキャッシュを実装する際は、以下の点に注意してください。
AuthleteのAPIを使用するアプリケーションは、一時的な失敗のみを対象としたリトライロジックを実装し、すべてのリクエストがシステムに処理される状態にする必要があります。すべてのリクエストに対して即座に再実行するアプリケーションは、複合的にエラーを引き起こし、システムリソースを圧迫し、接続枯渇やタイムアウト、さらには自らDDoS状態を招いてしまうリスクがあります。
アプリケーションに対するAuthleteのリトライロジックを実装する際は、以下の点に注意してください。
Ratelimit-Resetヘッダーに指定された時間が経過した後にのみ行ってください。レート制限違反をさらに悪化させてしまうリクエストの急激な増加(「リトライストーム」)を防ぐために、リトライ間に制御された遅延を導入してください。
指数バックオフと条件付きリトライを導入しても、持続的または一時的エラーが多発した場合にアプリケーションに対して重大なサービス障害を発生させてしまう可能性があります。この状況においては、失敗した操作を継続的に試行すると、アプリケーションリソースが枯渇し、Authlete APIへの負荷がさらに高まり、自ら障害を引き起こす結果につながりかねません。
アプリケーションに対してサーキットブレーカーパターンを実装する際は、以下の点に注意してください。
この仕組みは、不具合発生中のサービスに対する操作を迅速に停止することによって、アプリケーションの安定性を維持し、連鎖的な障害からシステム全体を保護する最終的な防御層です。