PKCE(Proof Key for Code Exchange) 지원

OAuth 클라이언트를 위한 PKCE(Proof Key for Code Exchange) 지원을 구성할 수 있습니다.

PKCE(Proof Key for Code Exchange) 지원은 모바일 디바이스에서 권한 코드 플로우를 수행할 때 보안을 추가하는 기능(RFC 7636에 정의됨)입니다. 이는 다음 조건이 true인 경우 발생할 수 있는 가능한 보안 문제점을 처리합니다.

  • 클라이언트 시크릿이 없습니다.
  • 브라우저 또는 운영 체제가 인증 요청 수행에 사용되고 있습니다.
  • 기본 모바일 애플리케이션이 인증 요청에서 경로 재지정을 이용하고 있고 토큰 엔드포인트에서 액세스 토큰으로 코드 교환을 수행하고 있습니다.

PKCE 지원은 모바일 디바이스에서 악의적 행위자가 기본 앱으로 다시 경로 재지정하는 것을 방해하고 악의적으로 권한 코드 및 리턴된 액세스 토큰을 사용할 위험을 낮추는 데 사용됩니다. 시나리오에 대한 자세한 설명은 IETF(Internet Engineering Task Force) RFC(Request for Comments) 7636: https://tools.ietf.org/html/rfc7636을 참조하십시오.

PKCE에서는 OAuth 클라이언트가 무작위 문자열을 생성하고 이 문자열에서 해시(SHA256 + BASE64URL)를 수행해야 합니다. /token에서 사용하도록 초기 문자열을 유지해야 하고 해시와 해시 메소드 둘 다 /authorize에 제공됩니다. 해시와 메소드를 받을 때 권한 서버는 발행된 권한 코드에 대해 이 값을 유지합니다. 권한 코드가 초기에 생성된 문자열과 함께 /token에 제공되면 해시 메소드가 제공된 문자열에 적용되고 /authorize에 제공된 문자열에 대해 검사됩니다. 두 항목이 일치하면 /token에 대한 요청이 성공합니다. 일치하지 않으면 요청이 거부됩니다.

처리 플로우는 다음과 같습니다.

  1. 클라이언트는 code_verifier를 생성하고, code_challenge_method를 사용하여 code_challenge를 계산합니다.
  2. 클라이언트가 /authorize에 대한 요청을 작성합니다.
  3. 권한 서버가 /authorize에 대한 표준 OAuth 요청 유효성 검증을 수행합니다.
  4. 권한 서버가 code_challengecode_challenge_method의 존재를 확인합니다.
  5. 권한 서버가 권한 코드에 대해 code_challengecode_challenge_method를 저장합니다.
  6. 권한 서버가 권한 코드 응답을 리턴합니다.
  7. 클라이언트가 추가 code_verifier를 포함해 권한 코드를 /token에 제공합니다.
  8. 권한 서버가 /token에 대한 표준 OAuth 요청 유효성 검증을 수행합니다.
  9. 권한 서버가 제공된 code_verifier 및 저장된 code_challenge_method를 사용하여 고유 code_challenge를 생성합니다.
  10. 권한 서버가 생성된 code_challenge를 /authorize에 대한 초기 요청에 제공된(및 권한 코드에 대해 저장된) 값과 비교합니다.
  11. 두 값이 일치하면 액세스 토큰이 발행됩니다. 일치하지 않으면 요청이 거부됩니다.
참고: IETF 스펙에 위의 플로우의 다이어그램이 포함됩니다. https://tools.ietf.org/html/rfc7636#section-1.1를 참조하십시오.

PKCE에 대한 IBM Security Access Manager 지원을 사용하려면 requirePkce 특성을 true로 설정하도록 OAuth 클라이언트를 구성해야 합니다. OAuth 클라이언트의 이 특성을 true로 설정하면 다음 조건이 적용됩니다.

  • 새 매개변수가 /token에 대한 요청에 필요합니다.
    코드 검증자
    RFC의 섹션 4.1에 지정된 대로 공격자가 해당 값을 예측할 수 없게 만들어진 암호화 문자열입니다. /authorize 요청에 제공된 code_challenge_method에서 이 값을 사용하여 code_challenge에 대해 검사하도록 값을 작성하며, 해당 값은 /authorize에도 제공됩니다.
  • 두 개의 새 매개변수는 /authorize에 대한 요청에 필요합니다.
    code_challenge

    code_verifiercode_challenge_method의 결과. RFC 섹션 4.2에 지정된 대로 SHA256 + BASE64URL 인코드의 결과여야 합니다.

    code_challenge_method

    /token에 제공된 대로 code_verifier에 적용된 메소드이며, code_challenge의 값을 검사하는 데 사용됩니다. code_challenge_method 값은 RFC의 섹션 4.2에 지정된 대로 S256이어야 합니다.