본 테크 팁에서는 독립형 자바 클라이언트와 Java Web Start 기술을 사용하는 Java EE 애플리케이션 클라이언트에서 시큐어 Enterprise JavaBeans 컴포넌트(일명 '엔터프라이즈 빈')를 액세스하는 방법을 알아본다. 또한 여기에는 이 클라이언트들이 J2EE Management 스펙, JSR 77을 준수하는 시큐어 MEJB(Management Enterprise JavaBean)을 액세스하는 것을 설명해주는 예제도 포함되어 있다. J2EE Mnagement 스펙은 J2EE 컴포넌트의 관리 정보, 오퍼레이션, 속성 공개 및 액세스를 위한 표준 관리 모델을 제공하며, MEJB는 어떠한 표준 J2EE 애플리케이션에서도 모델에 대한 상호운용적 원격 액세스를 가능하게 해주는 기능을 제공한다.
본 팁에서는 사용자가 Sun Java System Application Server 8.x 또는 GlassFish 빌드를 사용하고 있는 것으로 가정하며, J2EE 1.4 다운로드 페이지에서 J2EE 1.4 SDK에 포함된 Sun Java Application Server 8.2 또는 8.1을 다운로드할 수 있다. GlassFish는 오픈 소스 Java EE 기반의 애플리케이션 서버로, GlassFish 커뮤니티 다운로드 페이지에서 다운로드할 수 있다.
엔터프라이즈 빈의 보안
엔터프라이즈 빈과 같은 J2EE 애플리케이션 컴포넌트의 보안은 각각의 해당 컨테이너가 담당하며, 컨테이너는 두 가지의 보안 기능, 즉 선언적 보안과 프로그램 보안을 제공한다. 선언적 보안은 보안 역할, 액세스 제어, 인증 요건 등을 포함한 애플리케이션의 보안 구조를 애플리케이션에 외부적인 형태로(즉, 배치 서술자로) 표현하고, 프로그램 보안은 애플리케이션에 내장되어 보안 결정을 내리는 데 사용된다. 특히, 프로그램 보안은 선언적 보안만으로는 애플리케이션의 보안 모델을 표현하는 데 충분치 않은 경우에 유용하다.
이 리소스의 선언적 보안을 제공하는 과정에는 배치 서술자 내에서 개별 사용자 ID 또는 사용자 그룹 ID, 즉 애플리케이션 내의 특정 리소스 세트에 대한 액세스를 허가하기 위한 추상 이름을 역할에 매핑하는 작업이 수반된다.
예를 들어, Sun Java Application Server 배치 서술자 sun-application.xml 내의 다음 요소들은 그룹 이름 'asadmin'을 보안 역할 'admin-role'에 매핑한다.
<security-role-mapping>
<role-name>admin-role</role-name>
<group-name>asadmin</group-name>
</security-role-mapping>
Sun Java System Application Server 8.x나 GlassFish 같은 애플리케이션 서버는 그룹들을 연결하는 동시에 principal(즉, 인증 가능한 개별 사용자 ID)을 생성하는 수단을 제공하는데, 이 작업은 asadmin create-file-user 명령어를 이용하여 수행할 수 있다(신택스는 다음과 같다).
asadmin create-file-user --port <port> --host <host> --user <user-id> --passwordfile <passwordfile-location> --authrealmname admin-realm --groups <admingrp> <realm-user-id>
매핑이 완료된 후, 컨테이너는 사용자가 시큐어 엔터프라이즈 빈처럼 보호되는 리소스에 액세스하는 데 필요한 허가를 받았는지 여부를 판단한다.
독립형 클라이언트의 경우, 선언적 보안은 시큐어 엔터프라이즈 빈과 통신하기에 충분치 않으므로 프로그램 보안 기능을 제공해야 한다.
시큐어 엔터프라이즈 빈을 위한 프로그램 보안
독립형 클라이언트의 프로그램 보안의 경우, 해당 클라이언트에 프로그램 로그인을 제공하는 API가 필요하다. 따라서 Sun Java System Application Server 8.x와 GlassFish는 com.sun.appserv.security.ProgrammaticLogin 클래스를 통해 이 API를 제공하는데, 이 클래스는 프로그램 로그인 오퍼레이션의 수행을 위해 관련 메소드를 공개한다. 본 팁의 예제에서는 아래의 ProgrammaticLogin 메소드를 이용하여 MEJB를 액세스한다.
public Boolean login(String user, String password);
login() 메소드는 사용자 이름과 비밀번호를 제공하는데, 이 정보는 기본 인증 렐름(즉, 동일한 인증 정책에 의해 제어되는 사용자 및 그룹의 집단)에 대한 로그인을 시도하는 데 사용된다. 인증이 성공하면(즉, 사용자의 ID가 검증되면) 사용자를 나타내는 보안 컨텍스트가 정해지고, 이로써 애플리케이션은 프로그램 방식으로 인증을 처리할 수 있게 된다.
이번에는 시큐어 엔터프라이즈 빈을 위한 프로그램 보안의 예제를 살펴보기로 하자. 본 팁에는 시큐어 MEJB에 액세스하는 독립형 클라이언트를 위한 코드가 들어 있는 패키지가 포함되어 있다. 다음은 독립형 클라이언트 코드에서 발췌한 코드의 한 부분이다.
ProgrammaticLogin pm = new ProgrammaticLogin();
pm.login(userId, password);
Context initial = new InitialContext();
Object objref = initial.lookup("ejb/mgmt/MEJB");
ManagementHome home =
(ManagementHome)PortableRemoteObject.narrow(
objref, ManagementHome.class);
Management mejb = home.create();
String domain = mejb.getDefaultDomain();
이 코드는 먼저 ProgrammaticLogin을 인스턴스화한 다음 login() 메소드에 액세스하여 사용자 ID와 비밀번호를 제공한다. login() 메소드는 클라이언트에서 엔터프라이즈 빈이 호출될 때까지 이 정보를 클라이언트 측에 캐시하고, 이어서 코드는 MEJB에 대한 액세스를 처리한다. 코드는 InitialContext를 인스턴스화한 다음 MEJB 홈 오브젝트 ejb/mgmt/MEJB의 JNDI 이름을 지정하여 ManagementHome 오브젝트를 검색한다.
이때, 독자들은 사용자 크리덴셜(또는 사용자 인증)이 어떻게 처리될지 궁금해할 수도 있을 것인데, 사용자 크리덴셜은 클라이언트가 엔터프라이즈 빈의 메소드를 호출할 때 서버에 전달된다. 메소드 호출은 IIOP/ORB 인프라에 의해 인터셉트되고 크리덴셜은 보안 컨텍스트 내에 저장된다. 호출되는 메소드가 허가를 필요로 할 경우, EJB 컨테이너는 보안 컨텍스트로부터 사용자 크리덴셜을 검색하여 검증하고, 크리덴셜이 유효하지 않을 경우 메소드는 보안 예외를 throw한다.
lookup과 narrow 메소드가 성공하면 Management 오브젝트에 대한 레퍼런스가 생성되는데, 이 작업은 ManagementHome의 create() 메소드를 호출함으로써 수행된다 -- 이는 표준 엔터프라이즈 빈 호출 프로세스의 일부이다. 이에 관한 내용은 Sun Java Application Server Platform Edition 8.1 개발자 안내서의 ACC 없이 클라이언트 개발하기 섹션에 자세히 설명되어 있다.
이제 예제 애플리케이션을 시험해 볼 차례가 되었다. 이 예제의 경우, 사용자가 included in GlassFish와 Sun Java Application Server 8.1 또는 8.2에 포함된 ant나 asant에 액세스해야 한다.
독립형 클라이언트 예제 실행하기
독립형 클라이언트는 사전 설치된 시스템 애플리케이션을 이용하여 곧바로 사용이 가능하다. 독립형 클라이언트 예제를 설치하고 실행하려면 다음을 수행한다.
- Sun Java System Application Server 8.2 또는 GlassFish가 설치되어 있는지 확인한다. 본 지침에서는 GlassFish를 사용하며, 이는 GlassFish 커뮤니티 다운로드 페이지에서 다운로드할 수 있다.
- 해당 팁의 예제 패키지를 다운로드하여 압축을 푼다. 이 때, 새로 압축이 풀린 디렉토리는
<sample_install_dir>/stand_alone_client로 표시되어야 하는데, 여기서<sample_install_dir>은 예제 패키지가 설치된 디렉토리이다. 예를 들어, Windows의C:\에 압축을 풀었다면, 새로 생성된 디렉토리는C:\stand_alone_client가 되어야 한다.stand_alone_client디렉토리에는 클라이언트와 관련한 소스 코드MEJBClient.java, 빌드 파일build.xml, 출력 파일output.txt등이 포함되어 있다.
- 다음 명령어를 입력하여 GlassFish 애플리케이션 서버를 시작한다.
<GF_install_dir>/bin/asadmin start-domain domain1
이 때,<GF_install_dir>은 GlassFish가 설치된 디렉토리이다.
- 애플리케이션 서버 설치에 필요한 경우,
build.xml파일의<user defined properties>섹션을 수정한다. 반면에build.xml의 다른 부분은 전혀 편집할 필요가 없다.
- 다음과 같이 asadmin 명령어 라인 유틸리티를 사용하여 기본 렐름 사용자를 생성한다(명령어는 포맷상의 이유로 여러 줄로 표시되었음).
<GF_install_dir>/bin/asadmin create-file-user --host <host-name> --port <admin-port-number> --user <admin-user> --passwordfile <admin-password-file-path> --groups <security-role-mapping-group-name> <realm.user.id>사용자는 다음 행을 포함하는 비밀번호를 생성해야 한다.AS_ADMIN_PASSWORD=<admin-password> AS_ADMIN_USERPASSWORD=<realm.user.password>이제--passwordfile옵션과 함께 이 파일을 패스한다.
앞서 설명한 것처럼realm.user.id and realm.user.password에 대한 값들이build.xml에 주어진 값들과 일치하고,security-role-mapping-group-name에 대한 값들이sun-application.xml에 주어진 값들과 일치하는지 확인한다. 명령어 실행에 앞서 다른 값들을 적절히 대체한다.
asadmin 명령어'list-file-users'를 사용하여 기본 렐름 사용자가 성공적으로 생성되었는지 확인한다.asadmin명령어에 관한 자세한 정보를 보려면 명령어 라인에서asadmin help를 입력하면 된다.
MEJBClient.java를 컴파일하고 실행한다.> cd stand_alone_client > ant run그러면 다음과 유사한 결과가 표시되어야 한다.run: [java] Jan 17, 2006 2:48:49 PM com.sun.corba.ee.spi. logging.LogWrapperBase doLog [java] INFO: "IOP00710299: (INTERNAL) Successfully created IIOP listener on the specified host/port: all interfaces/52185" [java] ***Got the MEJB!! [java] ***MEJB default domain = DefaultDomain ... BUILD SUCCESSFULoutput.txt파일의 내용에는 전체 결과물이 포함되어 있다.
Java Web Start 기술 예제 실행하기
본 예제에는 애플리케이션 서버에 배치될 Jave EE 애플리케이션 클라이언트가 사용되며, 또한 앞의 예제와 마찬가지로 GlassFish도 사용된다. 본 예제의 경우, JDK 5.0 또는 JRE 5.0에서만 테스트가 실시되었다.
예제를 설치하고 실행하려면 다음의 작업 절차를 따르도록 한다.
- 예제 아카이브를 다운로드한다.
- 배치 명령어를 이용하여 애플리케이션 클라이언트를 배치한다.
<GF_install_dir>/bin/asadmin deploy --host <host-name> --port <admin-port-number> --user <admin-user> --passwordfile >admin-password-file-path> ttfeb2006acc-mejbClient.jar - 애플리케이션 서버 로그(예를 들어
<GF_install_dir>/domains/domain1/log/server.txt)를 연다. 이 때, 로그 내 어딘가에 다음과 같은 링크가 표시되어야 한다.[#|2006-01-17T15:10:21.112-0800|... Java Web Start services started for stand-alone app client ... name=acc-mejbClient, context root=/ ttfeb2006acc-mejbClient, module name=|#]Java Web Start를 이용하여 애플리케이션 클라이언트를 액세스하기 위한 URL은 기본값 GlassFish 인스턴스 URL과 컨텍스트 루트(위에 표시된 행의 'Name=' 값)로 구성된다. 따라서,http://8080의 기본값 인스턴스 GlassFish URL과acc-mejbClient의 컨텍스트 루트의 경우, Java Web Start를 이용하여 애플리케이션 클라이언트를 액세스하기 위한 URL은http://localhost:8080/ttfeb2006acc-mejbClient이다.
- 본 예제는 Java Console에 출력을 디스플레이하는데, 출력을 보려면 Java Console이 표시되도록 Java Web Start를 구성해야 한다. Java Console 옵션을 구성하려면 먼저 Java Web Start의 위치를 파악하고(일반적으로
<jre-install-dir>/bin/javaws or <jre-install-dir>/bin/jws), 그런 다음 Java Web Start를 호출하여'show console'옵션을 활성화한다. 다음은 브라우저 타입과 운영체제에 따라 Java Web Start의 위치를 파악하는 방법이다.
- Windows 상의 Internet Explorer와 FireFox:
- <시작> <내 컴퓨터>를 클릭한다.
- '내 컴퓨터' 창에서 <도구> 메뉴 항목을 선택한 다음 <폴더 옵션>을 선택한다.
- '폴더 옵션' 창에서 <파일 형식> 탭을 선택한다.
- 확장명이 'JNLP'인 항목을 선택한다.
- <고급> <편집>을 클릭하고 '명령을 실행할 응용 프로그램'의 값을 확인한다. 이것이 Java Web Start의 위치이다.
- Windows/Solaris 상의 Netscape:
- Netscape 브라우저를 연다.
- <Edit> 메뉴 항목을 선택하고 <Preferences>를 선택한다.
- <Navigator> 노드를 확장하고 <Helper Applications>를 선택한다. 오른쪽에 File Types 목록이 표시되어야 한다.
- application/x-java-jnlp-file을 선택한다.
- <Edit>을 클릭하고 'Open it with'의 값을 확인한다. 이것이 Java Web Start의 위치이다.
위에서 파악한 Java Web Start의 위치를 이용하여 명령어 창에서 Java Web Start를 호출한다. 그러면 'the 'Java Application Cache Viewer' 창이 열린다.
그런 다음,
- 'Java Application Cache Viewer' 창에서
<Edit>메뉴 항목을 선택하고<Preferences>를 선택한다. 이제 'Java Control Panel'이 표시된다. <Advanced Tab>을 선택한다.<Java Console>을 확장하고<Show Console>을 선택한다.<OK>버튼을 클릭한다.
<File>메뉴 항목을 선택한 다음<Exit>를 선택하면 Java Web Start가 종료된다.
- Windows 상의 Internet Explorer와 FireFox:
- 웹 브라우저를 열고 단계 3에서 파악한 URL을 입력하면 Java Web Start가 시작된다. 이어서 사용자 ID와 비밀번호를 묻는 프롬프트가 표시된다. 프롬프트에 응답하고 나면 애플리케이션 클라이언트에 독립형 클라이언트 예제의 출력과 유사한 출력이 표시되어야 한다.
저자 소개
Sreenivas Munnangi는 Sun Java Application Server의 Administration & Management 팀 고참 멤버이다. 그는 지난 3년 동안 J2EE 그룹에 참여해 왔으며, Application Server Enterprise Edition의 설계와 구현에 크게 기여한 바 있다. 이전에는 전자 상거래 애플리케이션, 웹 애플리케이션, N-티어 애플리케이션 아키텍처 등의 분야에서 경험을 쌓기도 했다.
"Java EE" 카테고리의 다른 글
- Attach API (댓글 18개 / 트랙백 1개) 2007/09/03
- JSP 2.0 EXPRESSION LANGUAGE (댓글 1개 / 트랙백 0개) 2004/02/05
- 환경 엔트리를 이용해서 배포의 사용자 정의하기 (댓글 2개 / 트랙백 0개) 2003/12/24
- JAX-WS를 이용한 웹 서비스 개발 (댓글 1개 / 트랙백 0개) 2006/01/18
- EJB 2.1로 메시지 구동 빈 이용하기 (댓글 1개 / 트랙백 0개) 2005/05/18
- EclipseLink를 사용하여 JPA에서 반복 불가능한 읽기 방지 (댓글 0개 / 트랙백 1개) 2008/07/09
- 컴포넌트 시스템과 클래스 로더 경계 (댓글 1개 / 트랙백 0개) 2004/10/05
- JAX-WS Dispatch 및 Provider API를 이용한 문서 처리 (댓글 4개 / 트랙백 0개) 2006/09/15
- POJO를 Persistent Entity로 변환하기 (댓글 1개 / 트랙백 0개) 2005/12/27
- SAAJ 소개 (댓글 1개 / 트랙백 0개) 2005/06/08
댓글을 달아 주세요
자바에 대해 하나 하나 알아가는게 너무 재미있네요
2007/09/07 20:23늘 유익한 정보 감사합니다
좋은 정보 감사해요~
2007/09/19 04:41