Azure AD B2C를 사용하여 Azure API Management API 보호

Azure AD B2C(Azure Active Directory B2C)에서 인증을 받은 클라이언트로 Azure API Management API에 대한 액세스를 제한하는 방법을 알아봅니다. 이 문서의 지침에 따라 유효한 Azure AD B2C에서 발급된 액세스 토큰을 포함하는 요청으로만 액세스를 제한하는 Azure API Management에서 인바운드 정책을 만들고 테스트합니다.

필수 조건

시작하려면 먼저 다음 리소스가 있는지 확인하세요.

Azure AD B2C 애플리케이션 ID 가져오기

Azure AD B2C를 사용하여 Azure API Management에서 API를 보호하는 경우 Azure API Management에서 만든 인바운드 정책에 대한 몇 가지 값이 필요합니다. 먼저 Azure AD B2C 테넌트에서 이전에 만든 애플리케이션의 애플리케이션 ID를 적어 둡니다. 필수 조건을 충족하기 위해 만든 애플리케이션을 사용하는 경우 webapp1에 대한 애플리케이션 ID를 사용합니다.

Azure AD B2C 테넌트에 애플리케이션을 등록하려면 새로운 통합 ‘앱 등록’ 환경 또는 레거시 ‘애플리케이션’ 환경을 사용하면 됩니다. 세 등록 환경에 대해 자세히 알아보세요.

  1. Azure Portal에 로그인합니다.
  2. 여러 테넌트에 액세스할 수 있는 경우 상단 메뉴의 설정 아이콘을 선택하여 디렉터리 + 구독 메뉴에서 Azure AD B2C 테넌트로 전환합니다.
  3. 왼쪽 창에서 Azure AD B2C를 선택합니다. 또는 모든 서비스를 선택하고 Azure AD B2C를 검색하여 선택할 수 있습니다.
  4. 앱 등록을 선택하고 소유한 애플리케이션 탭을 선택합니다.
  5. webapp1 또는 이전에 만든 다른 애플리케이션에 대한 애플리케이션(클라이언트) ID 열의 값을 기록해 둡니다.

토큰 발급자 엔드포인트 가져오기

다음으로 Azure AD B2C 사용자 흐름 중 하나에 대한 잘 알려진 구성 URL을 가져옵니다. 또한 Azure API Management에서 지원하려는 토큰 발급자 엔드포인트 URI가 필요합니다.

  1. Azure Portal에서 Azure AD B2C 테넌트로 이동합니다.

  2. 정책 아래에서 사용자 흐름을 선택합니다.

  3. 기존 정책(예: B2C_1_signupsignin1)을 선택하고 사용자 흐름 실행을 선택합니다.

  4. 페이지 맨 위의 사용자 흐름 실행 제목 아래에 표시되는 하이퍼링크의 URL을 기록해 둡니다. 이 URL은 사용자 흐름에 대한 OpenID Connect의 잘 알려진 검색 엔드포인트로, 다음 섹션에서 Azure API Management에서 인바운드 정책을 구성할 때 이 URL을 사용합니다.

    Screenshot of the well-known URI hyperlink on the

  5. 하이퍼링크를 선택하여 OpenID Connect의 잘 알려진 구성 페이지로 이동합니다.

  6. 브라우저에서 페이지가 열리면 issuer 값을 기록해 둡니다. 예시:

    https://<tenant-name>.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

    다음 섹션에서 Azure API Management에서 API를 구성할 때 이 값을 사용합니다.

이제 다음 섹션에서 사용할 2개의 URL인 OpenID Connect의 잘 알려진 구성 엔드포인트 URL과 발급자 URI를 적어 두었을 것입니다. 예시:

https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration
https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/

Azure API Management에서 인바운드 정책 구성

이제 API 호출의 유효성을 검사하는 Azure API Management에서 인바운드 정책을 추가할 준비가 되었습니다. 액세스 토큰에서 대상 그룹 및 발급자를 확인하는 JWT(JSON Web Token) 유효성 검사 정책을 추가하여 유효한 토큰이 있는 API 호출만 허용되도록 할 수 있습니다.

  1. Azure Portal에서 Azure API Management 인스턴스로 이동합니다.

  2. API를 선택합니다.

  3. Azure AD B2C를 사용하여 보안을 유지할 API를 선택합니다.

  4. 디자인 탭을 선택합니다.

  5. 인바운드 처리에서 </>를 선택하여 정책 코드 편집기를 엽니다.

  6. <inbound> 정책 내에 다음 <validate-jwt> 태그를 배치하고 다음을 수행합니다.

    a. <openid-config> 요소의 url 값을 정책의 잘 알려진 구성 URL로 업데이트합니다.
    b. <audience> 요소를 B2C 테넌트에서 이전에 만든 애플리케이션의 애플리케이션 ID(예: webapp1)로 업데이트합니다.
    c. <issuer> 요소를 앞에서 적어 둔 토큰 발급자 엔드포인트로 업데이트합니다.

    <policies>
        <inbound>
            <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
                <openid-config url="https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration" />
                <audiences>
                    <audience>44444444-0000-0000-0000-444444444444</audience>
                </audiences>
                <issuers>
                    <issuer>https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
                </issuers>
            </validate-jwt>
            <base />
        </inbound>
        <backend> <base /> </backend>
        <outbound> <base /> </outbound>
        <on-error> <base /> </on-error>
    </policies>
    

