NGINX 및 Azure Active Directory를 통한 API Access 보안 구현
이 포스트에서는 API Connectivity Manager 및 Azure AD (Active Directory)를 사용하여 JWT(JSON Web Token) 유효성 검사를 설정하여 OIDC workflow의 인증 부분을 수행하는 방법에 대해 알아봅니다.
API는 애플리케이션 연결에서 중요한 역할을 하지만 공격에도 취약합니다. 과거에는 모놀리식 앱의 경우 보안을 위한 entry point가 한 군데였습니다. 마이크로서비스 아키텍처(MSA)에서 단일 앱은 API를 통해 연결된 마이크로서비스로 구성되는 경우가 많으며, 이러한 각 API에는 수백 개의 Endpoint가 있을 수 있습니다. 또한 새로운 API가 생성 되면서 보안 경계에 Entry point을 만들어 API에 대한 잠재적인 공격 표면이 더욱 거대해집니다.
API 보안을 위한 많은 전략이 있습니다. 가장 기본적인 것 중 하나는 접근 제어입니다. 간단히 말해서 사용자의 ID(인증 또는 AuthZ)를 확인하고 특정 리소스에 액세스할 수 있는지(인증 또는 AuthZ) 확인해야 합니다. OpenID Connect(OIDC) 구현은 API에 사용되는 가장 일반적인 액세스 제어 접근 방식 중 하나입니다. NGINX Management Suite의 일부인 API Connectivity Manager를 사용하면 몇 분 만에 이 기능을 시작하고 실행할 수 있습니다.
목차
1. OpenID Connect란?
2. 시작하기 위해 필요한 것
3. Azure AD 애플리케이션 생성
4. API Connectivity Manager에서 JWT Assertion 구성
5. Postman으로 테스트
6. 결론
1. OpenID Connect란?
OpenID Connect(OIDC)는 OAuth 2.0 프로토콜 위에 구축된 ID 프로토콜입니다. OIDC를 통해 클라이언트는 최종 사용자 또는 장치의 ID를 확인할 수 있습니다. 이것은 인증과 권한 부여를 모두 포함하는 접근 제어의 한 부분입니다.
- 인증(Authentication): 사용자 또는 장치가 자신이 주장하는 사람인지 확인합니다.
- 허가(Authorization): 인증된 사용자 또는 장치가 액세스할 수 있는 항목을 결정합니다.
이 포스트에서 사용할 Azure AD를 포함하여 다양한 OIDC 구현이 있습니다. 또는 APM(Access Policy Manager), Okta, Auth0, Ping Identity 등과 같은 다른 OIDC 솔루션을 API Connectivity Manager와 함께 사용할 수 있습니다.
2. 시작하기 위해 필요한 것
다음과 같은 구성 요소가 있는지 확인하십시오.
- API Connectivity Manager가 사용자 환경에 맞게 설치 및 구성
- 활성화된 Microsoft Azure 계정
- REST 클라이언트(이 포스트에서는 Postman이 사용됨)
API Connectivity Manager에 액세스해야 하는 경우 NGINX Management Suite 30일 무료 평가판을 사용할 수 있습니다.
3. Azure AD 애플리케이션 생성
브라우저를 열고 Azure Portal에 로그인합니다.
왼쪽 메뉴에서 App registrations을 클릭합니다.

New registration 버튼을 클릭합니다.

새 응용 프로그램을 만들려면 이름을 입력하고 URI를 redirect한 다음 Register 버튼을 클릭합니다. 이 데모에서는 Postman을 활용하므로 Postman OIDC redirect URI를 사용합니다.

이제 앱이 생성되었으므로 API에 대한 액세스를 제공하기 위해 OAuth scope를 생성해야 합니다. 왼쪽 메뉴에서 Expose a API 링크를 클릭합니다.

Add a scope 버튼을 클릭합니다.

기본 애플리케이션 ID URI를 사용하거나 사용자 고유의 ID URI를 만든 후 Saveand continue 버튼을 클릭합니다. 고유한 애플리케이션 ID URI를 만들려면 원하는 도메인을 Azure AD에 등록해야 합니다.

이 데모의 scope 경우는 Microsoft 예제를 기반으로 합니다. 다음 정보로 양식을 채우고 Add scope 버튼을 클릭합니다.
- Scope name: Employees.Read.All
- Who can content?: Admins and users
- Admin consent display name: Read-only access to Employee records
- Admin consent description: Allow read-only access to all Employee data.
- User consent display name: Read-only access to your Employee records
- User consent description: Allow read-only access to your Employee data.

그런 다음 Client ID를 가져와 클라이언트 애플리케이션을 승인해야 합니다. 왼쪽 메뉴에 Overview 링크를 클릭하고 Application (client) ID를 복사합니다.

다시 Exposure an API 링크를 클릭한 다음 Add a client application 버튼을 클릭합니다.

