AWS Blu Age 현대화된 메인프레임 애플리케이션에서 Microsoft Entra ID 기반 인증 구현 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Blu Age 현대화된 메인프레임 애플리케이션에서 Microsoft Entra ID 기반 인증 구현

Vishal Jaswani 및 Rimpy Tewani, Amazon Web Services

요약

AWS Mainframe ModernizationAWS Blu Age를 사용한 리팩터링 패턴과 같은 리팩터링 패턴을 사용하여 현대화된 메인프레임 애플리케이션은 인증 메커니즘을 새 애플리케이션 아키텍처에 신중하게 통합해야 합니다. 이 통합은 일반적으로 현대화 후 활동으로 처리됩니다. 작업은 복잡할 수 있으며, 최신 보안 표준 및 클라우드 네이티브 관행에 맞게 기존 인증 시스템을 마이그레이션하거나 외부화하는 경우가 많습니다. 개발자는 현대화된 애플리케이션의 런타임 환경 및 라이브러리의 제약 내에서 작동하는 동안 인증을 효과적으로 구현하는 방법을 고려해야 합니다. 현대화 후는 AWS Blu Age 최신 코드를 Amazon CognitoMicrosoft Entra ID(이전 명칭 Azure AD)와 같은 ID 및 액세스 관리 시스템과 더 쉽게 통합할 수 있는 방법을 AWS 제공합니다.

이 패턴은 연구 및 시도에 시간을 소비하지 않고 인증 공급자가 Microsoft Entra ID인 경우 현대화된 애플리케이션에서 인증 메커니즘을 구현하는 방법을 설명합니다. 패턴은 다음을 제공합니다.

  • Microsoft Authentication Library(MSAL) 및 인증 구현에 필수적인 기타 Microsoft Entra ID 설명서의 필드 테스트 및 관련 Angular 라이브러리. 

  • OAuth 2.0을 사용하여 Spring Security를 활성화하기 위해 AWS Blu Age 런타임에 필요한 구성입니다.

  • 인증된 사용자의 자격 증명을 캡처하여 AWS Blu Age 런타임에 전달하는 라이브러리입니다.

  • 구현할 것을 권장하는 보안 조치입니다.

  • Microsoft Entra ID 설정에서 일반적으로 발생하는 문제에 대한 문제 해결 팁입니다.

참고

이 패턴은 AWS 전문 서비스 참여의 일부로 고객에게 제공되는 AWS Blu Age OAuth 확장 라이브러리를 사용합니다. 이 라이브러리는 AWS Blu Age 런타임의 일부가 아닙니다.

사전 조건 및 제한 사항

사전 조건 

  • AWS Blu Age 메인프레임 현대화 리팩터링 도구에서 생성한 현대화된 애플리케이션입니다. 이 패턴은 CardDemo를 샘플 오픈 소스 메인프레임 애플리케이션으로 사용합니다.

  • AWS Blu Age OAuth 확장 라이브러리는 AWS 전문 서비스에 참여하는 동안 AWS Blu Age 팀에서 제공합니다.

  • 현대화된 애플리케이션을 배포하고 테스트 AWS 계정 하는 활성 입니다.

  • AWS Blu Age 구성 파일 및 Microsoft Entra ID 기본 사항에 대한 지식.

제한 사항

  • 이 패턴은 OAuth 2.0 인증 및 기본 토큰 기반 권한 부여 흐름을 다룹니다. 고급 권한 부여 시나리오와 세분화된 액세스 제어 메커니즘은 범위에 포함되지 않습니다.

  • 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전 가용성은 AWS 서비스 리전별 섹션을 참조하세요. 특정 엔드포인트는 서비스 엔드포인트 및 할당량을 참조하고 서비스 링크를 선택합니다.

제품 버전

