본문 바로가기

Java/Java SE, EE

Azure AD와 MSAL4J를 사용한 SSO(Single Sign-On) 로그인 인증 구현

더보기

SSO(Single Sign-On)은 1회성 사용자 인증으로 다수의 서비스에서 통합된 로그인 인증을 허용하는 솔루션입니다.

인증의 증명이 되는 플랫폼은 여러 가지가 될 수 있지만 이 문서에서는 Microsoft ID 플랫폼을 사용하는 SSO 인증을 구현합니다.

MS에서 SSO 인증을 구현하려면 Azure Active Directory(Azure AD)Tenant를 사용합니다.

테스트 환경 및 주요 아젠다

더보기

이 프로젝트의 개발 환경

샘플 코드를 사용하여 Microsoft Graph를 호출하는 Java 웹 애플리케이션을 완성합니다.

  • Azure AD로부터 ID 토큰을 획득합니다.
  • ID 토큰을 사용하여 사용자를 로그인합니다.
  • Bearer 토큰으로 사용되는 Access 토큰을 획득합니다.
  • Access 토큰을 사용하여 Microsoft Graph를 호출하고 로그인 된 사용자 정보를 읽습니다.

이 샘플은 OpenId Connect를 사용하여 로그인하고 MSAL4J로 Microsoft Graph에 엑세스합니다.

이 시나리오 및 프로토콜이 동작하는 방식은 Authentication Scenarios for Azure AD를 참고합니다.

Azure AD가 무엇인가요?

Azure AD는 MS 사에서 제공하는 MS 통합 사용자 증명을 위한 솔루션입니다. 애플리케이션을 등록 및 관리하고, Microsoft 365와 Web API에 대한 데이터 엑세스 구성이 가능합니다.

더보기

MS와의 관계는 Azure, Microsoft Intune 또는 Microsoft 365와 같은 MS 계열 서비스에 가입하면 시작됩니다.

Prerequisites

구독이 활성화 된 Azure 계정이 필요합니다. Create an account for free를 참고합니다.

다음으로 Tenant를 구성해야 합니다. Tenant는 MS와의 관계에서 조직(사업체 또는 애플리케이션 개발자)이 받을 수 있는 Azure AD 전용 인스턴스(Dedicated instance)입니다.

더보기

이미 많은 개발자들이 MS의 서비스(Microsoft 365 또는 Azure 구독과 같은)를 통해 Tenant를 갖고있습니다.

Tenant를 확인하려면: Azure portal에 로그인합니다. 보유중인 Tenant가 존재하면 Azure portal | 오른쪽 상단 프로필 | 마우스 포커싱을 유지하는 것으로 Tenant 정보가 표시됩니다.

이름 전자 메일 디렉토리 도메인
박** ******@compnay.net COMPANY(************) COMPANYSTUDIO.onmicrosoft.com

Azure 계정에서 여러 개의 Tenant와 연결되어 있다면 Azure portal | 오른쪽 상단 프로필 | 디렉토리 전환으로 사용하려는 Tenant를 선택합니다.

더보기

Tenant ID를 찾으려면?

Azure portal | 오른쪽 상단 프로필 | 마우스 포커싱을 유지하고 디렉토리 또는 Tenant ID를 확인합니다.

Azure portal에서 Azure Active Directory | Properties | Tenant ID를 확인합니다.

아직 Azure AD Tenant가 없거나 새로운 Tenant를 등록하려면 다음 문서를 참고합니다.

새로운 Tenant를 등록하려면 다음 정보가 필요합니다.

  • Tenant 유형(Type): Azure AD 또는 Azure AD B2C
  • 기관명(Organization name)
  • 초기 도메인(Initial domain): 초기 도메인으로 지정되는 <도메인 이름>.onmicrosoft.com은 편집하거나 삭제 할 수 없습니다.
  • 국가 또는 리전(Country or region)
더보기

Tenant 이름을 지을 때는 영숫자를 사용합니다. 특수 문자는 이름으로 사용 할 수 없으며 256자를 초과 할 수 없습니다.

샘플 프로젝트 시작 및 Azure AD 구성

CLI에서 git clone을 실행합니다.

$ git clone https://github.com/Azure-Samples/ms-identity-java-webapp.git

Arure portal에 접속하고 로그인합니다. 프로젝트를 등록하려는 Tenant에 연결된 상태여야 합니다.

상단 바 포털 메뉴 | 모든 서비스(All services) | Azure Active Directory | 속성(Properties)에서 이름(Name)디렉토리 ID(Directory ID | Tenant ID)를 확인합니다.

앱 등록(App registrations) | 새 등록(New registration)을 선택합니다.

이름(Name)지원하는 계정 유형(Supported account types)를 선택하고 등록합니다.

애플리케이션 개요(Overview) | Applications | 새로 등록한 애플리케이션 이름을 클릭합니다.

Application IDDirectory ID를 확인합니다. 이 값은 나중에 샘플 코드를 실행하기 위한 환경 구성에 사용됩니다.