Client ID 필드에 복사 해둔 Application Client ID를 붙여 넣고 밑의 체크박스를 선택 후 Add application 버튼을 클릭합니다.

다음으로 이 데모는 인증 코드 와 PKCE(Proof Key for Code Exchange) OAuth grant type을 활용하므로 Postman에 대한 클라이언트 암호가 필요합니다. 왼쪽 메뉴에 Certificates & secrets 링크를 클릭하고 New client secret 버튼을 클릭합니다.

secret 이름을 입력하고 Expires 시간은 그대로 두고 Add 버튼을 클릭합니다.

그런 다음 클라이언트 암호를 복사하여 나중에 사용할 수 있도록 암호 저장소에 저장합니다.

4. API Connectivity Manager에서 JWT Assertion 구성
이제 Azure AD 애플리케이션이 구성되었으므로 API Connectivity Manager에서 정의된 서비스에 대해 JSON Web Token Assertion을 수행하도록 API gateway cluster를 설정할 수 있습니다. 이 단계에서는 Azure AD tenant’s의 JWK(JSON Web Key) 세트에 대한 URI를 결정해야 합니다.
Azure AD tenant’s의 endpoint에서 JWKS URI를 얻을 수 있습니다.
https://login.microsoftonline.com/
이 페이지는 jwks_uri 키를 포함하는 JSON payload를 제공합니다. jwks_uri값을 복사합니다.

이제 JWKS URI가 있으므로 API Connectivity Manager 콘솔을 열고 service proxy 구성으로 이동합니다. JSON Web Token Assertion 정책에 대해 Add Policy를 클릭합니다.

그런 다음 Azure AD Tenant’s의 JKWS URI를 URI Location 필드에 붙여넣은 다음 Add 버튼을 클릭합니다.

Save & Publish 버튼을 클릭하여 정책을 API gateway cluster로 푸시합니다.

이제 구성된 service gateway에서 JWT Assertion을 수행하도록 API Connectivity Manager 인스턴스가 구성되었습니다.
5. Postman으로 테스트
이제 설정을 테스트하고 예상대로 작동하는지 확인할 차례입니다. 시작하려면 Azure AD 애플리케이션에서 가져와야 하는 몇 가지 사항이 있습니다.
- Application client secret(이전에 저장한 암호 입니다.)
- OAuth scope
- OAuth authorization endpoint
- OAuth token endpoint
OAuth scope를 가져오려면 Azure Portal을 열고 앱 등록 페이지로 다시 이동합니다. 그런 다음 왼쪽 메뉴에서 Expose an API 링크를 클릭하고 Scope에 대한 Copy 기호를 클릭합니다. 나중에 사용할 수 있도록 이 값을 따로 저장하십시오.

OAuth 인증 및 token endpoint을 얻으려면 왼쪽 메뉴에서 Overview 링크를 클릭한 다음 Endpoints 버튼을 클릭합니다. 그런 다음 인증 및 token endpoint URI를 복사합니다.


Postman을 열고 Environments 메뉴를 클릭합니다. 그런 다음 Create Environment 링크를 클릭합니다.

환경 이름을 지정하고 이전 단계에서 저장된 값을 가진 6개의 변수를 Initial Value 열과 Current Value 열에 추가한 다음 Save 버튼을 클릭합니다.
- client_id: Azure AD Application’s client ID
- client_secret: Azure AD Application’s client secret
- auth_url: Azure AD Tenant’s OAuth Authorization URL
- token_url: Azure AD Tenant’s OAuth Token URL
- tenant_id: Azure AD Directory (tenant) ID
- scope: Azure AD Application’s API scope Application ID URL

Postman에서 새 탭을 열고 다음 단계를 수행합니다.
- 오른쪽 상단에 있는 ACM으로 환경 변경
- 주소 표시줄에 API URL 추가
- Auth 탭 클릭
- Type 을 OAuth 2.0 변경
- Auth 구성을 아래로 스크롤하 다음 변수를 설정합니다.
- Auth URL: {{auth_url}}
- Access Token URL: {{token_url}}
- Client ID: {{client_id}}
- Client Secret: {{client_secret}}
- Get New Access Token 버튼을 클릭합니다.


브라우저 창이 열리고 Azure AD 자격 증명으로 로그인하라는 메시지가 표시됩니다. 인증에 성공하면 다시 Postman으로 redirect되고 다음 창이 나타납니다. Use Token 버튼을 클릭합니다.

이제 OAuth 액세스 토큰을 얻었으므로 API 호출을 할 수 있습니다. Save 버튼 클릭한 다음 Send 버튼를 클릭합니다.

6. 결론
이제 Azure AD OAuth Access 토큰을 사용하여 API를 보호하는 API Connectivity Manager가 있습니다. 다음 단계는 추가 OAuth 범위를 추가하고 API Connectivity Manager에서 해당 scope를 보호된 API로 전달하도록 API Gateway cluster를 구성하는 것입니다.
댓글을 달려면 로그인해야 합니다.