이 팁에서는 웹 서비스 보안에 대한 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에 대한 정보를 지정한다.

샘플 코드 실행하기

샘플 패키지가 이 팁에 제공된다. 샘플을 설치하고 실행하려면 다음 단계를 수행한다.

  1. Java EE 5 SDK 업데이트 3 프리뷰가 없으면 Java EE Downloads 페이지에서 Java EE 5 SDK 업데이트 3 프리뷰를 다운로드하여 설치한다.

  2. XWSS 프로젝트 유틸리티 페이지에서 copyv3.zip 파일을 다운로드하고 파일의 압축을 푼다. 그리고 다음을 수행한다.

    • AS_HOME 시스템 등록 정보를 Java EE 5 SDK 업데이트 3 프리뷰의 설치 위치로 설정한다.

    • copyv3 파일의 압축을 푼 디렉토리로 변경한다. build.xml 파일에서 AS_KEYSTORE_PASSWORD 등록 정보에 대한 값이 SDK 애플리케이션 서버 키 저장소에 대한 올바른 키 저장소 비밀번호인지 확인한다.

    • 다음 명령을 입력한다.

          ant

      그러면 샘플과 함께 사용할 애플리케이션 서버 키 저장소에 샘플 인증서가 복사된다.

  3. 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>

  4. 팁에 대한 샘플 패키지를 다운로드하고 해당 컨텐츠의 압축을 푼다. 이제 압축이 풀린 디렉토리가 <sample_install_dir>/ws-trust과 같이 나타난다. 여기서 <sample_install_dir>는 샘플 패키지를 설치한 디렉토리이다. 예를 들어, Windows 시스템의 C:\ 경로에 해당 컨텐츠의 압축을 풀었다면 새로 생성된 디렉토리는 C:\ws-trust이 되어야 한다.

  5. ws-trust/src/fs 디렉토리로 변경한다. build.properties 파일 집합에서 java.home을 사용자 시스템의 JDK 위치로 설정한다. glassfish.home을 Java EE 5 SDK 업데이트 3 프리뷰의 설치 디렉토리를 가리키도록 설정한다.

  6. 다음 명령을 입력하여 SDK에서 애플리케이션 서버를 시작한다.

        <SDK_HOME>/bin/asadmin start-domain domain1

  7. 다음 명령을 입력하여 샘플을 실행한다.

        ant run-sample

    다음과 같은 응답이 나타나야 한다.

        Acknowledgement : successfully deposited.

    애플리케이션 서버에 대한 로그 파일을 검사하면 메시지 흐름을 확인할 수 있다.

STS를 사용하여 샘플 코드 실행하기

  1. PingService.wsdl 파일에서 EndorsingSupportingToken 아래의 다음 행을 주석 처리한다.

        <sp:X509Token ...>
          ...
        </sp:X509Token>

    다음 행은 주석 표시를 지운다.

        <sp:IssuedToken ...>
          ....
        </sp:IssuedToken>

    이렇게 변경하면 사용자의 인증서를 사용하여 서비스에 인증하는 대신 STS를 사용하여 발행 토큰을 가져와야 한다.
  2. ws-trust/src/fs 디렉토리로 변경하고 다음 명령을 입력한다.

        ant sts

    그러면 샘플 STS가 설정된다.

  3. 다음 명령을 입력한다.

        ant run-sample

    다음과 같은 응답이 나타나야 한다.

        Acknowledgement : successfully deposited.

저자 정보

Jiandong Guo는 애플리케이션 서버 웹 서비스 보안 그룹의 시니어 멤버이자 스태프 엔지니어입니다. 그는 Tango 프로젝트에서 WS-SecureConversation 및 WS-Trust 기반의 솔루션 및 구현의 개발을 이끌어 왔습니다.

"Java EE" 카테고리의 다른 글

2007/05/28 17:32 2007/05/28 17:32

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/387

댓글을 달아 주세요

  1. 고진구  수정/삭제  댓글쓰기

    자바는 알면 알수록 재미가 있어지네요. 좋은 자료 잘 활용하겠습니다.

    2007/09/13 22:41
  2. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 03:29
  3. 김문경  수정/삭제  댓글쓰기

    유용한 정보 감사합니다

    2007/09/19 13:24
  4. 진정미  수정/삭제  댓글쓰기

    좋은 내용 많아요~~이얌..
    많이 배우고 갑니다.

    2007/09/19 23:12
[로그인][오픈아이디란?]

◀ Prev 1  ... 256 257 258 259 260 261 262 263 264  ... 626  Next ▶