API セキュリティ保護
API サービスにおいて、X-Timestamp、X-Nonce、X-AccessKey、X-Signature は API リクエスト署名機構の一般的なコアコンポーネントであり、主に 認証、データ整合性検証、リプレイ攻撃防止 のために使用されます。
コアコンポーネント分析
1. X-Timestamp(タイムスタンプ)
機能
- リクエストの開始時間(通常は Unix タイムスタンプ)を記録し、サーバー側でリクエストのタイムリネスを検証します。
解決される問題
- リプレイ攻撃の防止:サーバーはタイムスタンプの有効期間(例:5 分)を設定し、期限切れのリクエストを直接拒否します。攻撃者は傍受した正当なリクエストが期限切れた後に再送することができません。
- 同期チェック:クライアントとサーバーの間の時間ずれが合理的な範囲内にあることを保証し、時間の改ざんがリクエストの有効性に影響するのを防ぎます。
2. X-Nonce(一回限りの乱数)
機能
- 一意のランダム文字列を生成(例:UUID)し、各リクエストの一意性を保証します。
解決される問題
- 重複リクエストの防止:サーバーは Nonce 値をキャッシュ(またはタイムスタンプと組み合わせ)して、既に処理された重複リクエストを拒否します。
- 署名の動的性の強化:同じパラメータを持つリクエストでも、Nonce が異なるため署名結果が異なり、署名の再利用を防ぎます。
3. X-AccessKey(アクセスキー)
機能
- クライアントの身分を識別し(例:ユーザー、アプリケーション、サービス)、通常はサーバーによって事前割り当てられた
SecretKeyとペアになります。
解決される問題
- 認証:リクエスト元が合法的に登録されたクライアントであるかどうかを検証します。
4. X-Signature(リクエスト署名)
機能
- クライアントは
SecretKeyを使用してリクエスト内容(パラメータ、パス、タイムスタンプ、Nonce など)の署名を生成し、サーバーは同じアルゴリズムを使用して署名を検証します。
解決される問題
- データ整合性:リクエストが送信中に改ざんされていないことを保証します(パラメータの変更は署名検証の失敗を引き起こします)。
- 身分偽造の防止:
SecretKeyを持たない攻撃者は正しい署名を生成できず、正当なリクエストを偽造することができません。 - 重要パラメータのバインド:署名アルゴリズムは通常、リクエストメソッド、パス、パラメータなどを含み、リクエスト内容と署名の一貫性を保証します。
全体的なプロセス例
クライアントの署名生成ステップ
- リクエストデータを連結する
- 暗号化アルゴリズムを介して
SecretKeyを使用して署名を生成し、X-Signatureヘッダーに格納する。 X-Timestamp、X-Nonce、X-AccessKey、X-Signatureをリクエストヘッダーに追加して送信する。
サーバー側の検証プロセス
- タイムスタンプの検証:有効期間内にあるかどうかを確認します(例:±5 分)。
- Nonce の検証:既に存在するかどうかを確認します(重複リクエストを防ぐため、タイムスタンプと共にキャッシュできます)。
- 署名の検証:
AccessKeyを介して対応するSecretKeyを見つけ、同じアルゴリズムを使用して署名を再生成し、X-Signatureと比較します。 - 結果の処理:すべての検証に合格した場合、リクエストのロジックを実行します。それ以外の場合は、401 Unauthorized または 403 Forbidden エラーを返します。
メカニズムの利点の概要
| 機能 | 実装方法 |
|---|---|
| 認証 | AccessKey がクライアントの身分を識別し、Signature がクライアントが有効な SecretKey を保持していることを検証します。 |
| データ改ざん防止 | 署名がリクエスト内容(メソッド、パス、パラメータなど)にバインドされており、どのような変更も署名検証の失敗を引き起こします。 |
| リプレイ攻撃防止 | Timestamp がタイムリネスを保証し、Nonce がリクエストの一意性を保証し、二重メカニズムが重複/期限切れのリクエストを拒否します。 |
| 否認防止 | 署名はリクエストの送信元を追跡することができ、クライアントは正当なリクエストを送信したことを否定することができません。 |