웹 서비스 정책

본 장에서는 웹 서비스의 정책 설정에 대한 기본적인 개념과 함께 간단한 시나리오에 대해 설명한다. 각각의 세부적인 웹 서비스 정책 설정에 관한 내용은 이후 각 장에서 자세히 설명한다.

1. 개요

JEUS 웹 서비스는 웹 서비스 정책(WS-Policy)을 지원한다. 웹 서비스 정책이란 어떤 웹 서비스가 가지고 있는 여러 가지 기능들(JEUS 웹 서비스에서는 WS-Addressing, WS-RM, WS-TX, WS-Security)의 정책을 노출시키기 위한 표준 명세이다.

JEUS 웹 서비스에서의 웹 서비스 정책 시나리오는 크게 서버 정책과 클라이언트 정책으로 구분할 수 있다. 서버는 WSDL을 통해 웹 서비스정책을 노출시킬 수 있고, 클라이언트는 웹 서비스의 정책에 맞는 기능을 자동으로 구성한다.

웹 서비스의 각각 정책 설정은 웹 서비스 Addressing, 신뢰성 메시징 기술, 웹 서비스 트랜잭션, 웹 서비스 보안의 내용을 참고한다.

2. 웹 서비스의 정책(WS-Policy)

본 절에서는 일반적인 웹 서비스의 정책(WS-Policy)에 대해 설명한다.

일반적인 웹 서비스 정책의 특징은 다음과 같다.

  • 웹 서비스 정책 명세는 표현하기가 매우 유연하고 확장성이 있도록 설계되어 있다.

  • 웹 서비스 정책은 하나 이상의 정책 전제(policy assertion)를 통해 표현된다.

자세한 표준 웹 서비스의 정책에 관한 스키마의 내용은 http://schemas.xmlsoap.org/ws/2004/09/policy/ws-policy.xsd를 참고한다.

  • 웹 서비스 정책 프레임워크(Framework)*

다음은 웹 서비스 정책 프레임워크에 대한 설명이다.

  • 정책 컨테이너(Policy Container)

    웹 서비스 정책 프레임워크에서 가장 핵심이 되는 주요 컴퍼넌트는 "Policy"라는 element로 표현된 정책 컨테이너이다. 이 element는 ID 값을 부여받을 수 있어 다른 곳에서 이를 참조하거나 재사용할 수 있다. 또한 이 element는 전제(assertion) 또는 전제들의 조합들로 구성된다. 이러한 전제들은 정책 연산자(Operator)들로 이루어진다.

  • 정책 연산자(Operator)

    웹 서비스 정책 명세는 2개의 연산자와 하나의 속성을 정의하고 있다.

    • ExactlyOne Operator

      하위 element에 전체 또는 연산자들이 여러 개인 경우 이 중 어느 하나만을 선택하여 정책으로 가지고 있겠다는 것을 나타내기 위한 연산자이다.

      다음은 연산자 사용에 대한 예이다.

      <wsp:Policy>
          <wsp:ExactlyOne>
              <wsse:SecurityToken>
                  <wsse:Token
              ...
              <wsse:
          ...
      </wsp:Policy>
    • All Operator

      하위 element에 전체 또는 연산자들이 어러 개인 경우 이 중 모든 것을 취합하여 정책으로 가지고 있겠다는 것을 나타내기 위한 연산자이다.

      다음은 연산자 사용에 대한 예이다.

      <wsp:Policy>
          <wsp:All>
              <wsse:SecurityToken>
                  <wsse:Token
          ...
      </wsp:Policy>
    • Optional Operator

      하위 element에 전제 또는 연산자들이 이 속성으로 선언되어 있을 때 선택적으로 취할 수 있음을 나타내기 위한 연산자이다.

      다음은 연산자 사용에 대한 예이다.

      <wsp:Policy>
          <wsse:Integrity wsp:optional="true">
          ...
      </wsp:Policy>

3. 서버 정책 설정

서버의 웹 서비스 정책 설정 시나리오는 WSDL로부터 웹 서비스를 구성하는 시나리오와 Java 클래스로부터 웹 서비스를 구성하는 시나리오로 나눌 수 있다.

3.1. WSDL로부터 웹 서비스 구성

WSDL 문서로부터 웹 서비스 정책 설정이 적용된 웹 서비스를 구성하는 시나리오는 다음과 같다.

  1. WSDL 문서를 작성한다.

  2. WSDL 문서에 웹 서비스 정책 설정을 한다.

  3. wsimport 툴을 통해 Java Bean 객체들을 생성한다.

  4. 서비스 구현 클래스를 작성한다.

  5. 패키지된 서비스를 JEUS 서버에 deploy한다.

디렉터리 구조

WSDL 문서로부터 웹 서비스 정책 설정이 적용된 JEUS 웹 서비스를 패키징한다. 서버에 해당하는 웹 서비스를 WSDL 문서로부터 구성할 때의 디렉터리는 다음과 같다.

war_root
    |- WEB-INF
        |- classes
        |   |- ... (SEI, JAX-WS artifacts, Handler, Validator)
        |- wsdl
            |- addnumbers.wsdl

3.2. Java 클래스로부터 웹 서비스 구성

Java 클래스로부터 웹 서비스의 정책이 적용된 웹 서비스를 생성하기 위해서는 다음과 같이 wsgen 툴에 추가적으로 -policy 기능을 이용하여 wsit-endpoint.xml 파일을 생성해야 한다.