이 패턴은 다음을 사용하여 개발되었습니다.

  • AWS Blu Age 런타임 버전 4.1.0(패턴은 이전 버전과 호환되는 이후 버전에서도 작동함)

  • MSAL 라이브러리 버전 3.0.23

  • Java 개발 키트(JDK) 버전 17

  • 각형 버전 16.1

아키텍처

소스 기술 스택  

일반적인 메인프레임 환경에서는 사용자 프로필을 통해 인증이 구현됩니다. 이러한 프로필은 시스템에 대한 사용자를 식별하고, 로그인할 수 있는 사용자를 정의하고, 사용자가 시스템 리소스에서 수행할 수 있는 함수를 지정합니다. 사용자 프로필은 보안 책임자 또는 보안 관리자가 관리합니다.

대상 기술 스택

  • Microsoft Entra ID

  • 현대화된 Java Spring 부팅 기반 백엔드

  • AWS Blu Age 런타임

  • OAuth 2.0을 사용한 Spring Security

  • Angular 단일 페이지 애플리케이션(SPA)

대상 아키텍처 

AWS Blu Age 런타임은 기본적으로 OAuth 2.0 기반 인증을 지원하므로 패턴은 해당 표준을 사용하여 백엔드 APIs를 보호합니다.

다음 다이어그램은 프로세스 흐름을 보여줍니다.

참고

이 다이어그램에는 데이터베이스 현대화의 예로 Amazon Aurora가 포함되어 있지만 Aurora는이 패턴의 단계에 포함되지 않습니다.

AWS Blu Age 애플리케이션의 Entra ID 기반 인증을 위한 프로세스 흐름입니다.

여기서 각 항목은 다음과 같습니다.

  1. 사용자가 Microsoft Entra ID로 인증을 시도합니다.

  2. Microsoft Entra ID는 애플리케이션이 후속 호출에서 사용하는 새로 고침, 액세스 및 ID 토큰을 반환합니다.

  3. MSAL 인터셉터에는 AWS Blu Age 런타임을 호출하기 위한 HTTPS 요청의 Authorization 헤더에 액세스 토큰이 포함되어 있습니다.

  4. AWS Blu Age extension-oauth 라이브러리는 AWS Blu Age 런타임 구성 파일(application-main.yml)을 사용하여 헤더에서 사용자 정보를 추출하고이 정보를 SharedContext 객체에 배치하여 비즈니스 로직이 이를 사용할 수 있도록 합니다.

    참고

    SharedContext는 현대화된 애플리케이션 전체에서 애플리케이션 컨텍스트 및 상태 정보를 관리하는 AWS Blu Age에서 제공하는 런타임 구성 요소입니다. AWS Blu Age 런타임 구성 요소 및 업데이트에 대한 자세한 내용은 AWS Mainframe Modernization 설명서의 AWS Blu Age 릴리스 정보를 참조하세요. application-main.yml 파일에 대한 자세한 내용은 AWS Mainframe Modernization 설명서의 AWS Blu Age 런타임에 대한 구성 설정을 참조하세요.

  5. AWS Blu Age 런타임은 토큰이 있는지 확인합니다. 

    1. 토큰이 있는 경우 Microsoft Entra ID와 통신하여 토큰의 유효성을 확인합니다. 

    2. 토큰이 없는 경우 AWS Blu Age 런타임은 HTTP 상태 코드 403과 함께 오류를 반환합니다.

  6. 토큰이 유효하면 AWS Blue Age 런타임에서 비즈니스 로직을 계속할 수 있습니다. 토큰이 유효하지 않은 경우 AWS Blu Age 런타임은 HTTP 상태 코드 403과 함께 오류를 반환합니다.

OAuth 2.0 워크플로

OAuth 2.0 워크플로의 상위 수준 다이어그램은 Microsoft Entra 설명서를 참조하세요.

도구

