다음을 통해 공유


그룹 및 그룹 클레임을 사용하여 Java WebLogic 앱 보호

이 문서에서는 Java용 MSAL(Microsoft 인증 라이브러리)을 사용하여 사용자를 로그인하는 Java WebLogic 앱을 만드는 방법을 보여 줍니다. 또한 앱은 Microsoft Entra ID 보안 그룹 멤버 자격에 따라 페이지에 대한 액세스를 제한합니다.

다음 다이어그램은 앱의 토폴로지입니다.

앱의 토폴로지 다이어그램

클라이언트 앱은 MSAL4J(Java용 MSAL)를 사용하여 사용자를 Microsoft Entra ID 테넌트에 로그인하고 Microsoft Entra ID에서 ID 토큰가져옵니다. ID 토큰은 사용자가 이 테넌트를 사용하여 인증됨을 증명합니다. 앱은 사용자의 인증 상태 및 그룹 멤버 자격에 따라 경로를 보호합니다.

이 시나리오를 다루는 비디오는 앱 역할, 보안 그룹, 범위 및 디렉터리 역할을 사용하여 애플리케이션에서 권한 부여 구현을 참조하세요.

필수 조건

  • JDK 버전 8 이상
  • Maven 3
  • Microsoft Entra ID 테넌트. 자세한 내용은 Microsoft Entra ID 테넌트를 가져오는 방법을 참조 하세요.
  • 사용자 고유의 Microsoft Entra ID 테넌트에 있는 사용자 계정입니다.
  • 테스트하려는 사용자를 포함하는 두 개의 보안 그룹 GroupAdmin 입니다 GroupMember.

권장 사항

샘플 설정

다음 섹션에서는 샘플 애플리케이션을 설정하는 방법을 보여줍니다.

샘플 리포지토리 복제 또는 다운로드

샘플을 복제하려면 Bash 창을 열고 다음 명령을 사용합니다.

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/3-Authorization-II/groups

또는 ms-identity-msal-java-samples 리포지토리로 이동한 다음, .zip 파일로 다운로드하여 하드 드라이브에 추출합니다.

Important

Windows에서 파일 경로 길이 제한을 방지하려면 리포지토리를 하드 드라이브 루트 근처의 디렉터리에 복제하거나 추출합니다.

Microsoft Entra ID 테넌트에 샘플 애플리케이션 등록

이 샘플에는 하나의 프로젝트가 있습니다. 다음 섹션에서는 Azure Portal을 사용하여 앱을 등록하는 방법을 보여 줍니다.

애플리케이션을 만들 Microsoft Entra ID 테넌트 선택

테넌트 선택하려면 다음 단계를 사용합니다.

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

  2. 계정이 둘 이상의 Microsoft Entra ID 테넌트에 있는 경우 Azure Portal 모서리에서 프로필을 선택한 다음 디렉터리 전환을 선택하여 세션을 원하는 Microsoft Entra ID 테넌트로 변경합니다.

앱 등록(java-servlet-webapp-groups)

먼저 빠른 시작의 지침에 따라 Azure Portal새 앱을 등록합니다. Microsoft ID 플랫폼 애플리케이션을 등록합니다.