$ wsgen fromjava.server.AddNumbersImpl -d web/WEB-INF -policy service-config.xml

다음은 service-config.xml의 실제 모습이다. 자세한 설정 내용에 관한 것은 이어지는 각각의 여러 가지 웹 서비스 기능을 위한 장에서 자세히 살펴보기로 한다. 여기에서는 아래에 강조한 부분들을 중점적으로 살펴보기로 한다.

Java 클래스로부터 웹 서비스 구성 : <service-config.xml>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<web-services-config xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <policy>
        <!-- Endpoint 전체에 적용하고자 하는 설정 -->
        <endpoint-policy-subject>
            <addressing-policy>
                <using-addressing>true</using-addressing>
            </addressing-policy>
            <!-- Endpoint의 어느 오퍼레이션(메소드)에 적용하고자 하는 설정 -->
            <operation-policy-subject>
                <!-- 이 설정은 아래의 오퍼레이션(메소드)에 대해 적용된다 -->
                <operation-java-name>addNumbers</operation-java-name>
                <!-- 클라이언트 요청 메시지에 적용하고자 하는 설정 -->
                <input-message-policy-subject>
                    ......
                </input-message-policy-subject>
                <!-- 서버의 응답 메시지에 적용하고자 하는 설정 -->
                <output-message-policy-subject>
                    ......
                </output-message-policy-subject>
            </operation-policy-subject>
        </endpoint-policy-subject>
    </policy>
</web-services-config>

wsgen의 -policy 기능을 이용하여 웹 서비스를 위한 Java 클래스 및 wsit-endpoint.xml 파일을 얻었으면 다음과 같은 시나리오로 웹 서비스 정책이 적용된 웹 서비스를 생성한다.

  1. 서비스 구현 클래스를 작성한다.

  2. jeus-webservices-config.xsd 스키마를 통해 service-config.xml 파일을 구성한다.

  3. 구성한 서비스 구현 클래스를 wsgen 툴을 통해 웹 서비스를 생성할 때 -policy 옵션을 이용하여 wsit-endpoint.xml 파일을 생성한다.

  4. wsit-endpoint.xml 파일을 패키지될 WEB-INF 폴더 아래에 위치시킨다.

  5. 패키지된 서비스를 JEUS 서버에 deploy한다.

디렉터리 구조

Java 클래스로부터 웹 서비스의 정책이 적용된 웹 서비스를 패키징한다. 서버에 해당하는 웹 서비스를 Java 클래스로부터 구성할 때의 디렉터리는 다음과 같다.

war_root
    |- WEB-INF
          |- classes
          |    |- ... (SEI, JAX-WS artifacts, Handler, Validator)
          |- wsit-Endpoint.xml

4. 클라이언트 정책 설정

클라이언트의 웹 서비스 정책 설정은 웹 서비스 보안과 같은 시나리오 외에는 보통 필요하지 않다. JEUS 웹 서비스는 기본적으로 런타임에 원격 웹 서비스의 WSDL에 포함된 웹 서비스 정책 설정을 이해하고 자동으로 그 정책에 적합한 환경을 제공해주기 때문이다. 그러나 웹 서비스 보안과 같은 특정의 시나리오에서 추가적인 설정이 필요한 경우가 존재할 수 있다.

웹 서비스 정책이 설정되어 있는 웹 서비스에 대해 추가적인 설정이 필요한 경우 클라이언트를 구성하는 시나리오는 다음과 같다.

  1. wsimport 툴을 통해 클라이언트 Java Bean 객체들을 구성한다.

  2. 원격의 WSDL 문서를 접근 가능한 저장소에 wsit-client.xml이라는 이름으로 저장한다.

    JEUS 웹 서비스는 런타임에 원격의 WSDL에 설정되어 있는 웹 서비스 정책 설정을 통해 클라이언트 환경을 제공해주기 때문에 원격의 WSDL에 설정되어 있는 웹 서비스 정책 설정에 대한 내용은 삭제해도 된다.

  3. wsit-client.xml에 클라이언트에서 필요한 추가적인 웹 서비스 정책을 설정한다.

  4. JAR 패키징할 경우 wsit-client.xml을 패키지될 classes/META-INF 디렉터리에 위치시킨다.

    WAR 패키징할 경우 wsit-client.xml 파일을 패키지될 WEB-INF 디렉터리 아래에 위치시킨다.

  5. 패키지된 서비스를 JEUS 서버에 deploy한다.

디렉터리 구조

웹 서비스 정책 설정을 적용한 JEUS 웹 서비스를 패키징한다. 일반적으로 컨테이너에서 실행되는 웹 서비스 클라이언트는 다음과 같다.

war_root
    |- WEB-INF
    |      |- classes
    |            |- ... (client classes, JAX-WS artifacts, Handler, Validator)
    |            |- META-INF
    |                 |- wsit-client.xml
    |- index.jsp

EJB 컨테이너에서 실행되는 웹 서비스 클라이언트 또는 독립 애플리케이션으로 실행되는 웹 서비스 클라이언트는 다음과 같다.

jar_root
    |- classes
         |- ... (client classes, JAX-WS artifacts, Handler, Validator)
         |- META-INF
               |- wsit-client.xml