操作別のAPIキー認証の通信保護(OpenAPI 3.0)

個別のAPI操作のキー認証でHTTPSが必要な状態

説明

個別のAPI操作の security にAPIキー認証を指定することは、有効な構成です。ただし、暗号化されないHTTPでその操作を呼び出すと通信中にキーが漏えいする可能性があるため、HTTPSが必要です。

想定される影響

漏えいしたキーを入手した人が、そのキーに許可されたAPI操作を実行する可能性があります。

対処方法

対象の操作のサーバーとクライアントでHTTPSを必須にし、キーはURLではなくヘッダーで送信してください。文書と実際の認証ポリシーを一致させ、ログにキーが残らないようにしてください。漏えいしたキーは失効させて再発行してください。

例

次のOpenAPI 3.0の抜粋では、/pets 操作のAPIサーバーURLをHTTPSに変更し、認証をOAuth2に切り替える選択肢を示しています。OAuth2だけではAPI通信は暗号化されません。APIキーを維持してHTTPSとヘッダーを使うこともできます。実際のサーバーとクライアントにも適用してください。

変更前

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

変更後

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

参考資料