説明
apiKey は有効な認証方式であり、セキュリティスキームの宣言自体が秘密のキーの漏えいを意味するわけではありません。ただし、クエリ文字列で送るキーはURLのログなどに残る可能性があるため、送信方法と管理方法を確認する必要があります。
想定される影響
漏えいしたキーを入手した人が、そのキーに許可された権限でAPIを呼び出す可能性があります。
対処方法
APIキーはURLではなくヘッダーに入れ、HTTPSで送信してください。ログへの記録を防ぎ、漏えいしたキーは失効させて再発行してください。ユーザーごとの権限委譲が必要な場合は、OAuth2などの適切な方式を検討してください。
例
次の抜粋では、クエリ文字列のAPIキー認証をOAuth2に変更する選択肢を示しています。APIキーを維持してHTTPSとヘッダーを使うこともできます。スキームの変更だけでは認証の動作は変わらないため、サーバーとクライアントも合わせて設定する必要があります。
変更前
json
{
"openapi": "3.0.0",
"security": [
{
"apiKeyAuth": []
}
],
"components": {
"securitySchemes": {
"apiKeyAuth": {
"type": "apiKey",
"name": "X-API-Key",
"in": "query"
}
}
}
}
変更後
json
{
"openapi": "3.0.0",
"security": [
{
"oauthAuth": []
}
],
"components": {
"securitySchemes": {
"oauthAuth": {
"type": "oauth2",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://example.com/api/oauth/dialog",
"tokenUrl": "https://example.com/api/oauth/token",
"scopes": {
"read:pets": "read your pets"
}
}
}
}
}
}
}