Azure Active Directory B2C를 사용하여 샘플 Angular 단일 페이지 애플리케이션에서 인증 구성

이 문서에서는 샘플 Angular SPA(단일 페이지 애플리케이션)을 사용하여 Angular 앱에 Azure AD B2C(Azure Active Directory B2C) 인증을 추가하는 방법을 설명합니다.

개요

OIDC(OpenID Connect)는 웹 애플리케이션에 사용자가 안전하게 로그인하는 데 사용할 수 있는 OAuth 2.0 기반의 인증 프로토콜입니다. 이 Angular 샘플에서는 MSAL AngularMSAL Browser를 사용합니다. MSAL은 Angular SPA에 인증 및 권한 부여 지원을 간편하게 추가할 수 있도록 하는 Microsoft에서 제공하는 라이브러리입니다.

로그인 흐름

로그인 흐름에 포함되는 단계는 다음과 같습니다.

  1. 사용자가 앱을 열고 로그인을 선택합니다.
  2. 앱에서 인증 요청을 시작하고 사용자를 Azure AD B2C로 리디렉션합니다.
  3. 사용자가 가입 또는 로그인하거나, 암호를 초기화하거나, 소셜 계정으로 로그인합니다.
  4. 로그인에 성공하면 Azure AD B2C는 앱에 인증 코드를 반환합니다. 앱은 다음 작업을 수행합니다.
    1. 인증 코드를 ID 토큰, 액세스 토큰, 새로 고침 토큰으로 교환합니다.
    2. ID 토큰 클레임을 읽습니다.
    3. 나중에 사용할 수 있도록 액세스 토큰 및 새로 고침 토큰을 메모리 내 캐시에 저장합니다. 액세스 토큰을 통해 웹 API와 같은 보호된 리소스를 호출할 수 있습니다. 새로 고침 토큰을 사용하여 새 액세스 토큰을 획득합니다.

앱 등록

앱이 Azure AD B2C로 로그인하고 웹 API를 호출할 수 있도록 하려면 Azure AD B2C 테넌트에 두 개의 애플리케이션을 등록해야 합니다.

  • 단일 페이지 애플리케이션(Angular) 등록을 사용하면 앱이 Azure AD B2C로 로그인할 수 있습니다. 앱을 등록하는 동안 리디렉션 URI를 지정합니다. 리디렉션 URI는 사용자가 Azure AD B2C로 인증하면 리디렉션되는 엔드포인트입니다. 앱 등록 프로세스는 앱을 고유하게 식별하는 애플리케이션 ID(클라이언트 ID라고도 함)를 생성합니다. 이 문서는 예제 앱 ID: 1을 사용합니다.

  • 웹 API 등록을 사용하면 앱에서 보안 웹 API를 호출할 수 있습니다. 등록은 웹 API 권한(범위)을 노출합니다. 앱 등록 프로세스는 웹 API를 고유하게 식별하는 애플리케이션 ID를 생성합니다. 이 문서에서는 예제 앱 ID: 2를 사용합니다. 웹 API 범위(앱 ID: 2)에 앱(앱 ID: 1) 권한을 부여합니다.

다음 다이어그램에서는 앱 등록 및 앱 아키텍처에 대해 설명합니다.

Diagram that describes a single-page application with web A P I, registrations, and tokens.

웹 API 호출

인증이 완료된 후 사용자는 보호된 웹 API를 호출하는 앱을 조작합니다. 웹 API는 전달자 토큰 인증을 사용합니다. 전달자 토큰은 앱이 Azure AD B2C에서 가져온 액세스 토큰입니다. 앱은 HTTPS 요청의 인증 헤더에 토큰을 전달합니다.

Authorization: Bearer <access token>

액세스 토큰의 범위가 웹 API의 범위와 일치하지 않는 경우 인증 라이브러리는 올바른 범위의 새 액세스 토큰을 얻게 됩니다.

로그아웃 흐름