애플리케이션의 인증(Authentication) | 플랫폼 구성(Platform configurations)에서 웹(Web)을 추가합니다.

웹 항목이 구성되면 Web Redirect URIs | Add URI로 리다이렉션 URI를 추가합니다.

URI 비고
https://localhost:8443/msal4jsample/secure/aad 샘플 코드의 로그인 페이지를 위한 리다이렉션입니다.
https://localhost:8443/msal4jsample/graph/me
샘플 코드의 사용자 정보 페이지를 위한 리다이렉션입니다.

애플리케이션의 인증서 및 암호(Certificates & Secrets) | 클라이언트 암호(Client Secrets section)으로 이동합니다.

새 클라이언트 암호(New client secret)에서 설명(Description)만료 일자(Expires)를 선택합니다.

암호를 등록하면 키 값(Value)암호 ID(Scerect ID)가 표시됩니다. 암호 정보는 나중에 프로젝트를 구성할 때 사용됩니다.

더보기

암호는 다시 표시되지 않으며 다른 방법으로도 검색 할 수 없습니다.

표시되는 내용을 기록 후 재사용하거나 암호를 분실하였다면 새로운 암호를 다시 생성하고 기존 프로젝트를 다시 구성해야합니다.

샘플 프로젝트 환경 설정

앞서 Azure AD 구성 과정에서의 테넌트 ID 애플리케이션 ID 키 값이 필요합니다.

샘플 프로젝트의 패키지 src/main/resources에서 application.properties 파일을 엽니다.

#AAD configuration
aad.clientId=Enter_the_Application_Id_here
aad.authority=https://login.microsoftonline.com/Enter_the_Tenant_Info_Here/
aad.secretKey=Enter_the_Client_Secret_Here
aad.redirectUriSignin=https://localhost:8443/msal4jsample/secure/aad
aad.redirectUriGraph=https://localhost:8443/msal4jsample/graph/me
aad.msGraphEndpointHost=https://graph.microsoft.com/
 
#SSL configuration
server.port=8443
server.servlet.session.cookie.secure=true
server.ssl.key-store=classpath:Enter_Key_Store_Here
server.ssl.key-store-password=Enter_Key_Store_Password_Here
server.ssl.key-store-type=Enter_Key_Store_Type_Here
server.ssl.key-alias=Enter_Key_Alias_Here
server.ssl.key-password=Enter_Key_Password_Here
코드 비고
Line 2 Enter_the_Applkication_Id_here Azure AD 구성의 애플리케이션 ID(Application Id)입니다.
Line 3 Enter_the_Tenant_Info_Here Azure AD 구성의 Tenant ID입니다.
Line 4 Enter_the_Client_Secret_Here Azure AD 구성의 키 값(Value)입니다.

기본 리다이렉션 URI를 사용하지 않은 경우 aad.redirectUriSigninaad.redirectUriGraph를 업데이트해야 합니다.

어떤 호스트 및 포트 번호라도 사용 할 수 있지만, 요청을 처리하는 컨트롤러와 매핑하기 위해 경로를 일치시킵니다.

코드 비고
Line 5 redirectUriSignin https://<호스트>:<포트>/msal4jsample/secure/aad
Line 6 redirectUriGraph https://<호스트>:<포트>/msal4jsample/graph/me

로컬 호스트에서 HTTPS를 사용하기 위해서 자체 서명된 인증서(Self-Signed certificate)가 필요합니다.

Java의 KeyTool 유틸리티를 사용하여 키 저장소(Keystore)를 생성합니다.

$ keytool -genkeypair -alias testCert -keyalg RSA -storetype PKCS12 -keystore keystore.p12 -storepass password
코드 비고
Line 1 -alias testCert 인증서 별칭으로 testCert를 사용합니다.
-storetype PKCS12 인증서 유형으로 PKCS12를 사용합니다.
-keystore keystore.p12 인증서 파일 이름으로 keystore.p12를 사용합니다.
-storepass password 인증서 암호로 password를 사용합니다.

인증서를 사용하여 나머지 구성을 완성합니다.

코드 비고
Line 12 Enter_Key_Store_Here 인증서 경로를 입력합니다.
Line 13 Enter_Key_Store_Password_Here 인증서 암호를 입력합니다.
Line 14 Enter_Key_Store_Type_Here 인증서 유형을 입력합니다.
Line 15 Enter_Key_Alias_Here 인증서 별칭을 입력합니다.

모든 프로퍼티를 입력하면 application.properties는 다음과 같이 표시됩니다.

#AAD configuration
aad.clientId=*************************
aad.authority=https://login.microsoftonline.com/*************************/
aad.secretKey=*************************
aad.redirectUriSignin=https://localhost:8443/msal4jsample/secure/aad
aad.redirectUriGraph=https://localhost:8443/msal4jsample/graph/me
aad.msGraphEndpointHost=https://graph.microsoft.com/
 
#SSL configuration
server.port=8443
server.servlet.session.cookie.secure=true
server.ssl.key-store=/Users/namepgb/Desktop/azure/keystore.p12
server.ssl.key-store-password=password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=testCert
server.ssl.key-password=password