リソースサーバ(Web API)が安全な認証および認可を実現するためには、以下のような責務が求められます。
1. アクセストークンの検証
- トークンの署名検証: リソースサーバは、リクエストに含まれるアクセストークンの署名が正しいことを検証し、トークンが改ざんされていないことを確認します。通常、署名検証には公開鍵を使用し、IDプロバイダーが提供する公開鍵を使って署名が有効であることを確認します。
-
トークンの有効期限のチェック: アクセストークンの有効期限(
exp
クレーム)を確認し、有効期限が切れたトークンを拒否します。 -
発行者(Issuer)の確認: トークンの
iss
クレームをチェックし、信頼できるIDプロバイダーによって発行されたものであることを確認します。 -
オーディエンス(Audience)の確認:
aud
クレームがリソースサーバを対象としていることを確認し、不正なトークンを排除します。
2. スコープと権限の検証
- トークンに含まれるスコープや権限の情報(
scope
またはroles
クレーム)を基に、リクエストされたリソースや操作が許可されているかを確認します。 - リソースサーバは各APIエンドポイントに対して必要なスコープや権限を定義し、不足している場合はアクセスを拒否するようにします。
3. トークンのリプレイ攻撃対策
- アクセストークンを使用したリクエストが一度きりのものであることを保証する対策が求められます。たとえば、トークンが頻繁に使用されている場合、不審なアクセスを検出する仕組みが考えられます。
- トークンの使い捨て(JWTの短期間有効化とリフレッシュトークンによる再認証)やトークンリクエストのトラッキングなどが挙げられます。
4. APIエンドポイントへのアクセス制御
- 各エンドポイントへのアクセス制御を適切に行い、アクセストークンの有無やスコープに基づいてアクセスを許可・拒否します。
- 一般ユーザーと管理者ユーザーなど、異なる権限に応じたアクセス制御も含まれます。
5. CORS(Cross-Origin Resource Sharing)の設定
- クライアントが異なるオリジン(ドメイン)からAPIにアクセスする場合に備え、CORSポリシーを設定します。特定の信頼できるオリジンのみを許可し、不正なオリジンからのリクエストを拒否します。
6. HTTPSの強制使用
- アクセストークンを含むリクエストは必ずHTTPS経由で送信し、通信内容が第三者に盗聴・改ざんされるリスクを防ぎます。
- HTTPリクエストが来た場合はHTTPSにリダイレクトするか、アクセスを拒否します。
7. レートリミットおよびIPフィルタリング
- リクエストの頻度を制限することで、悪意あるユーザーがサーバを過負荷にさせる攻撃(DoS攻撃など)を防ぎます。
- 特定のIPアドレスからのリクエストを制限したり、地理的に信頼できない地域からのアクセスをブロックしたりすることも考慮されます。
8. ログと監視
- 認証・認可に関する操作やエラーログを記録し、不審なアクセスやトークンの誤使用を検出できるようにします。
- アクセス状況をリアルタイムで監視することで、異常検知や迅速な対策が可能になります。
9. トークン失効の処理
- IDプロバイダーから通知されるトークン失効情報(リスト)を使用し、特定のトークンを無効化する仕組みを導入します。
- これは、例えばユーザーがログアウトした際や不正利用が検知された場合に必要となります。
10. リフレッシュトークンの非管理
- SPAやフロントエンドでのみ動作するアプリケーションからはリフレッシュトークンの扱いは避け、アクセストークンの短期間有効化とAPI側でのトークンリフレッシュ処理を推奨します。
- リフレッシュトークンは通常サーバーサイドで管理され、フロントエンドに直接露出しないように設計します。
これらの責務を果たすことで、リソースサーバはアクセストークンの適切な検証と、権限に基づいたアクセス制御を実現し、安全なWeb APIの運用が可能になります。