로그아웃 흐름에 포함되는 단계는 다음과 같습니다.

  1. 앱에서 사용자가 로그아웃합니다.
  2. 앱은 해당 세션 개체를 지우고, 인증 라이브러리는 해당 토큰 캐시를 지웁니다.
  3. 앱이 사용자를 Azure AD B2C 로그아웃 엔드포인트로 이동하여 Azure AD B2C 세션을 종료합니다.
  4. 사용자가 앱으로 다시 리디렉션됩니다.

필수 조건

이 문서의 절차를 따르기 전에 컴퓨터가 실행 중인지 확인합니다.

1단계: 사용자 흐름 구성

사용자가 앱에 로그인하려고 하면 앱은 사용자 흐름을 통해 권한 부여 엔드포인트에 대한 인증 요청을 시작합니다. 사용자 흐름은 사용자 환경을 정의하고 제어합니다. 사용자 흐름을 완료하면 Azure AD B2C에서 토큰을 생성한 다음, 사용자를 애플리케이션으로 다시 리디렉션합니다.

아직 없는 경우 사용자 흐름 또는 사용자 지정 정책을 만듭니다. 다음과 같이 3개의 개별 사용자 흐름을 만드는 단계를 반복합니다.

  • 결합된 로그인 및 등록 사용자 흐름(예: susi). 이 사용자 흐름은 암호를 잊으셨나요? 환경도 지원합니다.
  • 프로필 편집 사용자 흐름(예: edit_profile).
  • 암호 재설정 사용자 흐름(예: reset_password).

Azure AD B2C는 사용자 흐름 이름 앞에 B2C_1_를 추가합니다. 예를 들어 susiB2C_1_susi이 됩니다.

2단계: Angular SPA 및 API 등록

이 단계에서는 Angular SPA 및 web API 앱에 대한 등록을 만듭니다. 또한 web API의 범위를 지정 합니다.

2.1 웹 API 애플리케이션 등록

웹 API 앱 등록(앱 ID: 2)을 만들려면 다음 단계를 수행합니다.

  1. Azure Portal에 로그인합니다.

  2. Azure AD B2C 테넌트가 포함된 디렉터리를 사용하고 있는지 확인합니다. 포털 도구 모음에서 디렉터리 + 구독 아이콘을 선택합니다.

  3. 포털 설정 | 디렉터리 + 구독 페이지의 디렉터리 이름 목록에서 Azure AD B2C 디렉터리를 찾은 다음, 전환을 선택합니다.

  4. Azure Portal에서 Azure AD B2C를 검색하고 선택합니다.

  5. 앱 등록을 선택한 다음, 새 등록을 선택합니다.

  6. 이름으로 애플리케이션의 이름(예: my-api1)을 입력합니다. 리디렉션 URI지원되는 계정 유형의 기본값은 그대로 둡니다.

  7. 등록을 선택합니다.

  8. 앱 등록이 완료되면 개요를 선택합니다.

  9. 웹 애플리케이션을 구성할 때 나중에 사용할 수 있도록 애플리케이션(클라이언트) ID 값을 기록합니다.

    Screenshot that demonstrates how to get a web A P I application I D.

2.2 범위 구성

  1. 사용자가 만든 my-api1 애플리케이션(앱 ID: 2)을 선택하여 개요 페이지를 엽니다.

  2. 관리에서 API 표시를 선택합니다.

  3. 애플리케이션 ID URI 옆에 있는 설정 링크를 선택합니다. 기본값(GUID)을 고유한 이름(예: tasks-api)으로 바꾼 다음, 저장을 선택합니다.

    웹 애플리케이션은 웹 API에 대한 액세스 토큰을 요청할 때 API에 대해 정의된 각 범위의 접두사로 이 URI를 추가해야 합니다.

  4. 이 API에서 정의한 범위에서 범위 추가를 선택합니다.

  5. API에 대한 읽기 권한을 정의하는 범위를 만들려면 다음을 수행합니다.

    1. 범위 이름으로 tasks.read를 입력합니다.
    2. 관리자 동의 표시 이름으로 작업 API에 대한 읽기 권한을 입력합니다.
    3. 관리자 동의 설명으로 작업 API에 대한 읽기 권한 허용을 입력합니다.
  6. 범위 추가를 선택합니다.

  7. 범위 추가를 선택한 후 API에 대한 쓰기 권한을 정의하는 범위를 추가합니다.

    1. 범위 이름으로 tasks.write를 입력합니다.
    2. 관리자 동의 표시 이름으로 작업 API에 대한 쓰기 권한을 입력합니다.
    3. 관리자 동의 설명으로 작업 API에 대한 쓰기 권한 허용을 입력합니다.
  8. 범위 추가를 선택합니다.