그런 다음, 다음 단계를 사용하여 등록을 완료합니다.

  1. 개발자용 Microsoft ID 플랫폼의 앱 등록 페이지로 이동합니다.

  2. 새 등록을 선택합니다.

  3. 표시되는 애플리케이션 등록 페이지에서 다음 앱 등록 정보를 입력합니다.

    • 이름 섹션에서 앱 사용자에게 표시할 의미 있는 애플리케이션 이름(예java-servlet-webapp-groups: .)을 입력합니다.
    • 지원되는 계정 유형 아래에서 이 조직 디렉터리의 계정만을 선택합니다.
    • 리디렉션 URI 섹션의 콤보 상자에서 웹을 선택하고 다음 리디렉션 URIhttp://localhost:8080/msal4j-servlet-groups/auth/redirect를 입력합니다.
  4. 등록을 선택하여 애플리케이션을 만듭니다.

  5. 앱의 등록 페이지에서 나중에 사용할 애플리케이션(클라이언트) ID 값을 찾아 복사합니다. 앱의 구성 파일 또는 파일에서 이 값을 사용합니다.

  6. 저장을 선택하여 변경 내용을 저장합니다.

  7. 앱의 등록 페이지에서 탐색 창에서 인증서 및 비밀을 선택하여 비밀을 생성하고 인증서를 업로드할 수 있는 페이지를 엽니다.

  8. 클라이언트 비밀 섹션에서 새 클라이언트 비밀을 선택합니다.

  9. 설명(예: 앱 비밀)을 입력합니다.

  10. 사용 가능한 기간 중 하나(1년, 2년 후 또는 만료 안 됨) 중 하나를 선택합니다.

  11. 추가를 선택합니다. 생성된 값이 표시됩니다.

  12. 이후 단계에서 사용할 생성된 값을 복사하고 저장합니다. 코드의 구성 파일에 이 값이 필요합니다. 이 값은 다시 표시되지 않으며 다른 어떤 수단으로도 검색할 수 없습니다. 따라서 다른 화면 또는 창으로 이동하기 전에 Azure Portal에서 저장해야 합니다.

  13. 앱의 등록 페이지에서 탐색 창에서 API 권한을 선택하여 페이지를 열어 애플리케이션에 필요한 API에 대한 액세스를 추가합니다.

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

  15. Microsoft API 탭이 선택되어 있는지 확인합니다.

  16. 일반적으로 사용되는 Microsoft API 섹션에서 Microsoft Graph를 선택합니다.

  17. 위임된 권한 섹션의 목록에서 User.ReadGroupMember.Read.All을 선택합니다. 필요한 경우 검색 상자를 사용합니다.

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

  19. GroupMember.Read.All관리자 동의가 필요하므로 {tenant}에 대한 관리자 동의 부여/해지를 선택한 다음 테넌트의 모든 계정에 대해 요청된 권한에 대한 동의를 부여할지 묻는 메시지가 표시되면 예를 선택합니다. 이 작업을 수행하려면 Microsoft Entra ID 테넌트 관리자여야 합니다.


앱 등록을 사용하도록 앱(java-servlet-webapp-groups) 구성

다음 단계를 사용하여 앱을 구성합니다.

참고 항목

다음 단계에서 ClientID 는 같거나 AppId같습니다Application ID.

  1. IDE에서 프로젝트를 엽니다.

  2. ./src/main/resources/authentication.properties 파일을 엽니다.

  3. 문자열 {enter-your-tenant-id-here}를 찾습니다. 이 조직 디렉터리 전용 옵션의 계정으로 앱을 등록한 경우 기존 값을 Microsoft Entra 테넌트 ID로 바꿉니다.

  4. 문자열 {enter-your-client-id-here} 을 찾아 기존 값을 애플리케이션 ID 또는 clientId Azure Portal에서 복사한 애플리케이션으로 java-servlet-webapp-groups 바꿉니다.

  5. 문자열 {enter-your-client-secret-here} 을 찾고 Azure Portal에서 앱을 만드는 java-servlet-webapp-groups 동안 저장한 값으로 기존 값을 바꿉니다.

보안 그룹 구성

그룹 클레임을 수신하도록 애플리케이션을 추가로 구성하는 방법에 대해 사용할 수 있는 옵션은 다음과 같습니다.

  • 로그인한 사용자가 중첩된 그룹을 포함하는 Microsoft Entra ID 테넌트에 할당된 모든 그룹을 받습니다. 자세한 내용은 중첩된 그룹을 포함하여 로그인한 사용자가 할당한 모든 그룹을 받도록 애플리케이션 구성 섹션 참조하세요.

  • 애플리케이션이 작동하도록 프로그래밍된 필터링된 그룹 집합에서 그룹 클레임 값을 받습니다. 자세한 내용은 사용자가 할당할 수 있는 필터링된 그룹 집합에서 그룹 클레임 값을 받도록 애플리케이션 구성 섹션 을 참조하세요. 이 옵션은 Microsoft Entra ID Free 버전에서 사용할 수 없습니다.