보안 API 액세스의 유효성 검사

인증된 호출자만 API에 액세스할 수 있도록 하려면 Postman으로 API를 호출하여 Azure API Management 구성의 유효성을 검사할 수 있습니다.

API를 호출하려면 Azure AD B2C에서 발급한 액세스 토큰과 Azure API Management 구독 키가 모두 필요합니다.

액세스 토큰 가져오기

먼저 Postman의 Authorization 헤더에서 사용하기 위해 Azure AD B2C에서 발급한 토큰이 필요합니다. 필수 조건 중 하나로 만든 가입/로그인 사용자 흐름의 ‘지금 실행’ 기능을 사용하여 토큰을 가져올 수 있습니다.

  1. Azure Portal에서 Azure AD B2C 테넌트로 이동합니다.

  2. 정책 아래에서 사용자 흐름을 선택합니다.

  3. 기존 가입/로그인 사용자 흐름(예: B2C_1_signupsignin1)을 선택합니다.

  4. 애플리케이션으로 webapp1을 선택합니다.

  5. 회신 URLhttps://jwt.ms를 선택합니다.

  6. 사용자 흐름 실행을 선택합니다.

    Screenshot of the

  7. 로그인 프로세스를 완료합니다. https://jwt.ms으로 리디렉션됩니다.

  8. 브라우저에 표시되는 인코딩된 토큰 값을 기록해 둡니다. Postman의 인증 헤더에 이 토큰 값을 사용합니다.

    Screenshot of the encoded token value displayed on jwt.ms.

API 구독 키 가져오기

게시된 API를 호출하는 클라이언트 애플리케이션(이 경우 Postman)에는 API에 대한 HTTP 요청에 유효한 API Management 구독 키가 포함되어야 합니다. Postman HTTP 요청에 포함할 구독 키를 가져오려면

  1. Azure Portal에서 Azure API Management 서비스 인스턴스로 이동합니다.
  2. 구독을 선택합니다.
  3. 제품: 제한 없음 옆에 있는 줄임표(...)를 선택하고 키 표시/숨기기를 선택합니다.
  4. 제품의 기본 키를 기록해 둡니다. Postman의 HTTP 요청에서 Ocp-Apim-Subscription-Key 헤더에 이 키를 사용합니다.

Screenshot of the

보안 API 호출 테스트