2.3 Angular 앱 등록

다음 단계에 따라 Angular 앱 등록을 만듭니다.

  1. Azure Portal에 로그인합니다.
  2. 여러 테넌트에 액세스할 수 있는 경우 상단 메뉴의 설정 아이콘을 선택하여 디렉터리 + 구독 메뉴에서 Azure AD B2C 테넌트로 전환합니다.
  3. Azure Portal에서 Azure AD B2C를 검색하고 선택합니다.
  4. 앱 등록을 선택한 다음, 새 등록을 선택합니다.
  5. 이름에 애플리케이션의 이름을 입력합니다. 예를 들어, MyApp을 입력합니다.
  6. 지원되는 계정 유형 아래에서 모든 ID 공급자 또는 조직 디렉터리의 계정(사용자 흐름에서 사용자를 인증하는 용도) 을 선택합니다.
  7. 리디렉션 URI에서 SPA(단일 페이지 애플리케이션)를 선택한 다음, URL 상자에 http://localhost:4200을 입력합니다.
  8. 사용 권한에서 openid 및 오프라인 액세스 권한에 대한 관리자 동의 부여 확인란을 선택합니다.
  9. 등록을 선택합니다.
  10. 웹 애플리케이션을 구성하는 이후 단계에 사용할 수 있도록 애플리케이션(클라이언트) ID 값을 기록합니다. Screenshot that shows how to get the Angular application I D.

2.5 권한 부여

앱(앱 ID: 1) 권한을 부여하려면 다음 단계를 수행합니다.

  1. 앱 등록을 선택한 다음, 사용자가 만든 앱(앱 ID: 1)을 선택합니다.

  2. 관리 아래에서 API 권한을 선택합니다.

  3. 구성된 사용 권한 아래에서 권한 추가를 선택합니다.

  4. 내 API 탭을 선택합니다.

  5. 웹 애플리케이션에 액세스 권한을 부여할 API(앱 ID: 2)를 선택합니다. 예를 들어 my-api1을 입력합니다.

  6. 권한에서 작업을 펼친 다음, 앞에서 정의한 범위(예: tasks.readtasks.write)를 선택합니다.

  7. 권한 추가를 선택합니다.

  8. <테넌트 이름에 대한 관리자 동의 부여>를 선택합니다.

  9. 를 선택합니다.

  10. 새로 고침을 선택한 다음, 두 범위 모두 상태...에 대해 허용됨이 표시되는지 확인합니다.

  11. 구성된 권한 목록에서 범위를 선택한 다음 범위 전체 이름을 복사합니다.

    Screenshot of the configured permissions pane, showing that read access permissions are granted.

3단계: Angular 샘플 코드 가져오기

이 샘플은 Angular 단일 페이지 애플리케이션에서 사용자 가입 및 로그인에 Azure AD B2C를 사용하는 방법을 보여 줍니다. 그러면, 앱이 액세스 토큰을 획득하고 보호된 웹 API를 호출합니다.

샘플의 .zip 파일을 다운로드하거나 다음 명령을 사용하여 GitHub 리포지토리에서 샘플을 복제합니다.

