Microsoft 인증 라이브러리를 사용하여 API에 대한 액세스 권한 부여

완료됨

이제 회사의 사용자를 웹 애플리케이션에 로그인할 수 있습니다. 다음으로 페이지의 직원 프로필에서 직함, 직장 이메일 등과 같은 정보를 표시하려고 합니다. Microsoft Graph API는 사용자 관련 데이터에 대한 액세스를 제공한다는 것을 알 수 있습니다.

이 단원에서는 MSAL을 통해 Microsoft Graph API와 같은 Microsoft 서비스 대한 권한 있는 액세스를 허용하는 방법을 알아봅니다.

API 권한 및 범위

Microsoft Entra ID로 보호되는 웹 서비스는 해당 서비스에서 노출되는 API 기능 및 데이터에 대한 액세스를 제공하는 권한 집합을 정의합니다. 애플리케이션은 사용자 및 관리자에게 이러한 사용 권한을 요청할 수 있고, 요청을 받은 사용자 또는 관리자가 요청을 승인해야만 애플리케이션이 사용자 대신 데이터에 액세스하거나 작업을 수행할 수 있습니다. 예를 들어 Microsoft Graph는 특히 다음 작업을 수행할 수 있는 사용 권한을 정의했습니다.

  • 사용자의 일정 읽기
  • 사용자의 일정에 쓰기
  • 사용자로 메일 보내기

사용자 및 관리자는 애플리케이션에서 액세스할 수 있는 데이터를 제어하고 파악하는 방법을 연습할 수 있습니다. 애플리케이션이 Microsoft에서 보호하는 API에 액세스하려면 애플리케이션에 작업을 수행할 수 있는 권한을 제공해야 합니다.

Microsoft Entra ID는 위임된 권한과 애플리케이션 권한이라는 두 가지 형식의 권한을 지원합니다.

  • 위임된 권한은 로그인한 사용자가 있는 앱에서 사용합니다. 이러한 앱의 경우 사용자 또는 관리자가 앱이 요청하는 권한에 동의합니다. 앱이 대상 API를 호출할 때 로그인한 사용자로 행동할 수 있는 권한을 위임받습니다. 일부 높은 수준의 권한은 관리자 동의가 필요합니다.

  • 애플리케이션 권한은 로그인한 사용자 없이 실행되는 앱(예: 백그라운드 서비스 또는 디먼으로 실행한 앱)에서 사용합니다. 관리자만 애플리케이션 권한에 동의할 수 있습니다.

Azure Portal에서 앱 등록에 이러한 API 권한을 할당할 수 있습니다.

범위

Microsoft Entra ID는 애플리케이션이 사용자를 대신하여 웹 호스트된 리소스에 액세스할 수 있는 OAuth 2.0 권한 부여 프로토콜을 구현합니다.

OAuth 2.0에서는 이러한 유형의 권한 집합을 범위라고 합니다. Microsoft Entra ID에 권한 부여 요청을 할 때 애플리케이션은 요청의 scope 쿼리 매개 변수에 권한을 지정하여 필요한 권한을 요청합니다. 예를 들어, 범위 값 https://graph.microsoft.com/Calendars.Read는 Microsoft Graph에서 사용자의 일정을 읽을 수 있는 권한을 요청하는 데 사용됩니다.

MSAL을 사용하여 액세스 토큰 획득

액세스 토큰을 사용하면 클라이언트 애플리케이션이 Microsoft Entra ID로 보호되는 웹 API를 안전하게 호출할 수 있습니다. MSAL(Microsoft 인증 라이브러리)을 사용하여 액세스 토큰을 획득하는 방법에는 여러 가지가 있습니다. 일반적으로 토큰을 획득하는 데 사용되는 방법은 애플리케이션이 데스크톱 또는 모바일 앱과 같은 공용 클라이언트 애플리케이션인지, 아니면 웹앱, 웹 API 또는 디먼 애플리케이션과 같은 기밀 클라이언트 애플리케이션인지에 따라 달라집니다.

MSAL의 토큰 획득 방법 중 일부에는 원하는 사용 권한 및 요청된 리소스를 선언하는 문자열 목록인 scopes 매개 변수가 필요합니다.

MSAL은 토큰을 획득한 후에 캐시합니다. OpenID Connect 권한 부여 코드 흐름을 사용하는 웹 애플리케이션의 경우 컨트롤러에 권장되는 패턴은 다음과 같습니다.

  • 먼저 다른 방법으로 토큰을 획득하기 전에 캐시에서 자동으로 토큰을 획득하려고 시도합니다. 다음 코드는 AuthHelper 클래스의 acquireTokenSilently 메서드 구현에서 발췌한 것입니다.

    final SilentParameters parameters = SilentParameters
                                            .builder(Collections.singleton(Config.SCOPES), context.getAccount())
                                            .build();
    
    final ConfidentialClientApplication client = getConfidentialClientInstance();
    
    client.tokenCache().deserialize(context.getTokenCache());
    
    final IAuthenticationResult result = client.acquireTokenSilently(parameters).get();
    
  • 캐시에 토큰이 없고 자동 토큰 요청이 토큰을 얻지 못하는 경우 인증 코드 흐름을 사용하여 토큰을 획득할 수 있습니다.

    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                                                        .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES))
                                                        .build();
    
    final IAuthenticationResult result = app.acquireToken(authParams).get();
    

또한 토큰 캐시에 새로 고침 토큰도 포함되어 있으므로 MSAL은 만료 기간이 가까워질 때 토큰을 새로 고칠 수 있습니다.

인증 결과

클라이언트에서 액세스 토큰을 요청하면 Microsoft Entra ID는 액세스 토큰에 대한 메타데이터가 포함된 인증 결과도 반환합니다. 이 데이터를 사용하면 앱에서 액세스 토큰 자체를 구문 분석하지 않고도 액세스 토큰의 인텔리전트 캐싱을 수행할 수 있습니다. AuthenticationResult MSAL 반환은 다음을 노출합니다.

  • 웹 API에 대한 액세스 토큰
  • 사용자(JWT)의 ID 토큰입니다.
  • 토큰이 만료되는 날짜/시간을 알려주는 토큰 만료 기간.
  • 사용자가 검색한 테넌트가 포함된 테넌트 ID.
  • 토큰이 발급된 범위.
  • 사용자에 대한 고유한 ID.

Microsoft Graph 소개

Microsoft Graph API는 단일 엔드포인트 https://graph.microsoft.com을 제공하여 Microsoft 클라우드의 풍부한 사람 중심 데이터 및 인사이트에 액세스할 수 있도록 합니다. REST API 또는 SDK를 사용하여 엔드포인트에 액세스하고, 생산성, 협업, 교육, 사람 및 작업 공간 인텔리전스 등을 비롯한 Microsoft 365 시나리오를 지원하는 앱을 빌드할 수 있습니다. Microsoft Graph에는 사용자 및 디바이스 ID를 관리하는 강력한 서비스 세트도 있습니다.

예를 들어, https://graph.microsoft.com/v1.0/me 엔드포인트에 액세스하여 로그인한 사용자의 속성을 읽을 수 있습니다.