참고 항목

온-프레미스 그룹 samAccountName 또는 On Premises Group Security Identifier 그룹 ID 대신 가져오려면 Microsoft Entra ID를 사용하여 애플리케이션에 대한 그룹 클레임 구성에서 Active Directory 에서 동기화된 그룹 특성을 사용하기 위한 필수 구성 요소 섹션을 참조하세요.

중첩된 그룹을 포함하여 로그인한 사용자가 할당한 모든 그룹을 받도록 애플리케이션을 구성합니다.

애플리케이션을 구성하려면 다음 단계를 사용합니다.

  1. 앱의 등록 페이지에서 탐색 창에서 토큰 구성을 선택하여 애플리케이션에 발급된 클레임 제공 토큰을 구성할 수 있는 페이지를 엽니다.

  2. 그룹 클레임 추가를 선택하여 그룹 클레임 편집 화면을 엽니다.

  3. 보안 그룹 또는 모든 그룹(메일 그룹을 포함하지만 애플리케이션에 할당된 그룹은 포함되지 않음) 옵션을 선택합니다. 두 옵션을 모두 선택하면 보안 그룹 옵션의 효과가 무효화됩니다.

  4. ID 섹션에서 그룹 ID를 선택합니다. 이 선택을 통해 Microsoft Entra ID는 사용자가 사용자를 로그인한 후 앱이 받는 ID 토큰그룹 클레임에 할당된 그룹의 개체 ID를 보냅니다.

사용자가 할당할 수 있는 필터링된 그룹 집합에서 그룹 클레임 값을 받도록 애플리케이션을 구성합니다.

이 옵션은 다음과 같은 경우에 유용합니다.

  • 애플리케이션은 로그인 사용자가 할당될 수 있는 선택한 그룹 집합에 관심이 있습니다.
  • 애플리케이션은 이 사용자가 테넌트에 할당된 모든 보안 그룹에 관심이 없습니다.

이 옵션을 사용하면 애플리케이션에서 초과분 문제를 방지할 수 있습니다.

참고 항목

이 기능은 Microsoft Entra ID Free 버전에서 사용할 수 없습니다.

이 옵션을 사용하면 중첩된 그룹 할당을 사용할 수 없습니다.

앱에서 이 옵션을 사용하도록 설정하려면 다음 단계를 사용합니다.

  1. 앱의 등록 페이지에서 탐색 창에서 토큰 구성을 선택하여 애플리케이션에 발급된 클레임 제공 토큰을 구성할 수 있는 페이지를 엽니다.

  2. 그룹 클레임 추가를 선택하여 그룹 클레임 편집 화면을 엽니다.

  3. 애플리케이션에 할당된 그룹을 선택합니다.

    보안 그룹 또는 모든 그룹(애플리케이션에 할당된 그룹이 아닌 메일 그룹 포함)과 같은 다른 옵션을 선택하면 앱이 이 옵션을 사용하도록 선택할 때 얻을 수 있는 이점이 무효화됩니다.

  4. ID 섹션에서 그룹 ID를 선택합니다. 이렇게 선택하면 Microsoft Entra ID가 ID 토큰의 그룹 클레임에 할당된 그룹의 개체 ID를 보냅니다.

  5. API 노출 옵션을 사용하여 웹 API를 노출하는 경우 Access 섹션에서 그룹 ID 옵션을 선택할 수도 있습니다. 이 옵션을 사용하면 Microsoft Entra ID가 액세스 토큰의 그룹 클레임에 할당된 그룹의 개체 ID보냅니다.

  6. 앱의 등록 페이지에서 탐색 창에서 개요를 선택하여 애플리케이션 개요 화면을 엽니다.

  7. 로컬 디렉터리의 관리되는 애플리케이션에서 애플리케이션 이름이 포함된 하이퍼링크를 선택합니다. 예를 들어 Managed application in ...이 필드 제목은 잘렸을 수 있습니다. 이 링크를 선택하면 애플리케이션을 만든 테넌트에서 애플리케이션의 서비스 주체와 연결된 엔터프라이즈 애플리케이션 개요 페이지로 이동합니다. 브라우저의 뒤로 단추를 사용하여 앱 등록 페이지로 다시 이동할 수 있습니다.

  8. 탐색 창에서 사용자 및 그룹을 선택하여 애플리케이션에 사용자 및 그룹을 할당할 수 있는 페이지를 엽니다.

  9. 사용자 추가를 선택합니다.

  10. 결과 화면에서 사용자 및 그룹을 선택합니다.

  11. 이 애플리케이션에 할당할 그룹을 선택합니다.

  12. [선택]을 선택하여 그룹 선택을 완료합니다.

  13. 할당을 선택하여 그룹 할당 프로세스를 완료합니다.

    앱에 로그인하는 사용자가 하나 이상의 할당된 그룹의 구성원인 경우 애플리케이션은 이제 그룹 클레임에서 이러한 선택된 그룹을 받습니다.

  14. 탐색 창에서 속성을 선택하여 애플리케이션의 기본 속성을 나열하는 페이지를 엽니다. 필요한 사용자 할당을 설정하시겠습니까? 플래그를 예로 설정합니다.

