全体に適用するAPIキー認証の通信保護(OpenAPI 3.0)

全体に適用するAPIキー認証でHTTPSが必要な状態

説明

全体の security にAPIキー認証を指定した場合、その認証を使うリクエストではHTTPSでキーを送信する必要があります。暗号化されないHTTPで送ると、通信中にキーが漏えいする可能性があります。

想定される影響

通信を盗み見た人がキーを入手し、そのキーに許可された権限でAPIを呼び出す可能性があります。

対処方法

APIサーバーとクライアントがHTTPSのみを使うように設定し、文書にも反映してください。OpenAPI 3.0では servers のURL、2.0では schemes を確認してください。キーはURLではなくヘッダーで送信し、ログに残さないでください。

例

次のOpenAPI 3.0の抜粋では、APIサーバーのURLをHTTPからHTTPSに変更し、OAuth2を使う選択肢を示しています。OAuth2でもAPI通信にHTTPSが必要です。APIキーを維持してHTTPSとヘッダーを使うこともできます。文書を実際のサーバーとクライアントの設定に合わせてください。

変更前

json
{
  "openapi": "3.0.0",
  "servers": [{"url": "http://api.example.com"}],
  "security": [
    {
      "apiKeyAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKeyAuth": {
        "type": "apiKey",
        "name": "X-API-Key",
        "in": "query"
      }
    }
  }
}

変更後

json
{
  "openapi": "3.0.0",
  "servers": [{"url": "https://api.example.com"}],
  "security": [
    {
      "OAuth2": [
        "read"
      ]
    }
  ],
  "components": {
    "securitySchemes": {
      "OAuth2": {
        "type": "oauth2",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://example.com/oauth/authorize",
            "tokenUrl": "https://example.com/oauth/token",
            "scopes": {
              "read": "read objects in your account"
            }
          }
        }
      }
    }
  }
}

参考資料