설명
OpenAPI 3.0의 OAuth2 flows.password는 클라이언트가 사용자 비밀번호를 직접 받아 토큰을 요청하는 흐름을 정의합니다. RFC 9700은 사용자 자격 증명이 클라이언트에 노출되는 이 방식을 사용하지 않도록 요구합니다.
잠재적 영향
클라이언트가 침해되면 액세스 토큰뿐 아니라 원래 비밀번호도 유출될 수 있습니다. 여러 단계의 사용자 확인이나 피싱 방지 인증을 도입하기에도 적합하지 않습니다.
해결 방법
사용자가 참여하는 인증에는 PKCE를 적용한 authorizationCode 흐름을 사용하세요. HTTPS 인가·토큰 URL을 지정하고 실제 클라이언트와 인증 서버를 변경한 뒤 비밀번호 흐름을 비활성화하세요.
예시
아래 발췌문은 petstore_auth의 흐름 정의를 변경합니다. URL은 실제 제공자의 주소로 바꾸세요. PKCE 적용과 해당 방식을 요구하는 security 설정은 실제 구성에서도 확인해야 합니다.
변경 전
json
{
"openapi": "3.0.0",
"components": {
"securitySchemes": {
"petstore_auth": {
"type": "oauth2",
"flows": {
"password": {
"tokenUrl": "https://example.com/api/oauth/token",
"scopes": {
"write:pets": "modify pets in your account",
"read:pets": "read your pets"
}
}
}
}
}
}
}
변경 후
json
{
"openapi": "3.0.0",
"components": {
"securitySchemes": {
"petstore_auth": {
"type": "oauth2",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://example.org/api/oauth/dialog",
"tokenUrl": "https://example.com/api/oauth/token",
"scopes": {
"write:pets": "modify pets in your account",
"read:pets": "read your pets"
}
}
}
}
}
}
}