Important

사용자 할당이 필요하도록 설정하면 예, Microsoft Entra ID는 사용자 및 그룹 창에서 애플리케이션에 할당된 사용자만 앱에 로그인할 수 있는지 확인합니다. 사용자를 직접 할당하거나 사용자가 속한 보안 그룹을 할당하여 할당할 수 있습니다.

그룹 ID를 인식하도록 앱(java-servlet-webapp-groups) 구성

다음 단계를 사용하여 앱을 구성합니다.

Important

토큰 구성 페이지에서 groupID 이외의 옵션(예: DNSDomain\sAMAccountName)을 선택한 경우 개체 ID 대신 다음 단계에 contoso.com\Test Group 그룹 이름을 입력해야 합니다.

  1. ./src/main/resources/authentication.properties 파일을 엽니다.

  2. 문자열 {enter-your-admins-group-id-here} 을 찾아 기존 값을 Azure Portal에서 복사한 그룹의 개체 ID GroupAdmin 로 바꿉니다. 자리 표시자 값에서도 중괄호를 제거합니다.

  3. 문자열 {enter-your-users-group-id-here} 을 찾아 기존 값을 Azure Portal에서 복사한 그룹의 개체 ID GroupMember 로 바꿉니다. 자리 표시자 값에서도 중괄호를 제거합니다.

샘플 빌드

Maven을 사용하여 샘플을 빌드하려면 샘플에 대한 pom.xml 파일이 포함된 디렉터리로 이동한 다음 다음 명령을 실행합니다.

mvn clean package

이 명령은 다양한 애플리케이션 서버에서 실행할 수 있는 .war 파일을 생성합니다.

샘플 배포

이러한 지침에서는 WebLogic을 설치하고 일부 서버 도메인을 설정했다고 가정합니다.

WebLogic에 배포하려면 다음 단계를 사용하여 샘플 자체에서 몇 가지 구성을 변경한 다음 패키지를 빌드하거나 다시 빌드합니다.

  1. 샘플에서 클라이언트 ID, 테넌트, 리디렉션 URL 등을 구성한 application.properties 또는 authentication.properties 파일을 찾습니다.

  2. 이 파일에서 WebLogic이 실행되는 URL 및 포트에 대한 참조 localhost:8080 localhost:8443 를 변경합니다. 기본적으로 다음과 같습니다 localhost:7001.

  3. 또한 Azure Portal에서 인증 탭의 리디렉션 URI으로 설정하는 Azure 앱 등록을 동일하게 변경해야 합니다.

