OpenID Connect를 사용하여 Microsoft Entra ID로 WebSphere Liberty/Open Liberty 애플리케이션 보호
이 문서에서는 OIDC(OpenID Connect)를 사용하여 Microsoft Entra ID로 IBM WebSphere Liberty/Open Liberty 애플리케이션을 보호하는 방법을 보여 줍니다.
이 문서에서는 다음 방법을 설명합니다.
- Microsoft Entra ID를 사용하여 OIDC 공급자를 설정합니다.
- OIDC를 사용하여 WebSphere Liberty/Open Liberty 앱을 보호합니다.
- WebSphere Liberty/Open Liberty 앱을 실행하고 테스트합니다.
필수 구성 요소
- Azure 구독 Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
- 클라우드 애플리케이션 관리자 Microsoft Entra 역할이 있는 Azure ID입니다. 자세한 내용은 Microsoft Entra 역할 할당 및 Microsoft Entra 기본 제공 역할 목록을 참조하세요.
- Microsoft Entra 테넌트. 기존 테넌트가 없는 경우 빠른 시작: 테넌트 설정을 참조하세요.
- Unix와 유사한 운영 체제가 설치된 로컬 컴퓨터(예: Ubuntu, macOS 또는 Linux용 Windows 하위 시스템).
- Git
- Java SE 구현 버전 21 이상(예: OpenJDK의 Microsoft 빌드).
- Maven, 버전 3.9.3 이상.
Microsoft Entra ID를 사용하여 OIDC 공급자 설정
OpenID Connect는 Microsoft Entra ID에서 잘 지원되는 업계 표준 인증 프로토콜입니다. 이 섹션에서는 WebSphere Liberty/Open Liberty 앱에 사용할 Microsoft Entra ID를 사용하여 OIDC 공급자를 설정합니다. 이후 섹션에서는 OIDC를 사용하여 Microsoft Entra 테넌트에서 사용자를 인증하고 권한을 부여하여 WebSphere Liberty/Open Liberty 앱을 구성합니다.
Microsoft Entra 테넌트에서 사용자 만들기
먼저 사용자를 만들고 초대하고 삭제하는 방법의 단계에 따라 Microsoft Entra 테넌트에서 두 명의 사용자를 만듭니다. 새 사용자 만들기 섹션만 있으면 됩니다. 문서를 진행할 때 다음 지침을 사용한 다음, Microsoft Entra 테넌트에서 사용자를 만든 후 이 문서로 돌아갑니다.
앱에서 "관리자"로 사용할 사용자를 만들려면 다음 단계를 사용합니다.
- 새 사용자 만들기 섹션의 기본 사항 탭에 도달하면 다음 단계를 사용합니다.
앱에서 "사용자"로 사용할 사용자를 만들려면 다음 단계를 반복하지만 다음 값을 사용합니다.
- 사용자 계정 이름으로 사용자를 입력합니다.
- 표시 이름에 대해 사용자를 입력합니다.
Microsoft Entra ID에 애플리케이션 등록
다음으로, 빠른 시작의 단계에 따라 애플리케이션을 등록합니다. Microsoft ID 플랫폼 애플리케이션을 등록합니다. 문서를 진행할 때 다음 지침을 사용한 다음, 애플리케이션을 등록하고 구성한 후 이 문서로 돌아갑니다.
- 애플리케이션 등록 섹션에 도달하면 다음 단계를 사용합니다.
- 지원되는 계정 유형의 경우 이 조직 디렉터리에서만 계정을 선택합니다(기본 디렉터리만 - 단일 테넌트).
- 등록이 완료되면 애플리케이션(클라이언트) ID 및 디렉터리(테넌트) ID 값을 저장하여 나중에 앱 구성에서 사용합니다.
- 리디렉션 URI 추가 섹션에 도달하면 현재 단계를 건너뜁니다. 나중에 이 문서에서 로컬로 샘플 앱을 실행하고 테스트할 때 리디렉션 URI를 추가합니다.
- 자격 증명 추가 섹션에 도달하면 클라이언트 비밀 추가 탭을 선택합니다.
- 클라이언트 암호를 추가하는 경우 나중에 앱 구성에서 사용할 클라이언트 비밀 값을 적어 씁니다.
애플리케이션에 앱 역할 추가
그런 다음 애플리케이션에 앱 역할 추가의 단계에 따라 애플리케이션에 앱 역할을 추가하고 토큰에서 받습니다. 애플리케이션에 대한 역할 선언 및 Microsoft Entra 역할에 사용자 및 그룹 할당 섹션만 있으면 됩니다. 문서를 진행할 때 다음 지침을 사용한 다음, 애플리케이션에 대한 역할을 선언한 후 이 문서로 돌아갑니다.
애플리케이션에 대한 역할 선언 섹션에 도달하면 앱 역할 UI를 사용하여 관리자와 일반 사용자에 대한 역할을 만듭니다.
Microsoft Entra 역할에 사용자 및 그룹 할당에 도달하면 다음 단계를 사용합니다.
애플리케이션에 앱 역할 추가의 다른 단계를 수행하고 토큰에서 수신하지 마세요.
OpenID Connect를 사용하여 WebSphere Liberty/Open Liberty 앱 보호
이 섹션에서는 OIDC를 사용하여 Microsoft Entra 테넌트에서 사용자를 인증하고 권한을 부여하는 WebSphere Liberty/Open Liberty 앱을 보호합니다. 또한 RBAC(역할 기반 액세스 제어)를 사용하여 사용자에게 앱의 특정 부분에 대한 액세스 권한을 부여하는 방법을 알아봅니다. 앱은 Jakarta Servlet 사양의 프로그래밍 방식 보안 정책 구성을 사용합니다. Jakarta EE는 RESTful 웹 서비스도 지원합니다. RESTful 웹 서비스 애플리케이션 보안에 대한 문서에 대한 참조는 다음 단계 섹션을 참조하세요.
이 빠른 시작에 대한 샘플 WebSphere Liberty/Open Liberty 앱은 liberty-entra-id 리포지토리의 GitHub에 있습니다.
인증 및 권한 부여를 사용하여 앱 보호
앱에는 다음 예제 코드에 표시된 index.html 정의된 시작 페이지 리소스가 있습니다. 이 페이지는 인증되지 않은 사용자가 액세스할 수 있습니다. 시작 페이지의 루트 경로는 .에 있습니다 /
.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Greeting</title>
</head>
<body>
<h1>Hello, welcome to Open Liberty/WebSphere Liberty and Microsoft Entra ID integration!</h1>
<h1>
<a href="/profile/user">Sign in as user</a>
</h1>
<h1>
<a href="/profile/admin">Sign in as admin</a>
</h1>
</body>
</html>
시작 페이지에서 사용자는 앱에 로그인하여 프로필 페이지에 액세스할 수 있습니다. 시작 페이지에는 사용자 또는 관리자로 로그인할 수 있는 링크가 있습니다. 링크는 각각에 /profile/user
있습니다 /profile/admin
.
다음 예제 코드와 같이 링크는 /profile/admin
모두 /profile/user
ProfileServlet.java 정의된 프로필 서블릿을 가리킵니다. 이 서블릿은 주석 jakarta.servlet.annotation.ServletSecurity
과 주석을 사용하여 인증된 사용자만 액세스할 수 있습니다 jakarta.servlet.annotation.HttpConstraint
. 이 특성 rolesAllowed = {"users"}
은 보안 역할이 users
있는 인증된 사용자만 경로에 액세스할 수 있도록 지정합니다 /profile
. 인증된 사용자에게는 Liberty 구성 파일 server.xml 역할이 자동으로 할당됩니다users
.
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.HttpConstraint;
import jakarta.servlet.annotation.ServletSecurity;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import com.ibm.websphere.security.social.UserProfileManager;
import java.util.List;
@WebServlet(name = "ProfileServlet", urlPatterns = {"/profile/user","/profile/admin"})
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"users"},
transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))
public class ProfileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
List<?> roles = UserProfileManager.getUserProfile().getIdToken().getClaims().getClaim("roles",
List.class);
String path = request.getServletPath();
if (path.equals("/profile/admin") && (null == roles || !roles.contains("admin"))) {
response.sendError(HttpServletResponse.SC_FORBIDDEN);
return;
}
String username = request.getUserPrincipal().getName();
request.setAttribute("name", username);
request.setAttribute("roles", roles);
request
.getRequestDispatcher("/profile.jsp")
.forward(request, response);
}
}
프로필 서블릿은 ID 토큰에서 사용자의 역할을 검색하고 사용자가 경로에 액세스 /profile/admin
하려고 할 때 사용자에게 admin
역할이 있는지 확인합니다. 사용자에게 역할이 없 admin
으면 서블릿은 403 사용할 수 없음 오류를 반환합니다. 다른 경우, 서블렛은 사용자의 이름을 검색하고 사용자의 이름과 역할이 있는 프로필 페이지로 요청을 전달합니다.
프로필 페이지는 다음 예제와 같이 profile.jsp 정의됩니다. 이 페이지에는 사용자의 이름과 역할이 표시됩니다. 프로필 페이지에는 로그아웃 링크도 있습니다 /logout
. 프로필 페이지는 JSP(Jakarta 서버 페이지)로 작성되었습니다. 페이지에서 식을 ${}
사용합니다. ${}
EL(Jakarta Expression Language)의 사용을 나타냅니다. EL 식은 페이지가 렌더링될 때 해당 변수의 값으로 바뀝니다. EL 사양에 대한 참조는 다음 단계 섹션을 참조하세요.
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<meta charset="UTF-8">
<title>Profile</title>
</head>
<body>
<h1>Hello, ${name}</h1>
<h2>Roles</h2>
<ul>
<c:forEach var="role" items="${roles}">
<li>${role}</li>
</c:forEach>
</ul>
<h1>
<b><a href="/logout">Sign out</a></b>
</h1>
</body>
</html>
사용자가 로그아웃할 링크를 선택하면 앱은 다음 예제 코드와 같이 LogoutServlet.java 정의된 로그아웃 서블릿을 호출합니다. 로그아웃 서블릿은 메서드를 request.logout()
호출하여 사용자를 로그아웃한 다음 사용자를 시작 페이지로 리디렉션합니다.
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.HttpConstraint;
import jakarta.servlet.annotation.ServletSecurity;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "LogoutServlet", urlPatterns = "/logout")
@ServletSecurity(value = @HttpConstraint(rolesAllowed = {"users"},
transportGuarantee = ServletSecurity.TransportGuarantee.CONFIDENTIAL))
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
request.logout();
response.sendRedirect("/");
}
}
WebSphere Liberty/Open Liberty 앱 실행 및 테스트
이 섹션에서는 WebSphere Liberty/Open Liberty 앱을 실행하고 테스트하여 Microsoft Entra ID를 OIDC 공급자로 사용하는 방법을 확인합니다.
앱 등록에 리디렉션 URI 추가
앱을 로컬에서 성공적으로 실행하고 테스트하려면 앱 등록에 리디렉션 URI를 추가해야 합니다. 빠른 시작의 리디렉션 URI 추가 섹션의 지침에 따라 Microsoft ID 플랫폼 애플리케이션을 등록하고 다음 값을 사용합니다.
- 플랫폼 구성의 경우 웹을 선택합니다.
- 리디렉션 URI에
https://localhost:9443/ibm/api/social-login/redirect/liberty-entra-id
를 입력합니다.
샘플 준비
다음 단계를 사용하여 샘플 앱을 준비합니다.
다음 명령을 사용하여 GitHub에서 샘플 앱을 복제합니다.
git clone https://github.com/Azure-Samples/liberty-entra-id cd liberty-entra-id git checkout 2024-09-26
분리된 HEAD 상태에 있다는 메시지가 표시되면 이 메시지는 무시해도 안전합니다. 이 메시지는 태그를 체크 아웃한 것일 뿐입니다.
다음 명령을 사용하여 앞에서 기록한 값으로 다음 환경 변수를 정의합니다.
export CLIENT_ID==<application/client-ID> export CLIENT_SECRET=<client-secret> export TENANT_ID=<directory/tenant-ID>
이러한 환경 변수는 WebSphere Liberty/Open Liberty에서 OIDC를 기본적으로 지원하는 값을 제공합니다. Liberty server.xml 해당 OIDC 구성은 다음 예제에 나와 있습니다.
<oidcLogin id="liberty-entra-id" clientId="${client.id}" clientSecret="${client.secret}" discoveryEndpoint="https://login.microsoftonline.com/${tenant.id}/v2.0/.well-known/openid-configuration" signatureAlgorithm="RS256" userNameAttribute="preferred_username" />
구성 파일에 변수 값이 정의되지 않은 경우 WebSphere Liberty/Open Liberty는 명명 규칙에 따라 환경 변수에서 값을 읽습니다. 명명 변환에 대한 자세한 내용은 변수 대체 우선 순위를 참조 하세요.
WebSphere Liberty/Open Liberty 앱 실행
를 사용하여 liberty-maven-plugin
앱을 실행할 수 있습니다. 앱을 실행하려면 다음 방법 중 하나를 선택합니다.
참고 항목
WebSphere Liberty/Open Liberty가 Microsoft Entra ID에 연결할 수 있도록 하려면 이전 섹션에 표시된 환경 변수를 정의한 셸에서 명령을 실행해야 합니다.
개발 모드에서 앱을 실행합니다.
mvn liberty:dev
런타임 모드에서 앱을 실행합니다.
mvn liberty:run
다른 모드를 시도하려면 Ctrl+C를 사용하여 앱을 중지한 다음 다른 모드에서 앱을 실행합니다.
WebSphere Liberty/Open Liberty 앱 테스트
앱이 실행되면 프라이빗 탭 https://localhost:9443
이 있는 웹 브라우저를 열고 . 인증서가 자체 서명되었으므로 인증서에 대한 경고가 표시될 수 있습니다. 경고를 안전하게 무시하고 사이트로 진행할 수 있습니다.
사용자 또는 관리자로 로그인할 수 있는 링크가 있는 시작 페이지가 표시됩니다. 프라이빗 탭을 사용하면 일반 브라우저에 있을 수 있는 기존 Microsoft Entra ID 활동이 오염되는 것을 방지할 수 있습니다.
두 사용자의 자격 증명 수집
이 문서에서 Microsoft Entra ID는 각 사용자의 이메일 주소를 로그인을 위한 사용자 ID로 사용합니다. 다음 단계를 사용하여 관리자 및 일반 사용자의 전자 메일 주소를 가져옵니다.
- 최소한 클라우드 애플리케이션 관리자로 Microsoft Entra 관리 센터에 로그인합니다.
- 여러 테넌트에 액세스할 수 있는 경우 위쪽 메뉴의 설정 아이콘( )을 사용하여 디렉터리 + 구독 메뉴에서 애플리케이션 을 등록하려는 테넌트로 전환합니다 .
- ID > 사용자 모든 사용자를 > 찾습니다.
- 목록에서 관리자 사용자를 찾아 선택합니다.
- 사용자 계정 이름 필드를 찾습니다.
- 필드 값 옆에 있는 복사 아이콘을 사용하여 사용자의 전자 메일 주소를 클립보드에 저장합니다. 나중에 사용할 수 있는 값을 저장합니다.
- 일반 사용자의 전자 메일 주소를 얻으려면 동일한 단계를 수행합니다.
사용자를 만들 때 설정한 관리자 사용자 및 일반 사용자에 대한 암호를 사용합니다.
앱의 기능 연습
다음 단계를 사용하여 기능을 연습합니다.
사용자로 로그인 링크를 선택합니다. 이전에 만든 일반 사용자로 로그인합니다. 로그인한 후 Microsoft Entra ID는 프로필 페이지로 리디렉션됩니다. 여기서 사용자의 이름과 역할이 표시됩니다.
처음 로그인하는 경우 암호를 업데이트하라는 메시지가 표시됩니다. 지침에 따라 암호를 업데이트합니다.
조직에 메시지가 표시되면 추가 보안 정보가 필요합니다. 프롬프트에 따라 Microsoft Authenticator 앱을 다운로드하고 설정합니다. 나중에 요청을 선택하여 테스트를 계속할 수 있습니다.
권한 요청 메시지가 표시되면 앱에서 요청한 사용 권한을 검토합니다. [수락]을 선택하여 테스트를 계속합니다.
로그아웃을 선택하여 앱에서 로그아웃합니다. 로그아웃하면 시작 페이지로 리디렉션됩니다.
관리자 권한으로 로그인 링크를 선택합니다. Microsoft Entra ID는 사용자를 로그인 페이지로 리디렉션합니다. 이전에 만든 관리자 사용자로 로그인합니다. 로그인한 후 Microsoft Entra ID는 다른 역할
admin
로 유사한 프로필 페이지로 리디렉션됩니다.다시 로그아웃하고 이전에 만든 일반 사용자로 관리자로 로그인합니다. 일반 사용자에게 역할이 없
admin
으므로 오류 메시지가 표시됩니다.
리소스 정리
이 문서에서는 Azure에 앱을 배포하도록 지시하지 않습니다. Microsoft Entra ID 리소스가 있지만 앱에 대해 정리할 Azure 리소스는 없습니다. Azure에 앱을 배포하려면 다음 섹션에서 참조하는 지침을 따를 수 있습니다.
이 샘플 앱에 대한 리소스를 완료하면 다음 단계를 사용하여 Microsoft Entra ID 리소스를 정리합니다. 사용되지 않는 Microsoft Entra ID 리소스를 제거하는 것이 중요한 보안 모범 사례입니다.
- Microsoft ID 플랫폼 등록된 애플리케이션 제거의 단계에 따라 만든 앱 등록을 제거합니다. 조직에서 작성한 애플리케이션 제거 섹션의 단계만 수행하면 됩니다.
- 앱 등록을 제거하는 작업도 엔터프라이즈 애플리케이션을 삭제해야 합니다. 엔터프라이즈 애플리케이션 삭제에 대한 자세한 내용은 엔터프라이즈 애플리케이션 삭제를 참조하세요.
- 사용자를 만들고 초대하고 삭제하는 방법의 단계에 따라 만든 사용자를 삭제합니다.
다음 단계
이 빠른 시작에서는 OIDC를 사용하여 Microsoft Entra ID로 WebSphere Liberty/Open Liberty 애플리케이션을 보호합니다. 자세히 알아보려면 다음 리소스를 살펴보세요.
- Azure Container Apps에서 Open Liberty 또는 WebSphere Liberty를 사용하여 Java 애플리케이션 배포
- Azure Red Hat OpenShift에 WebSphere Liberty 및 Open Liberty 배포
- AKS(Azure Kubernetes Service) 클러스터에서 Open Liberty 또는 WebSphere Liberty를 사용하여 Java 애플리케이션 배포
- Microsoft Entra ID를 사용한 OpenID Connect 인증
- Microsoft ID 플랫폼 및 OAuth 2.0 인증 코드 흐름
- 소셜 미디어 공급자를 통해 사용자 인증
- 소셜 미디어 로그인 1.0
- OpenID Connect 클라이언트 1.0
- OpenID Connect란?
- 프로그래밍 방식 보안 정책 구성
- Jakarta EE를 사용하여 RESTful 웹 서비스를 보호하는 방법
- Jakarta 식 언어