AWS 서비스

  • AWS Mainframe Modernization는 메인프레임에서 AWS 관리형 런타임 환경으로의 마이그레이션 및 현대화를 계획하고 구현하는 데 도움이 되는 도구와 리소스를 제공합니다. AWS Blu Age에서 제공하는이 서비스의 리팩터링 기능을 사용하여 레거시 메인프레임 애플리케이션을 변환하고 현대화할 수 있습니다.

코드 리포지토리

Microsoft Entra ID와의 통합을 보여주기 위해 CardDemo 애플리케이션이 업데이트되었습니다. 이 패턴에 대한 GitHub 리포지토리에서 코드에 액세스할 수 있습니다.

백엔드 구성

이 패턴은 백엔드 애플리케이션에서 OAuth 2.0을 사용하여 Spring Security를 활성화하려면 application-main.yml 구성 파일을 변경해야 합니다.  .yml 파일은 다음과 같습니다.

gapwalk-application.security: enabled gapwalk-application: security: identity: oauth issuerUri: ${issuerUrl} claim: claims: - claimName: upn claimMapValue: username spring: autoconfigure: exclude: - org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration - org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration security: oauth2: client: registration: azure: client-id: {clientId} client-secret: ${clientSecret} provider: azure authorization-grant-type: authorization_code redirect-uri: ${redirectUri} scope: openid provider: azure: authorization-uri: ${gapwalk-application.security.issuerUri}/oauth2/v2.0/authorize token-uri: ${gapwalk-application.security.issuerUri}/oauth2/v2.0/token jwk-set-uri: ${gapwalk-application.security.issuerUri}/discovery/v2.0/keys resourceserver: jwt: jwk-set-uri: ${gapwalk-application.security.issuerUri}/discovery/v2.0/keys

AWS Blu Age OAuth 확장 필터 라이브러리

AWS Blu Age OAuth 확장 라이브러리는 AWS 전문 서비스에 참여하는 동안 AWS Blu Age 팀에서 제공합니다.

이 라이브러리는 이전 코드 블록에 표시된 application-main.yml 파이의 claim.claims 구성을 읽습니다. 이 구성은 목록입니다. 목록의 각 항목은 claimName 및의 두 가지 값을 제공합니다claimMapValue.는 프런트엔드에서 전송한 JSON 웹 토큰(JWT)의 키 이름을 claimName 나타내며 claimMapValue는의 키 이름입니다SharedContext. 예를 들어 백엔드에서 사용자 ID를 캡처하려면 claimName를 Microsoft Entra ID에서 제공하는 userId를 포함하는 JWT의 키 이름으로 설정하고 claimMapValue를 키 이름으로 설정하여 백엔드 코드에서 사용자 ID를 가져옵니다.

예를 들어 UserId에서를 설정하는 경우 다음 코드를 사용하여 사용자 ID를 추출할 claimMapValue수 있습니다.

SharedContext.get().getValue("userId", [UserId]);

모범 사례

이 패턴을 구현할 때 다음과 같은 중요한 보안 고려 사항을 고려하세요.

중요