다음 단계를 사용하여 웹 콘솔을 통해 WebLogic에 샘플을 배포합니다.

  1. DOMAIN_NAME\bin\startWebLogic.cmd 사용하여 WebLogic 서버를 시작합니다.

  2. 에서 브라우저 http://localhost:7001/console에서 WebLogic 웹 콘솔로 이동합니다.

  3. 도메인 구조>배포이동하여 설치를 선택하고 파일 업로드를 선택한 다음 Maven을 사용하여 빌드한 .war 파일을 찾습니다.

  4. 이 배포를 애플리케이션으로 설치를 선택하고, 다음을 선택하고, 마침을 선택한 다음, 저장을 선택합니다.

  5. 샘플 구성 또는 Azure 앱 등록에서 설정한 리디렉션 URI와 일치하도록 애플리케이션의 이름을 지정해야 한다는 점을 제외하면 대부분의 기본 설정은 괜찮을 것입니다. 즉, 리디렉션 URI인 http://localhost:7001/msal4j-servlet-auth경우 애플리케이션 msal4j-servlet-auth이름을 지정해야 합니다.

  6. 도메인 구조>배포돌아가서 애플리케이션을 시작합니다.

  7. 애플리케이션이 시작되면 탐색하고 http://localhost:7001/<application-name>/애플리케이션에 액세스할 수 있어야 합니다.

샘플 탐색

다음 단계를 사용하여 샘플을 탐색합니다.

  1. 화면 중앙에 로그인 또는 로그아웃 상태가 표시됩니다.
  2. 모서리에서 상황에 맞는 단추를 선택합니다. 이 단추는 앱을 처음 실행할 때 로그인을 읽습니다.
  3. 다음 페이지에서 지침을 따르고 Microsoft Entra ID 테넌트에 있는 계정으로 로그인합니다.
  4. 동의 화면에서 요청되는 범위를 확인합니다.
  5. 이제 상황에 맞는 단추에 로그아웃이 표시되고 사용자 이름이 표시됩니다.
  6. ID 토큰 세부 정보를 선택하여 ID 토큰의 디코딩된 클레임 중 일부를 확인합니다.
  7. 그룹을 선택하여 로그인한 사용자의 보안 그룹 멤버 자격에 대한 정보를 확인합니다.
  8. 관리자 전용 또는 일반 사용자를 선택하여 그룹 클레임 보호 엔드포인트에 액세스합니다.
    • 로그인한 사용자가 그룹에 있는 GroupAdmin 경우 사용자는 두 페이지를 모두 입력할 수 있습니다.
    • 로그인한 사용자가 그룹에 있는 GroupMember 경우 사용자는 일반 사용자 페이지만 입력할 수 있습니다.
    • 로그인한 사용자가 두 그룹 모두에 없는 경우 사용자는 두 페이지 중 하나에 액세스할 수 없습니다.
  9. 모서리의 단추를 사용하여 로그아웃합니다.
  10. 로그아웃한 후 ID 토큰 세부 정보를 선택하여 사용자에게 권한이 없는 경우 앱에 ID 토큰 클레임 대신 오류가 표시되는 401: unauthorized 지 확인합니다.

코드 정보

이 샘플에서는 MSAL4J(Java용 MSAL)를 사용하여 사용자를 로그인하고 그룹 클레임을 포함할 수 있는 ID 토큰을 가져옵니다. ID 토큰에 배출할 그룹이 너무 많은 경우 샘플에서는 Java용 Microsoft Graph SDK를 사용하여 Microsoft Graph에서 그룹 멤버 자격 데이터를 가져옵니다. 사용자가 속한 그룹에 따라 로그인한 사용자는 보호된 페이지 Admins Only Regular Users중 하나 또는 둘 다에 액세스할 수 있습니다.

이 샘플의 동작을 복제하려면 Maven을 사용하여 프로젝트에 MSAL4J 및 Microsoft Graph SDK를 추가해야 합니다. src/main/java/com/microsoft/azuresamples/msal4j 폴더에서 pom.xml 파일과 도우미authservlets 폴더의 내용을 복사할 수 있습니다. authentication.properties 파일도 필요합니다. 이러한 클래스 및 파일에는 다양한 애플리케이션에서 사용할 수 있는 제네릭 코드가 포함되어 있습니다. 샘플의 나머지 부분도 복사할 수 있지만 다른 클래스와 파일은 이 샘플의 목표를 해결하기 위해 특별히 빌드됩니다.

