위 그림은 OIDC가 OCI Identity Domain(IdP), OCI API Gateway(RP)와 동작하는 과정을 보여줍니다.
이번 실습을 위해 사전에 OCI API Gateway를 위한 OAuth2 구성을 통해서 OCI Identity Domain의 Credential Application 및 API Gateway 사전 구성이 필요합니다.
OCI API Gateway를 위한 OAuth2 구성에서 OAuth2를 위해 구성한 Credential Application을 활용합니다. 위에서 생성한 Hello APIGW Application을 클릭한 후 Edit OAuth configuration을 클릭합니다.
Resource Server 구성을 하여 별도의 Scope와 Audience를 설정할 수 있지만, OpenID의 표준 Scope인 openid
를 사용하여 구성할 수 있습니다. 여기서는 별도의 Resource Server 구성을 하지 않고 진행합니다. No resource server configuration를 선택합니다.
Client 구성에서는 IdP(Identity Domain)을 통해서 일회용 인증 코드(Authorization code)를 발급받아야 하므로, Allowed grant types에서 Authorization Code를 선택합니다.
인증 코드(Authorization code)를 선택하면 Redirect URL값은 필수입니다. API Gateway 배치 엔드포인트와 Route를 포함한 전체 주소를 입력합니다. 다음은 예시입니다.
https://dy5mzlv4uhvrn.........apigateway.ap-seoul-1.oci.customer-oci.com/hello
마지막으로 클라이언트에서 Scope를 사용하지 않을 것이므로 Add resources 체크를 해제한 후 Save changes를 클릭하여 저장합니다.
OCI API Gateway를 위한 OAuth2 구성에서 생성한 API Gateway(hello-apigw)를 선택한 후 좌측 Deployments에서 생성한 Deployment(hello)를 선택, Edit을 선택합니다. Basic Information은 Skip(Next 클릭)한 후 Authentication 단계에서 다음과 같이 수정합니다.
hello
를 Client ID 값으로 변경
로 변경 (예, ae09790ecc454fc8b619cced26948c4f)PKCE(Proof Key for Code Exchange)는 인증 코드(Authorization Code)를 통한 Access Code 발급 과정에서 좀 더 강화된 보안을 제공해 주기위한 확장 버전으로, 클라이언트에서 인증 코드 요청 시 Code Challenge를 전달하게 되고(위 흐름에서 3번), API Gateway에서 인증 코드를 통해 Access Code 교환 요청 시 code_verifier를 전달(위 흐름에서 6번)하여 IdP가 두 코드를 비교한 후 Access Code를 발급하게 함으로써 인증 코드를 탈취 당하더라도 Access Code를 발급받지 못하도록 막을 수 있습니다.
이제 Next를 클릭한 후 Routes단계에서 Show route response policies 를 클릭한 후 다음과 같이 Header transformations 설정을 합니다. 이 단계에서 클라이언트로 id_token과 access_token을 직접 전달할 수 있습니다.
Next를 클릭한 후 Review 단계에서 Save changes를 클릭하여 저장합니다.
크롬 브라우저에서 테스트합니다. 브라우저에서 API Gateway에 배치한 API 엔드포인트 + Route Path(예시: https://dy5mzlv4uhvrn………apigateway.ap-seoul-1.oci.customer-oci.com/hello)를 요청하면 다음과 같이 OCI 인증 페이지를 볼 수 있습니다.
인증을 완료하면, 다음과 같이 정상적으로 응답 결과를 볼 수 있습니다. 인증 코드(Authorization Code)를 요청하는 과정에서 code_challenge가 같이 전달되는 것을 확인할 수 있으며, 발급받은 인증 코드를 통해서 API 엔드포인트를 호출하는 것을 확인할 수 있습니다.
이 글은 개인적으로 얻은 지식과 경험을 작성한 글로 내용에 오류가 있을 수 있습니다. 또한 글 속의 의견은 개인적인 의견으로 특정 회사를 대변하지 않습니다.
Donghu Kim CLOUDNATIVE
api oauth2 openid connect