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
엔드포인트에 액세스하여 로그인한 사용자의 속성을 읽을 수 있습니다.