콘텐츠

다음 표에서는 샘플 프로젝트 폴더의 내용을 보여 줍니다.

파일/폴더 설명
src/main/java/com/microsoft/azuresamples/msal4j/groupswebapp/ 이 디렉터리에는 앱의 백 엔드 비즈니스 논리를 정의하는 클래스가 포함되어 있습니다.
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ 이 디렉터리에는 로그인 및 로그아웃 엔드포인트에 사용되는 클래스가 포함되어 있습니다.
____Servlet.java 사용 가능한 모든 엔드포인트는 ____Servlet.java 끝나는 .java 클래스에 정의됩니다.
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ 인증을 위한 도우미 클래스입니다.
AuthenticationFilter.java 인증되지 않은 요청을 보호된 엔드포인트로 401 페이지로 리디렉션합니다.
src/main/resources/authentication.properties Microsoft Entra ID 및 프로그램 구성.
src/main/webapp/ 이 디렉터리에는 UI - JSP 템플릿이 포함되어 있습니다.
CHANGELOG.md 샘플의 변경 내용 목록입니다.
CONTRIBUTING.md 샘플에 기여하기 위한 지침입니다.
면허 샘플에 대한 라이선스입니다.

초과분 처리를 포함하여 토큰에서 그룹 클레임 처리

다음 섹션에서는 앱이 그룹 클레임을 처리하는 방법을 설명합니다.

그룹 클레임

로그인한 사용자가 구성원인 보안 그룹의 개체 ID는 다음 예제와 같이 토큰의 그룹 클레임에 반환됩니다.

{
  ...
  "groups": [
    "0bbe91cc-b69e-414d-85a6-a043d6752215",
    "48931dac-3736-45e7-83e8-015e6dfd6f7c",]
  ...
}

그룹 초과분 클레임

토큰 크기가 HTTP 헤더 크기 제한을 초과하지 않도록 하기 위해 Microsoft ID 플랫폼 그룹 클레임에 포함된 개체 ID의 수를 제한합니다.

초과분 제한은 SAML 토큰의 경우 150개, JWT 토큰의 경우 200개, 단일 페이지 애플리케이션의 경우 6개입니다. 사용자가 초과분 제한보다 더 많은 그룹의 구성원인 경우 Microsoft ID 플랫폼 토큰에서 그룹 클레임의 그룹 ID를 내보내지 않습니다. 대신 다음 예제와 같이 Microsoft Graph API를 쿼리하여 사용자의 그룹 멤버 자격을 검색하도록 애플리케이션에 나타내는 토큰에 초과분 클레임이 포함됩니다.

