설명
apiKey는 유효한 인증 방식이며, 보안 스키마 선언 자체가 비밀 키의 노출을 의미하지는 않습니다. 다만 키를 쿼리 문자열로 전달하면 URL 로그 등에 남을 수 있으므로 전달 방식과 보관 정책을 점검해야 합니다.
잠재적 영향
노출된 키를 입수한 사람이 해당 키에 허용된 권한으로 API를 호출할 수 있습니다.
해결 방법
API 키는 HTTPS로 전송하고, URL 대신 헤더에 넣으세요. 로그에 키가 기록되지 않게 하고, 노출된 키는 폐기·교체하세요. 사용자별 권한 위임이 필요하다면 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"
}
}
}
}
}
}
}