git clone https://github.com/Azure-Samples/ms-identity-javascript-angular-tutorial.git

3.1 Angular 샘플 구성

이제 SPA 샘플을 얻었으므로 Azure AD B2C 및 웹 API 값으로 코드를 업데이트합니다. 샘플 폴더의 src/app 폴더에서 auth.config.ts 파일을 엽니다. 키를 해당 값으로 업데이트합니다.

섹션
b2cPolicies 이름 사용자 흐름 또는 1단계에서 만든 사용자 지정 정책입니다.
b2cPolicies 인증 기관 your-tenant-name을 Azure AD B2C 테넌트 이름으로 바꿉니다. 예를 들면 contoso.onmicrosoft.com를 사용합니다. 그런 다음, 정책 이름을 1단계에서 만든 사용자 흐름 또는 사용자 지정 정책으로 바꿉니다. 예: https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<your-sign-in-sign-up-policy>
b2cPolicies authorityDomain Azure AD B2C 테넌트 이름입니다. 예: contoso.onmicrosoft.com
구성 clientId 2.3단계의 Angular 애플리케이션 ID입니다.
protectedResources endpoint 웹 API의 URL입니다(http://localhost:5000/api/todolist).
protectedResources scopes 2.2단계에서 만든 웹 API 범위입니다. 예: b2cScopes: ["https://<your-tenant-name>.onmicrosoft.com/tasks-api/tasks.read"]

결과 src/app/auth-config.ts 코드는 다음 샘플과 유사해야 합니다.

export const b2cPolicies = {
     names: {
         signUpSignIn: "b2c_1_susi_reset_v2",
         editProfile: "b2c_1_edit_profile_v2"
     },
     authorities: {
         signUpSignIn: {
             authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_susi_reset_v2",
         },
         editProfile: {
             authority: "https://your-tenant-name.b2clogin.com/your-tenant-name.onmicrosoft.com/b2c_1_edit_profile_v2"
         }
     },
     authorityDomain: "your-tenant-name.b2clogin.com"
 };
 
 
export const msalConfig: Configuration = {
     auth: {
         clientId: '<your-MyApp-application-ID>',
         authority: b2cPolicies.authorities.signUpSignIn.authority,
         knownAuthorities: [b2cPolicies.authorityDomain],
         redirectUri: '/', 
     },
    // More configuration here
 }

export const protectedResources = {
  todoListApi: {
    endpoint: "http://localhost:5000/api/todolist",
    scopes: ["https://your-tenant-namee.onmicrosoft.com/api/tasks.read"],
  },
}

4단계: 웹 API 샘플 코드 가져오기

웹 API를 등록하고 해당 범위를 정의했으므로, 이제 Azure AD B2C 테넌트에서 작동하도록 웹 API 코드를 구성합니다.

*.zip 보관 파일을 다운로드하거나 GitHub에서 웹 API 프로젝트 샘플을 복제합니다. 다음 명령을 사용하여 GitHub에서 Azure-Samples/active-directory-b2c-javascript-nodejs-webapi 프로젝트로 직접 이동할 수도 있습니다.

git clone https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi.git

4.1 웹 API 구성

샘플 폴더에서 config.json 파일을 엽니다. 이 파일에는 Azure AD B2C ID 공급자에 대한 정보가 포함되어 있습니다. 웹 API 앱은 이 정보를 사용하여 웹앱이 전달자 토큰으로 전달하는 액세스 토큰의 유효성을 검사합니다. 앱 설정의 다음 속성을 업데이트합니다.

섹션
credentials tenantName Azure AD B2C 테넌트 이름의 첫 번째 부분입니다. 예: contoso
credentials clientID 2.1단계의 웹 API 애플리케이션 ID입니다. 앞의 다이어그램에서 애플리케이션은 앱 ID: 2가 있습니다.
credentials issuer (선택 사항) 토큰 발급자 iss 클레임 값입니다. 기본적으로 Azure AD B2C https://<your-tenant-name>.b2clogin.com/<your-tenant-ID>/v2.0/ 형식으로 토큰을 반환합니다. Azure AD B2C 테넌트 이름의 첫번째 부분을 <your-tenant-name>로 바꿉니다. <your-tenant-ID>Azure AD B2C 테넌트 ID로 바꿉니다.
정책 policyName 사용자 흐름 또는 1단계에서 만든 사용자 지정 정책입니다. 애플리케이션에서 여러 사용자 흐름 또는 사용자 지정 정책을 사용하는 경우 하나만 지정합니다. 예를 들어, 가입 또는 로그인 사용자 흐름을 사용합니다.
resource scope 2.5단계에서 웹 API 애플리케이션 등록의 범위입니다.

최종 구성 파일은 다음 JSON과 같아야 합니다.

{
    "credentials": {
        "tenantName": "<your-tenant-namee>",
        "clientID": "<your-webapi-application-ID>",
        "issuer": "https://<your-tenant-name>.b2clogin.com/<your-tenant-ID>/v2.0/"
    },
    "policies": {
        "policyName": "b2c_1_susi"
    },
    "resource": {
        "scope": ["tasks.read"] 
    },
    // More settings here
} 

5단계: Angular SPA 및 웹 API 실행

이제 API에 대한 Angular 범위가 지정된 액세스 권한을 테스트할 준비가 되었습니다. 이 단계에서는 로컬 머신에서 웹 API와 샘플 Angular 애플리케이션을 모두 실행합니다. 그런 다음, Angular 애플리케이션에 로그인하고 TodoList 단추를 선택하여 보호된 API에 대한 요청을 시작합니다.

웹 API 실행

  1. 콘솔 창을 열고, 웹 API 샘플이 있는 디렉터리로 변경합니다. 예시:

    cd active-directory-b2c-javascript-nodejs-webapi
    
  2. 다음 명령을 실행합니다.

    npm install && npm update
    node index.js
    

    콘솔 창에는 애플리케이션이 호스트되는 포트 번호가 표시됩니다.

    Listening on port 5000...
    

Angular 애플리케이션 실행

  1. 다른 콘솔 창을 열고 Angular 샘플을 포함하는 디렉터리로 변경합니다. 예시:

    cd ms-identity-javascript-angular-tutorial-main/3-Authorization-II/2-call-api-b2c/SPA
    
  2. 다음 명령을 실행합니다.

    npm install && npm update
    npm start
    

    콘솔 창에는 애플리케이션이 호스트되는 포트 번호가 표시됩니다.

    Listening on port 4200...
    
  3. 브라우저에서 http://localhost:4200으로 이동하여 애플리케이션을 확인합니다.

  4. 로그인을 선택합니다.

    Screenshot that shows the Angular sample app with the login link.

  5. 등록 또는 로그인 프로세스를 완료합니다.

  6. 로그인에 성공하면 프로필이 표시됩니다. 메뉴에서 ToDoList를 선택합니다.

    Screenshot that shows the Angular sample app with the user profile, and the call to the to-do list.

  7. 추가를 선택하여 목록에 새 항목을 추가하거나 아이콘을 사용하여 항목을 삭제하거나 편집합니다.

    Screenshot that shows the Angular sample app's call to the to-do list.

응용 프로그램 배포

프로덕션 애플리케이션에서 앱 등록용 리디렉션 URI는 일반적으로 앱이 실행되는, 공개적으로 액세스 가능한 엔드포인트입니다(예: https://contoso.com).

언제든지 등록된 애플리케이션에서 리디렉션 URI를 추가하고 수정할 수 있습니다. 리디렉션 URI에는 다음 제한 사항이 적용됩니다.

  • 회신 URL은 스키마 https로 시작해야 합니다.
  • 회신 URL은 대/소문자를 구분합니다. 해당 사례는 실행 중인 애플리케이션의 URL 경로에 대한 대/소문자와 일치해야 합니다.

다음 단계