{
  ...
  "_claim_names": {
    "groups": "src1"
    },
    {
   "_claim_sources": {
    "src1": {
        "endpoint":"[Graph Url to get this user's group membership from]"
        }
    }
  ...
}

테스트를 위해 이 샘플에서 초과분 시나리오 만들기

초과분 시나리오를 만들려면 다음 단계를 사용할 수 있습니다.

  1. AppCreationScripts 폴더에 제공된 BulkCreateGroups.ps1 파일을 사용하여 많은 그룹을 만들고 사용자를 할당할 수 있습니다. 이 파일은 개발 중에 초과분 시나리오를 테스트하는 데 도움이 됩니다. BulkCreateGroups.ps1 스크립트에서 제공된 사용자를 objectId 변경해야 합니다.

  2. 이 샘플을 실행하면 초과분이 발생하면 사용자가 로그인한 _claim_names 후 홈페이지에 표시됩니다.

  3. 가능한 경우 그룹 필터링 기능을 사용하여 그룹 초과가 발생하지 않도록 하는 것이 좋습니다. 자세한 내용은 사용자가 할당할 수 있는 필터링된 그룹 집합에서 그룹 클레임 값을 받도록 애플리케이션 구성 섹션 을 참조하세요.

  4. 그룹 초과를 방지할 수 없는 경우 다음 단계를 사용하여 토큰에서 그룹 클레임을 처리하는 것이 좋습니다.

    1. 그룹인 값 중 하나를 사용하여 클레임 _claim_names 을 확인합니다. 이 클레임은 초과분임을 나타냅니다.
    2. 있는 경우 지정된 _claim_sources 엔드포인트를 호출하여 사용자 그룹을 가져옵니다.
    3. 찾을 수 없는 경우 사용자 그룹에 대한 그룹 클레임을 조사합니다.

참고 항목

초과분 처리에는 로그인한 사용자의 그룹 멤버 자격을 읽기 위해 Microsoft Graph를 호출해야 하므로 앱이 getMemberObjects 함수를 성공적으로 실행하려면 GroupMember.Read.All 권한이 있어야 합니다.

Microsoft Graph 프로그래밍에 대한 자세한 내용은 개발자를 위한 Microsoft Graph 소개 비디오를 참조하세요.

ConfidentialClientApplication

ConfidentialClientApplication 인스턴스는 다음 예제와 같이 AuthHelper.java 파일에 만들어집니다. 이 개체는 Microsoft Entra 권한 부여 URL을 만드는 데 도움이 되며 액세스 토큰에 대한 인증 토큰을 교환하는 데도 도움이 됩니다.

// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                      .builder(CLIENT_ID, secret)
                      .authority(AUTHORITY)
                      .build();

인스턴스화에는 다음 매개 변수가 사용됩니다.

  • 앱의 클라이언트 ID입니다.
  • 기밀 클라이언트 애플리케이션에 대한 요구 사항인 클라이언트 암호입니다.
  • Microsoft Entra 테넌트 ID를 포함하는 Microsoft Entra ID 기관입니다.

이 샘플에서 이러한 값은 Config.java 파일의 속성 판독기를 사용하여 authentication.properties 파일에서 습니다.

단계별 안내

다음 단계에서는 앱의 기능에 대한 연습을 제공합니다.

  1. 로그인 프로세스의 첫 번째 단계는 Microsoft Entra ID 테넌트에 대한 엔드포인트에 요청을 /authorize 보내는 것입니다. MSAL4J ConfidentialClientApplication 인스턴스는 권한 부여 요청 URL을 생성하는 데 사용됩니다. 앱은 사용자가 로그인하는 이 URL로 브라우저를 리디렉션합니다.

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
            .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    

    다음 목록에서는 이 코드의 기능을 설명합니다.

    • AuthorizationRequestUrlParameters: AuthorizationRequestUrl을 빌드하기 위해 설정해야 하는 매개 변수입니다.
    • REDIRECT_URI: Microsoft Entra에서 사용자 자격 증명을 수집한 후 인증 코드와 함께 브라우저를 리디렉션합니다. Azure Portal의 Microsoft Entra ID 앱 등록에서 리디렉션 URI와 일치해야 합니다.
    • SCOPES: 범위는 애플리케이션에서 요청한 권한입니다.
      • 일반적으로 세 가지 범위는 openid profile offline_access ID 토큰 응답을 수신하는 데 충분합니다.
      • 앱에서 요청한 전체 범위 목록은 authentication.properties 파일에서 찾을 수 있습니다. 와 같은 User.Read더 많은 범위를 추가할 수 있습니다.
  2. 사용자에게 Microsoft Entra ID의 로그인 프롬프트가 표시됩니다. 로그인 시도가 성공하면 사용자의 브라우저가 앱의 리디렉션 엔드포인트로 리디렉션됩니다. 이 엔드포인트에 대한 유효한 요청에는 권한 부여 코드포함되어 있습니다.

  3. 그런 다음, 인스턴스는 ConfidentialClientApplication Microsoft Entra ID에서 ID 토큰 및 액세스 토큰에 대해 이 권한 부여 코드를 교환합니다.

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
            .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    

    다음 목록에서는 이 코드의 기능을 설명합니다.

    • AuthorizationCodeParameters: ID 및/또는 액세스 토큰에 대한 권한 부여 코드를 교환하기 위해 설정해야 하는 매개 변수입니다.
    • authCode: 리디렉션 엔드포인트에서 받은 권한 부여 코드입니다.
    • REDIRECT_URI: 이전 단계에서 사용된 리디렉션 URI를 다시 전달해야 합니다.
    • SCOPES: 이전 단계에서 사용된 범위를 다시 전달해야 합니다.
  4. acquireToken이 성공하면 토큰 클레임이 추출됩니다. nonce 검사가 통과하면 결과가 인스턴스 IdentityContextData 에 배치 context 되고 세션에 저장됩니다. 그런 다음, 애플리케이션은 다음 코드와 같이 액세스가 필요할 때마다 인스턴스 IdentityContextAdapterServlet 를 통해 세션에서 인스턴스화 IdentityContextData 할 수 있습니다.

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());
    
    // handle groups overage if it has occurred.
    handleGroupsOverage(contextAdapter);
    
  5. 이전 단계 후에는 인스턴스IdentityContextData를 사용하여 그룹 context.getGroups() 멤버 자격을 추출할 수 있습니다.

  6. 사용자가 너무 많은 그룹(200개 이상)의 멤버인 경우 호출이 아닌 경우 호출 context.getGroups() handleGroupsOverage()이 비어 있을 수 있습니다. 한편, context.getGroupsOverage() 초과분이 발생했음을 알리고 그룹 전체 목록을 가져오려면 Microsoft Graph에 대한 호출이 필요하다는 신호를 반환 true합니다. handleGroupsOverage() 초과분이 발생할 때 이 애플리케이션이 어떻게 사용되는 context.setGroups() 지 확인하려면 AuthHelper.java 메서드를 참조하세요.

