OpenAPI 3.0의 OAuth2 비밀번호 흐름

OAuth2 비밀번호 흐름은 사용자 비밀번호를 클라이언트에 노출합니다.

설명

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"
            }
          }
        }
      }
    }
  }
}

참조