이 팁에서는 웹 서비스 보안에 대한 WSIT의 지원에 초점을 맞춘다. 여기서는 WSIT 기능을 사용하여 웹 서비스 보안을 어떻게 설정하는지 알아본다. 샘플 애플리케이션 패키지가 이 팁에 제공된다. 이 팁의 코드 예제는 해당 패키지에 포함된 샘플의 소스 코드에서 따온 것이다.
이 팁의 코드 예제에서 긴 URL은 형태상의 이유로 여러 행에 배치했음을 유의해 주기 바란다. 실제 코드는 샘플 애플리케이션 패키지를 참고하기 바란다.
샘플은 Java EE 5 SDK 업데이트 3 프리뷰를 사용한다. Java EE 5 SDK 업데이트 3 프리뷰는 Java EE Downloads -- Next Release (Early Access) 페이지에서 다운로드할 수 있다.
WSIT에서의 보안 지원
WSIT는 OASIS(Organization for the Advancement of Structured Information Standards) 컨소시엄에서 게시한 여러 보안 표준을 구현한다. 여기에 포함되는 표준은 다음과 같다.
- WS-Security ? 웹 서비스에서 메시지 레벨 보안에 대한 기본 프레임워크를 제공한다.
- WS-SecurityPolicy ? 상호 운용 가능한 방식으로 웹 서비스에서 잠재적 클라이언트에게 보안 요구사항을 지정할 수 있게 한다.
- WS-SecureConversation ? WS-Security 상에 보안 세션을 삽입한다. 이렇게 하면 키 유도를 통해 전체적인 보안이 향상되고 다중 메시지 교환 시나리오에서 키 교환 반복을 방지하여 성능을 향상시킨다.
- WS-Trust ? 서로 다른 보안 도메인 간에 브로커 신뢰를 위한 프레임워크를 지정한다.
이러한 표준 구현을 통해 WSIT는 서비스 간의 안전한 통신을 가능하게 한다.
이 팁에서는 WSIT를 사용하여 웹 서비스에 대한 보안을 설정하는 방법에 대해 알아볼 것이다. 동일한 보안 도메인의 서비스에 클라이언트가 액세스할 수 있도록 WSIT에서 WS-Security 지원을 사용하는 방법에 대해 알아볼 것이다. 또한 다른 보안 도메인의 서비스에 액세스하기 위해 WSIT에서 WS-Trust 지원을 사용하는 방법도 알아볼 것이다.
보안 정책 생성하기
WSIT를 사용하여 웹 서비스에 대한 보안을 활성화하려면 서비스에 대한 WSDL(Web Services Definition Language) 파일에 보안 정책을 생성하여 첨부해야 한다. WSDL 파일은 웹 서비스와 그 위치, 그리고 해당 서비스가 노출하는 작업을 설명하는 XML 파일이다.
일반적으로, 웹 서비스 보호를 위해 생성해야 하는 보안 정책은 바인딩 레벨 정책과 작업 레벨 정책의 두 가지 유형이 있다. 먼저 바인딩 레벨 정책에 대해 살펴보겠다.
바인딩 레벨 정책
바인딩 레벨 정책은 웹 서비스 메시지의 보호에 필요한 클라인언트 자격 증명 및 서비스의 유형을 지정한다. 이 팁과 함께 제공된 샘플 패키지에는 JAX-WS 기반 웹 서비스, IFinancialService 및 해당 서비스에 대한 WSDL 파일(PingService.wsdl)이 제공된다. WSDL 파일에서 샘플에 대한 바인딩 레벨 정책을 찾을 수 있다.
다음은 샘플에 사용된 바인딩 레벨 정책의 일부이다.
<wsp:Policy wsu:Id="IFinancialService_policy"> <wsp:ExactlyOne> <wsp:All> <sp:SymmetricBinding xmlns: sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:ProtectionToken> <wsp:Policy> <sp:X509Token sp:IncludeToken= "http://schemas.xmlsoap.org/ws/2005/07/ securitypolicy/IncludeToken/Never"> <wsp:Policy> <sp:RequireDerivedKeys/> <sp:RequireThumbprintReference/> <sp:WssX509V3Token10/> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:ProtectionToken> ... </sp:SymmetricBinding> <sp:EndorsingSupportingTokens xmlns: sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <wsp:Policy> <sp:X509Token sp:IncludeToken= "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/ IncludeToken/AlwaysToRecipient"> <wsp:Policy> <sp:RequireThumbprintReference /> <sp:WssX509V3Token10 /> </wsp:Policy> </sp:X509Token> </wsp:Policy> </sp:EndorsingSupportingTokens> <wsap10:UsingAddressing/> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
<wsp:Policy> 요소는 이 정책의 루트 요소이다. 이 정책에는 인증에 지원되는 토큰 유형을 지정하는 여러 정책 논리식과, 메시지 암호화 및 디지털 서명 방식이 포함된다.
두 개의 <sp:X509Token> 요소를 주목해 본다. 이들은 X509Token 논리식이다. 이들 중 첫 번째 논리식은 ProtectionToken 아래에 있고, 이 토큰은 SymmetricBinding 아래에 있다. 이 논리식은 클라이언트에 서비스를 인증하고 메시지를 보호하기 위해 서비스의 X509 인증서가 필요하다고 지정한다. 두 번째 X509Token 논리식은 EndorsingSupportingToken 아래에 있다. 이 논리식은 클라이언트가 서비스에 인증하기 위해 클라이언트의 X509 인증서가 필요하다고 지정한다. 여기서 클라이언트와 서비스 사이에는 신뢰 관계가 있다. 서비스는 인증서에 표시되는 대로 클라이언트의 신원을 확인한다.
X509 인증서 기반 인증을 지원할 뿐 아니라 WSIT는 사용자 이름/비밀번호 및 논리식 기반 인증을 지원한다.
클라이언트와 서비스가 서로 다른 보안 도메인에 있으면 이들은 직접적인 신뢰 관계가 없다. 이 경우 STS(Security Token Service)라는 신뢰 권한을 사용하여 클라이언트를 인증할 수 있다. 또한 WS-Trust 표준에 지정된 대로 STS를 사용하여 클라이언트가 서비스에 액세스하는 데 필요한 보안 토큰을 발행할 수도 있다. 클라이언트와 서비스는 STS를 신뢰한다. STS 기반 인증을 WSIT와 함께 사용하려면 클라이언트를 서비스에 직접 인증하기 위한 프로세스와 유사한 프로세스를 수행해야 한다. 이 바인딩 정책은 이전 예제의 것과 거의 동일하다. 유일한 차이는 두 번째 X509Token에 있다. 해당 논리식은 클라이언트가 보안 토큰을 얻기 위해 먼저 STS를 호출하도록 변경해야 한다. 보안 토큰은 일반적으로 SAML(Security Assertion Markup Language) 토큰이다. 다음은 변경된 X509Token의 모양이다.
<sp:IssuedToken sp:IncludeToken= "http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/ IncludeToken/AlwaysToRecipient"> <sp:Issuer> <Address xmlns="http://www.w3.org/2005/08/addressing"> http://localhost:8080/jaxws-sts/sts </Address> <Metadata xmlns= "http://schemas.xmlsoap.org/ws/2004/09/mex"> <MetadataSection> <MetadataReference> <Address xmlns= "http://www.w3.org/2005/08/addressing"> http://localhost:8080/jaxws-sts/sts </Address> </MetadataReference> </MetadataSection> </Metadata> </sp:Issuer> </sp:IssuedToken>
변경된 X509Token의 첫 번째 <Address> 요소는 STS의 끝점을 지정한다. <Metadata> 요소 아래에 있는 두 번째 <Address> 요소는 표준 WS-MEX(WS MetadataExchange) 프로토콜을 사용하여 STS의 WSDL을 가져오기 위한 주소를 지정한다.
작업 레벨 정책
일반적으로 작업 레벨 정책은 작업을 위한 메시지의 어느 부분을 암호화 또는 디지털 서명할 것인지 지정하는 데 사용된다. 다음은 샘플에 대한 작업 레벨 정책이다. 이 정책은 PingService.wsdl 파일에서 찾을 수 있다.
<wsp:Policy wsu:Id="IFinancialService_Input_policy"> <wsp:ExactlyOne> <wsp:All> <sp:SignedParts xmlns: sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <sp:Body/> <sp:Header Name="To" Namespace="http://www.w3.org/2005/08/addressing"/> <sp:Header Name="From" Namespace="http://www.w3.org/2005/08/addressing"/> <sp:Header Name="FaultTo" Namespace="http://www.w3.org/2005/08/addressing"/> <sp:Header Name="ReplyTo" Namespace="http://www.w3.org/2005/08/addressing"/> <sp:Header Name="MessageID" Namespace="http://www.w3.org/2005/08/addressing"/> <sp:Header Name="RelatesTo" Namespace="http://www.w3.org/2005/08/addressing"/> <sp:Header Name="Action" Namespace="http://www.w3.org/2005/08/addressing"/> </sp:SignedParts> <sp:EncryptedParts xmlns: sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy"> <sp:Body/> </sp:EncryptedParts> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
이 정책은 본문 및 지정된 헤더를 서명하고 본문을 암호화하도록 지정한다.
웹 서비스 배포하기
정규 JAX-WS 기반 웹 서비스와 동일한 방식으로 WSIT 보안이 구현된 웹 서비스를 빌드 및 배포할 수 있다. JAX-WS 기반 웹 서비스 빌드 방법에 대한 자세한 내용은 JAX-WS를 사용하여 웹 서비스 개발하기 팁을 참조하기 바란다.
클라이언트 생성하기
웹 서비스를 배포한 후에는 클라이언트 프로그램에서 이 서비스에 액세스할 수 있다. JAX-WS 기반 웹 서비스에 액세스하는 클라이언트의 빌드 단계는 JAX-WS를 사용하여 웹 서비스 개발하기 팁에 설명되어 있다. 하지만 WSIT를 통해 보호된 웹 서비스에 액세스하는 클라이언트를 빌드하려면 클라이언트에 대한 보안을 구성해야 한다.
클라이언트에 대한 보안 정보 구성하기
클라이언트에 대한 보안을 구성하려면 wsit-client.xml이라는 파일에 보안 관련 정보를 지정해야 한다. WSDL 문서가 포함된 이 파일은 여러 로컬 보안 정책을 지정한다.
독립형 클라이언트인 FinancialServiceClient.java는 샘플에 포함되어 있다. 다음은 wsit-client.xml 파일에서 클라이언트에 대한 보안 구성이다.
<wsp:Policy wsu:Id="ClientKeystorePolicy" xmlns:sc="http://schemas.sun.com/2006/03/wss/client" xmlns:wspp="http://java.sun.com/xml/ns/wsit/policy" xmlns:scc="http://schemas.sun.com/ws/2006/05/sc/client" > <wsp:ExactlyOne> <wsp:All> <sc:KeyStore wspp:visibility="private" location="$WSIT_HOME/xws-security/etc/client-keystore.jks" type="JKS" alias="alice" storepass="changeit"> </sc:KeyStore> <sc:TrustStore wspp:visibility="private" location="$WSIT_HOME/xws-security/etc/ client-truststore.jks" type="JKS" storepass="changeit" peeralias="bob"> </sc:TrustStore> <tc:PreconfiguredSTS xmlns:tc="http://schemas.sun.com/ws/2006/05/trust/client" endpoint="http://localhost:8080/jaxws-sts/sts" wsdlLocation="http://localhost:8080/jaxws-sts/sts?wsdl" serviceName="SecurityTokenService" portName="ISecurityTokenService_Port" namespace="http://tempuri.org/"> </tc:PreconfiguredSTS> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
이 샘플 로컬 정책은 인증서 키 저장소와 함께 로컬 STS에 대한 정보를 지정한다.
샘플 코드 실행하기
샘플 패키지가 이 팁에 제공된다. 샘플을 설치하고 실행하려면 다음 단계를 수행한다.
- Java EE 5 SDK 업데이트 3 프리뷰가 없으면 Java EE Downloads 페이지에서 Java EE 5 SDK 업데이트 3 프리뷰를 다운로드하여 설치한다.
- XWSS 프로젝트 유틸리티 페이지에서
copyv3.zip파일을 다운로드하고 파일의 압축을 푼다. 그리고 다음을 수행한다.
AS_HOME시스템 등록 정보를 Java EE 5 SDK 업데이트 3 프리뷰의 설치 위치로 설정한다.
copyv3파일의 압축을 푼 디렉토리로 변경한다.build.xml파일에서AS_KEYSTORE_PASSWORD등록 정보에 대한 값이 SDK 애플리케이션 서버 키 저장소에 대한 올바른 키 저장소 비밀번호인지 확인한다.
- 다음 명령을 입력한다.
ant
그러면 샘플과 함께 사용할 애플리케이션 서버 키 저장소에 샘플 인증서가 복사된다.
WSIT_HOME시스템 등록 정보를 설정한다.
- 텍스트 편집기에서
<SDK_HOME>/domains/domain1/config/domain.xml파일을 연다. 여기서<SDK_HOME>은 Java EE 5 SDK 업데이트 3 프리뷰를 설치한 위치이다.
- 다음 JVM 옵션을 추가한다.
<jvm-options>-DWSIT_HOME=${com.sun.aas.installRoot}</jvm-options><jvm-options>-Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true</jvm-options><jvm-options>Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true</jvm-options>
- 텍스트 편집기에서
- 팁에 대한 샘플 패키지를 다운로드하고 해당 컨텐츠의 압축을 푼다. 이제 압축이 풀린 디렉토리가
<sample_install_dir>/ws-trust과 같이 나타난다. 여기서<sample_install_dir>는 샘플 패키지를 설치한 디렉토리이다. 예를 들어, Windows 시스템의C:\경로에 해당 컨텐츠의 압축을 풀었다면 새로 생성된 디렉토리는C:\ws-trust이 되어야 한다.
ws-trust/src/fs디렉토리로 변경한다.build.properties파일 집합에서java.home을 사용자 시스템의 JDK 위치로 설정한다.glassfish.home을 Java EE 5 SDK 업데이트 3 프리뷰의 설치 디렉토리를 가리키도록 설정한다.
- 다음 명령을 입력하여 SDK에서 애플리케이션 서버를 시작한다.
<SDK_HOME>/bin/asadmin start-domain domain1
- 다음 명령을 입력하여 샘플을 실행한다.
ant run-sample
다음과 같은 응답이 나타나야 한다.Acknowledgement : successfully deposited.
애플리케이션 서버에 대한 로그 파일을 검사하면 메시지 흐름을 확인할 수 있다.
STS를 사용하여 샘플 코드 실행하기
PingService.wsdl파일에서EndorsingSupportingToken아래의 다음 행을 주석 처리한다.<sp:X509Token ...>...</sp:X509Token>
다음 행은 주석 표시를 지운다.<sp:IssuedToken ...>....</sp:IssuedToken>
이렇게 변경하면 사용자의 인증서를 사용하여 서비스에 인증하는 대신 STS를 사용하여 발행 토큰을 가져와야 한다.
ws-trust/src/fs디렉토리로 변경하고 다음 명령을 입력한다.ant sts
그러면 샘플 STS가 설정된다.
- 다음 명령을 입력한다.
ant run-sample
다음과 같은 응답이 나타나야 한다.Acknowledgement : successfully deposited.
저자 정보
Jiandong Guo는 애플리케이션 서버 웹 서비스 보안 그룹의 시니어 멤버이자 스태프 엔지니어입니다. 그는 Tango 프로젝트에서 WS-SecureConversation 및 WS-Trust 기반의 솔루션 및 구현의 개발을 이끌어 왔습니다.
"Java EE" 카테고리의 다른 글
- EJB 3.0 인터셉터(Interceptor) (댓글 5개 / 트랙백 0개) 2007/02/22
- Java WSDP 2.0 기반의 웹 서비스를 Java EE 5에 포팅하기 (댓글 2개 / 트랙백 0개) 2006/06/16
- JAXB 라이브러리로 오브젝트 나열하기 (댓글 1개 / 트랙백 0개) 2005/02/03
- 현지화된 메시지 로깅 (댓글 23개 / 트랙백 3개) 2007/09/03
- 엔터프라이즈 빈을 이용한 타이머 사용 (댓글 2개 / 트랙백 0개) 2005/02/03
- JAX-WS를 이용한 웹 서비스 개발 (댓글 1개 / 트랙백 0개) 2006/01/18
- JAVASERVER FACES 기술과 사용자 정의 컴포넌트 (댓글 1개 / 트랙백 0개) 2004/12/15
- 파인더 메소드와 EJB-QL (댓글 2개 / 트랙백 0개) 2003/08/25
- Java Persistence를 최상으로 구현하는 방법 (댓글 12개 / 트랙백 0개) 2007/07/23
- JAX-WS에서 핸들러 작성하기 (댓글 2개 / 트랙백 0개) 2006/08/10
댓글을 달아 주세요
자바는 알면 알수록 재미가 있어지네요. 좋은 자료 잘 활용하겠습니다.
2007/09/13 22:41좋은 정보 감사해요~
2007/09/19 03:29유용한 정보 감사합니다
2007/09/19 13:24좋은 내용 많아요~~이얌..
2007/09/19 23:12많이 배우고 갑니다.