경로 보호

샘플 앱이 경로에 대한 액세스를 필터링하는 방법을 보려면 AuthenticationFilter.java 참조하세요. authentication.properties 파일 app.protect.authenticated 에서 속성은 다음 예제와 같이 인증된 사용자만 액세스할 수 있는 쉼표로 구분된 경로를 포함합니다.

# for example, /token_details requires any user to be signed in and does not require special groups claim
app.protect.authenticated=/token_details

다음 예제와 같이 쉼표로 구분된 규칙 집합에 app.protect.groups 나열된 모든 경로는 인증되지 않은 인증되지 않은 사용자로 제한됩니다. 그러나 이러한 경로에는 공백으로 구분된 그룹 멤버 자격 목록도 포함됩니다. 해당 그룹 중 하나 이상에 속한 사용자만 인증 후 이러한 경로에 액세스할 수 있습니다.

# define short names for group IDs here for the app. This is useful in the next property (app.protect.groups).
# EXCLUDE the curly braces, they are in this file only as delimiters.
# example:
# app.groups=groupA abcdef-qrstuvw-xyz groupB abcdef-qrstuv-wxyz
app.groups=admin {enter-your-admins-group-id-here}, user {enter-your-users-group-id-here}

# A route and its corresponding group(s) that can view it, <space-separated>; the start of the next route & its group(s) is delimited by a <comma-and-space-separator>
# this says: /admins_only can be accessed by admin group, /regular_user can be accessed by admin group and user group
app.protect.groups=/admin_only admin, /regular_user admin user

범위

범위는 Microsoft Entra ID에 애플리케이션이 요청하는 액세스 수준을 알려줍니다.

요청된 범위에 따라 Microsoft Entra ID는 로그인 시 사용자에게 동의 대화 상자를 제공합니다. 사용자가 하나 이상의 범위에 동의하고 토큰을 가져오는 경우 범위 동의가 결과 access_token로 인코딩됩니다.

애플리케이션에서 요청한 범위는 authentication.properties를 참조하세요. 기본적으로 애플리케이션은 범위 값을 .로 GroupMember.Read.All설정합니다. 이 특정 Microsoft Graph API 범위는 애플리케이션이 사용자의 그룹 멤버 자격을 얻기 위해 Graph를 호출해야 하는 경우에 필요합니다.

자세한 정보

다음 단계

Azure Virtual Machines에서 WebLogic에 Java WebLogic 앱 배포