이 패턴은 인증 통합의 기반을 제공합니다. 프로덕션에 배포하기 전에 비즈니스 요구 사항에 따라이 섹션에서 설명하는 것 외에도 보안 조치를 구현하는 것이 좋습니다.

  • AWS 구성 보안. 민감한 구성 값을에서 application-main.yml로 이동합니다 AWS Secrets Manager. 예를 들어 Secrets Manager를 사용하여 다음 속성을 구성합니다.

    security: oauth2: client: registration: azure: client-id: {clientId} client-secret: ${clientSecret}

    Secrets Manager를 사용하여 AWS Blu Age 파라미터를 구성하는 방법에 대한 자세한 내용은 AWS Mainframe Modernization 설명서의 AWS Blu Age 런타임 암호를 참조하세요.

  • 런타임 환경 보호. 적절한 AWS 보안 제어를 사용하여 현대화된 애플리케이션 환경을 구성합니다.

    server: tomcat: remoteip: protocol-header: X-Forwarded-Proto remote-ip-header: X-Forwarded-For forward-headers-strategy: NATIVE
  • Amazon CloudWatch 로깅. 파일을 추가하는 것이 좋습니다logback-spring.xml to src/main/resources.

    <configuration> <appender name="CLOUDWATCH" class="com.amazonaws.services.logs.logback.CloudWatchAppender"> <logGroup>/aws/bluage/application</logGroup> <logStream>${AWS_REGION}-${ENVIRONMENT}</logStream> <layout> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </layout> </appender> <root level="INFO"> <appender-ref ref="CLOUDWATCH"/> </root> </configuration>

    CloudWatch를 사용하여 추적을 활성화하는 방법에 대한 자세한 내용은 CloudWatch 설명서의 추적에서 로그 상관 관계 활성화를 참조하세요.

  • 토큰 구성 및 처리. 보안 요구 사항에 맞게 Microsoft Entra ID에서 토큰 수명을 구성합니다. 액세스 토큰이 1시간 이내에 만료되도록 설정하고 새로 고침 토큰이 24시간 이내에 만료되도록 설정합니다. AWS Blu Age 런타임 구성(application-main.yml)에서 Entra ID 애플리케이션 등록의 정확한 발급자 URI 및 대상 값으로 JWT 검증이 올바르게 구성되었는지 확인합니다.

    토큰이 만료되고 새로 고쳐지는 경우:

    1. Angular 애플리케이션의 오류 인터셉터는 MSAL을 통해 새 토큰을 가져와 401 응답을 처리합니다.

    2. 새 토큰은 후속 요청과 함께 전송됩니다.

    3. AWS Blu Age 런타임의 OAuth 필터는 새 토큰을 검증하고 현재 사용자 정보로 자동으로 업데이트SharedContext합니다. 이렇게 하면 비즈니스 로직이 SharedContext.get().getValue() 호출을 통해 유효한 사용자 컨텍스트에 계속 액세스할 수 있습니다.

    AWS Blu Age 런타임 구성 요소 및 업데이트에 대한 자세한 내용은 AWS Blu Age 릴리스 정보를 참조하세요.

  • AWS Blu Age 런타임 보안. AWS Blu Age에서 제공하는 oauth2-ext 라이브러리는 적절한 파일 권한이 있는 올바른 공유 디렉터리 위치({app-server-home}/shared/)에 배치해야 합니다. 로그의 SharedContext 객체 모집단을 확인하여 라이브러리가 JWTs하는지 확인합니다.

  • 특정 클레임 구성. 에서 Microsoft Entra ID에서 필요한 클레임을 명시적으로 application-main.yml정의합니다. 예를 들어 사용자의 이메일과 역할을 캡처하려면 다음을 지정합니다.

    gapwalk-application: security: claim: claims: - claimName: upn claimMapValue: username - claimName: roles claimMapValue: userRoles - claimName: email claimMapValue: userEmail
  • 오류 처리. 오류 처리를 추가하여 Angular 애플리케이션의 인증 실패를 해결합니다. 예:

    @Injectable() export class AuthErrorInterceptor implements HttpInterceptor { intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { return next.handle(request).pipe( catchError((error: HttpErrorResponse) => { if (error.status === 401) { // Handle token expiration this.authService.login(); } if (error.status === 403) { // Handle unauthorized access this.router.navigate(['/unauthorized']); } return throwError(() => error); }) ); } }
  • 세션 제한 시간 구성. AWS Blu Age 런타임과 Microsoft Entra ID 모두에서 세션 제한 시간 설정을 구성합니다. 예를 들어 application-main.yml 파일에 다음 코드를 추가합니다.

    server: servlet: session: timeout: 3600 # 1 hour in seconds
  • MsalGuard. 무단 액세스를 방지하려면 모든 보호된 경로에 대해 MsalGuard 기능을 구현해야 합니다. 예:

    const routes: Routes = [ { path: '', redirectTo: '/transaction-runner', pathMatch: 'full' }, { path: 'transaction-runner', component: TransactionRunnerComponent, canActivate:guards }, { path: 'user-info', component: UserInfoComponent, canActivate:guards }, { path: 'term/:transid/:commarea', component: TermComponent, canActivate:guards }, { path: 'code', component: TransactionRunnerComponent } ];

    MsalGuard 보호 기능이 없는 경로는 인증 없이 액세스할 수 있으므로 민감한 기능이 노출될 수 있습니다. 인증이 필요한 모든 경로에 가드가 구성에 포함되어 있는지 확인합니다.

에픽

작업설명필요한 기술

Microsoft Azure 계정을 설정하여 Entra ID를 생성합니다.

옵션 및 지침은 Microsoft Azure 웹 사이트를 참조하십시오.

앱 개발자

애플리케이션에서 Microsoft Entra ID를 설정합니다.

Angular SPA에 Microsoft Entra ID B2C(Azure AD B2C) 인증을 추가하는 방법은 Microsoft 설명서를 참조하세요. 구체적으로 설명하면 다음과 같습니다.

  1. 애플리케이션 및 레코드 식별자를 등록합니다.

  2. 사용자 지정 범위를 추가하고 노출하여 AWS Blu Age 트랜잭션 엔드포인트를 노출합니다. https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-configure-app-expose-web-apis#add-a-scope  

  3. 범위와 API URL을 정의한 후 코드 리포지토리에 있는 environment.ts 파일의 apiUriapiScope 속성에서 이러한 값을 구성합니다.

앱 개발자
작업설명필요한 기술

GitHub 리포지토리를 복제하여 인증에 필요한 Angular 코드를 가져옵니다.

다음 명령을 실행하여이 패턴과 함께 제공되는 GitHub 리포지토리를 로컬 현재 작업 디렉터리에 복제합니다.

git clone https://github.com/aws-samples/sample-microsoft-entra-id-based-auth-in-aws-bluage-modernized-mainframe-app.git
앱 개발자

Tomcat 서버에 AWS Blu Age 현대화된 코드를 배포하여 인증을 구현합니다.

Tomcat 및 Angular 개발 서버가 포함된 로컬 환경을 설정하려면 AWS 전문 서비스와의 고객 참여의 일환으로 AWS Blu Age 팀이 제공하는 설치 단계를 따르세요.

앱 개발자
작업설명필요한 기술

AWS Blu Age 런타임 보안을 활성화하여 AWS Blu Age REST API 엔드포인트를 보호합니다.

다음과 같이 AWS Blu Age 런타임에서 사용하는 application-main.yml 파일을 구성합니다. 이 파일의 예는이 패턴의 앞부분에 있는 코드 리포지토리 섹션을 참조하세요.

  • spring:security:oauth2:client:*는 Spring Security OAuth 2.0 클라이언트 지원을 활성화합니다. 설정을 Microsoft Entra ID 설정과 관련된 값으로 바꿉니다.

  • spring:security:oauth2:resourceserver는 Spring Security OAuth 2.0 리소스 서버 지원을 활성화합니다.

  • gapwalk-application.security.issuerUri는 권한 부여 엔드포인트, 토큰 엔드포인트 등과 같은 구성 정보를 가져오기 위한 자격 증명 공급자의 URL을 지정합니다.

  • gapwalk-application.security.identity는 로 설정해야 합니다oauth.

  • gapwalk-application.security.claim.claims는 사용자 IDs 및 사용자 이름을 캡처하는 데 필요한 클레임 목록을 지정합니다.   예제는이 패턴의 앞부분에 있는 코드 리포지토리 섹션을 참조하세요.

  • gapwalk-application.security는 로 설정해야 합니다enabled.

  • spring.autoconfigure.exclude 인증을 활성화하려면를 제거해야 합니다.

앱 개발자

로컬 환경의 예제 코드를 Blu Age 현대화된 Angular 코드 베이스에 통합합니다.

예제를 AWS Blu Age 현대화된 Angular 코드 베이스에 통합하는 방법에 대한 자세한 내용은이 패턴의 앞부분에 있는 코드 리포지토리 섹션을 참조하세요.

앱 개발자

oauth2-ext 라이브러리를 공유 디렉터리에 배치합니다.

AWS Blu Age 현대화된 애플리케이션이 사용할 수 있도록 애플리케이션 서버의 공유 디렉터리에 oauth2-ext 라이브러리를 배치합니다. 다음 명령을 실행합니다.

cd oauth2-ext/target cp extension-oauth-filter-<version>.jar /{app-server-home}/shared/
앱 개발자
작업설명필요한 기술

프런트엔드 애플리케이션을 배포합니다.

다음 명령을 실행하여 프런트엔드 애플리케이션을 로컬에서 시작합니다.

npm install ng serve --ssl npm start
참고

ng serve 명령에 --ssl 플래그를 추가하면 개발 서버가 다른 프로토콜보다 더 안전한 HTTPS를 사용하고 프로덕션 환경을 더 잘 시뮬레이션할 수 있습니다.

앱 개발자

백엔드 애플리케이션을 시작합니다.

Eclipse에서 Tomcat 서버를 시작합니다.

앱 개발자
작업설명필요한 기술

로그인 기능을 테스트합니다.

에서 로컬로 배포된 애플리케이션에 액세스http://localhost:4200하여 사용자에게 자격 증명을 확인하라는 메시지가 표시되는지 확인합니다.

참고

HTTP는 데모용으로 사용됩니다. 프로덕션 환경 또는 기타 공개적으로 액세스할 수 있는 환경에서는 보안을 위해 HTTPS를 사용해야 합니다. 로컬 개발의 경우에도 가능하면 HTTPS를 설정하는 것이 좋습니다.

Microsoft 로그인 프롬프트가 나타나야 하며 Microsoft Entra ID로 구성된 사용자는 애플리케이션에 액세스할 수 있어야 합니다.

앱 개발자

요청에서 권한 부여 헤더를 테스트합니다.

참고

다음 단계에서는 CardDemo 애플리케이션을 예로 사용합니다. 다른 최신 애플리케이션에 대한 테스트 단계는 다양합니다.

  1. CardDemo 애플리케이션에서 트랜잭션CC00을 시작합니다.

  2. 사용자 자격 증명으로 로그인합니다. 예를 들어 AWS Blu Age 레벨 3 자기 주도형 워크숍을 사용하는 경우 자격 증명에 이름과 USER0001 암호를 사용할 수 PASSWORD 있습니다.

  3. 브라우저의 동일한 탭에서 개발자 도구 창을 엽니다.

  4. 네트워크 탭을 열고 백엔드로 전송된 요청을 확인합니다http://localhost:8080/gapwalk-application/transaction.

  5. 요청 헤더를 확인하고가 Microsoft Entra ID로 생성된 값Bearer <token><token> 값이 있는 권한 부여 헤더가 표시되는지 확인합니다.

앱 개발자

로그아웃 기능을 테스트합니다.

로그아웃하려면 종료를 선택하고 애플리케이션에 다시 액세스해 봅니다. 새 로그인 프롬프트가 표시되어야 합니다.

앱 개발자

문제 해결

문제Solution

Microsoft Entra ID에서 발급한 토큰은 Spring Boot OAuth 2.0 보안과 호환되지 않습니다.

이 문제에 대한 해결 방법은 OAuth 블로그의 Microsoft Entra ID OAuth Flow를 참조하세요. OAuth

일반적인 토큰 관련 질문.

JWT 토큰의 콘텐츠를 디코딩하고 보려면 https://jwt.io/ 웹 사이트를 사용합니다.

관련 리소스