액세스 토큰 및 Azure API Management 구독 키를 기록해 두었으므로 API에 대한 보안 액세스를 올바르게 구성했는지 테스트할 준비가 되었습니다.

  1. Postman에서 새 GET 요청을 만듭니다. 요청 URL에 대해 게시한 API의 스피커 목록 엔드포인트를 필수 조건 중 하나로 지정합니다. 예시:

    https://contosoapim.azure-api.net/conference/speakers

  2. 그런 후 다음 헤더를 추가합니다.

    Authorization 앞에서 기록해 둔 인코딩된 토큰 값으로, Bearer 접두사가 붙습니다(“Bearer” 뒤에 공백 포함).
    Ocp-Apim-Subscription-Key 앞에서 기록해 둔 Azure API Management 구독 키입니다.

    GET 요청 URL 및 헤더는 다음 이미지와 유사하게 표시됩니다.

    Screenshot of the Postman UI showing the GET request URL and headers.

  3. Postman에서 보내기 단추를 선택하여 요청을 실행합니다. 모든 항목을 올바르게 구성한 경우에는 컨퍼런스 발표자 컬렉션을 포함하는 JSON 응답이 제공됩니다(여기서는 잘려서 표시됨).

    {
      "collection": {
        "version": "1.0",
        "href": "https://conferenceapi.azurewebsites.net:443/speakers",
        "links": [],
        "items": [
          {
            "href": "https://conferenceapi.azurewebsites.net/speaker/1",
            "data": [
              {
                "name": "Name",
                "value": "Scott Guthrie"
              }
            ],
            "links": [
              {
                "rel": "http://tavis.net/rels/sessions",
                "href": "https://conferenceapi.azurewebsites.net/speaker/1/sessions"
              }
            ]
          },
    [...]
    

비보안 API 호출 테스트

이제 요청이 성공적으로 완료되었으므로 실패 사례를 테스트하여 잘못된 토큰을 사용한 API 호출이 예상대로 거부되는지 확인합니다. 테스트를 수행하는 한 가지 방법은 토큰 값에서 몇 개의 문자를 추가하거나 변경하고 이전과 동일한 GET 요청을 실행하는 것입니다.

  1. 토큰 값에 여러 문자를 추가하여 잘못된 토큰을 시뮬레이트합니다. 예를 들어 다음과 같이 토큰 값에 “INVALID”를 추가할 수 있습니다.

    Screenshot of the Headers section of Postman UI showing the string INVALID added to token.

  2. 보내기 단추를 선택하여 요청을 실행합니다. 잘못된 토큰을 사용하는 경우 예상되는 결과는 401 권한 없는 상태 코드입니다.

    {
        "statusCode": 401,
        "message": "Unauthorized. Access token is missing or invalid."
    }
    

401 상태 코드가 표시되면 Azure AD B2C에서 발급한 유효한 액세스 토큰이 있는 호출자만 Azure API Management API에 대해 성공적인 요청을 수행할 수 있는 것입니다.

여러 애플리케이션 및 발급자 지원

일부 애플리케이션은 일반적으로 단일 REST API와 상호 작용합니다. API에서 여러 애플리케이션용으로 발급된 토큰을 허용하도록 하려면 Azure API Management 인바운드 정책의 <audiences> 요소에 애플리케이션 ID를 추가합니다.

<!-- Accept tokens intended for these recipient applications -->
<audiences>
    <audience>44444444-0000-0000-0000-444444444444</audience>
    <audience>66666666-0000-0000-0000-666666666666</audience>
</audiences>

마찬가지로, 여러 토큰 발급자를 지원하려면 Azure API Management 인바운드 정책의 <issuers> 요소에 엔드포인트 URI를 추가합니다.

<!-- Accept tokens from multiple issuers -->
<issuers>
    <issuer>https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
    <issuer>https://login.microsoftonline.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
</issuers>

b2clogin.com으로 마이그레이션

레거시 login.microsoftonline.com 엔드포인트에서 발급한 토큰의 유효성을 검사하는 Azure API ManagementM API가 있는 경우 해당 API와 b2clogin.com에서 발급한 토큰을 사용하기 위해 이 API를 호출하는 애플리케이션을 마이그레이션해야 합니다.

다음과 같은 일반적인 프로세스에 따라 단계적 마이그레이션을 수행할 수 있습니다.

  1. b2clogin.com 및 login.microsoftonline.com 둘 다에서 발급된 토큰에 대한 Azure API Management 인바운드 정책에 지원을 추가합니다.
  2. 애플리케이션을 한 번에 하나씩 업데이트하여 b2clogin.com 엔드포인트에서 토큰을 가져옵니다.
  3. 모든 애플리케이션이 b2clogin.com에서 토큰을 제대로 가져오면 API에서 login.microsoftonline.com 발급 토큰에 대한 지원을 제거합니다.

다음 예제 Azure API Management 인바운드 정책은 b2clogin.com 및 login.microsoftonline.com 둘 다에서 발급된 토큰을 허용하는 방법을 보여 줍니다. 또한 이 정책은 두 애플리케이션에서 API 요청을 지원합니다.

<policies>
    <inbound>
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
            <openid-config url="https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration" />
            <audiences>
                <audience>44444444-0000-0000-0000-444444444444</audience>
                <audience>66666666-0000-0000-0000-666666666666</audience>
            </audiences>
            <issuers>
                <issuer>https://login.microsoftonline.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
                <issuer>https://<tenant-name>.b2clogin.com/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
            </issuers>
        </validate-jwt>
        <base />
    </inbound>
    <backend> <base /> </backend>
    <outbound> <base /> </outbound>
    <on-error> <base /> </on-error>
</policies>

다음 단계

Azure API Management 정책에 대한 자세한 내용은 Azure API Management 정책 참조 인덱스를 참조하세요.

OWIN 기반 웹 API 및 해당 애플리케이션을 b2clogin.com으로 마이그레이션하는 방법은 OWIN 기반 웹 API를 b2clogin.com으로 마이그레이션을 참조하세요.