웹 서비스는 XML 및 HTTP와 같은 새로운 기술과 표준의 등장과 함께 인터넷 혁신 분야에서 확고한 위치를 차지하고 있다. 그런데 혁신은 어디서 시작되었을까?
웹 서비스의 기본 개념은 1960년대 중반 미국에서 시작되었다. 철도와 배송 회사와 같은 운송 산업에서는 컴퓨터 사이의 전자적 데이터 교환이라는 새로운 개념을 도입했으며 이 개념이 이후에 EDI(Electronic Data Interchange)로 발전했다. 필자는 1980년대에 경영 대학원 교수로부터 EDI에 대해 처음 들었다.
1996에 미국 NIST(National Institute of Standards and Technology)에서는 FIPS PUB(Federal Information Processing Standards Publication) 161-2에서 EDI(Electronic Data Interchange)에 대한 표준을 발표했다. 발행된 서적에 따르면 EDI는 엄격하게 형식화된 메시지의 컴퓨터 간 교환이다. 수신되는 메시지의 처리는 컴퓨터에 의해서만 수행되며 일반적으로 사용자의 해석이 필요하지 않다. 이것이 웹 서비스에 대한 모든 내용이다. 단, 1960년대 중반에는 웹 서비스가 XML, 인터넷 또는 월드 와이드 웹의 지원을 받지 못했다.
웹 서비스에 그다지 익숙하지 않은 사용자를 위해 웹 서비스의 정의 및 주요 컴포넌트에 대해 간단하게 설명한다.
웹 서비스는 W3C(World Wide Web Consortium)에서 정의한 SOAP(Simple Object Access Protocol) 메시지를 사용하여 네트워크를 통해 컴퓨터 자원 간 상호운용 가능한 시스템 대 시스템 상호작용을 지원하는 소프트웨어 시스템이다.
SOAP(Simple Object Access Protocol)는 분산 네트워크 환경에서 구조화되고 유형화된 메시지를 교환하는 데 사용하는 단순하고 확장 가능한 프로토콜이다. SOAP 메시지의 형식은 ISO(International Organization for Standardization) 8879:1986에 의해 개발된 SGML(Standard Generalized Markup Language)에서 파생된 단순하고 유연한 텍스트 형식인 XML(Extensible Markup Language)로 작성된다.
WSDL(Web Services Description Language)은 웹 서비스의 인터페이스를 기술하는 XML 기반 언어이다.
잘못된 SOAP 메시지가 교환되면 어떤 일이 발생할까? 잘못된 SOAP 메시지가 눈에 띄지 않게 처리되어 의사결정권자에 대한 정보를 생성하는 데 사용되면 어떤 일이 발생할까?
실제로는 SOAP 메시지에 있는 데이터가 올바른지 알 수 없다. 적어도 인터페이스 정의 또는 WSDL을 검색하여 SOAP 메시지가 올바른지 여부를 확인할 수는 있다.
실제로 SOAP 메시지의 문제점을 디버깅하는 것은 매우 힘든 작업이다. SOAP 메시지에 문제가 있는 경우에는 웹 서비스 서버로부터 HTTP 응답 코드: 500이 수신된다. 웹 서비스 서버는 SOAP 메시지에서 문제가 있는 부분에 대한 자세한 정보를 제공하지는 않는다. 웹 서비스 서버로부터 오류 메시지가 없는 올바른 SOAP 응답 메시지를 수신했지만 사용자와 웹 서비스 서버 둘 다 SOAP 요청 및 응답 메시지에서 문제점을 인식하지 못하는 더 좋지 않은 상황이 발생할 수도 있다. 예를 들어, 특정 시점의 B사 주식 시세를 요청하지만 태그의 철자를 잘못 기입한 상태로 SOAP 메시지를 웹 서비스 서버에 전송하면 웹 서비스 서버는 철자가 잘못된 태그를 무시하고 SOAP 응답 메시지에 A사의 주식 시세와 같은 기본값을 제공할 수 있다. 이 문제를 인식하지 못하면 엄청난 문제가 발생할 수 있다.
WSDL 및 SOAP용 웹 서비스 유효성 검증 도구로 이러한 유형의 문제점을 훨씬 먼저 예방할 수 있다. 웹 서비스 애플리케이션이 전개되기 전에도 WSDL(Web Service Definition Language)로 SOAP 메시지를 유효성 검증할 수 있다. 이 도구는 WSDL로 SOAP 메시지를 분석, 구문 분석 및 유효성 검증하고 자세한 오류 메시지 및 행 번호를 사용하여 문제점을 정확하게 지적한다. 더이상 복잡한 HTTP 응답 코드: 500을 수신하지 않는다. SOAP 메시지가 암호화되어 있는가? 걱정할 것 없다. 이 도구는 SOAP 메시지를 암호 해독하고 암호 해독된 SOAP 메시지를 유효성 검증한다.
이 도구는 전세계에서 클라이언트가 보고하는 IBM® WebSphere Application Server에 대한 웹 서비스 관련 문제점을 해결하는 IBM 웹 서비스 지원 팀을 돕기 위해 작성되었다. 이 도구는 SOAP 메시지를 유효성 검증할 수 있다. SOAP 메시지가 암호화된 경우 이 도구는 SOAP 메시지를 암호 해독한 후 암호 해독된 메시지를 유효성 검증한다. SOAP 메시지에 디지털 서명이 되어 있는 경우 이 도구는 서명을 확인한다. WSDL 및 SOAP용 웹 서비스 유효성 검증 도구를 사용하여 SOAP 메시지를 웹 서비스 서버에 전송하고 응답 SOAP 메시지를 수신할 수도 있다. 이 도구는 개발 주기 초기에 이 도구를 사용함으로써 프로덕션에서 문제가 발생하는 경우 해결 시간을 줄여 프로덕션 문제를 예방하는 것을 지원하기 위해 작성되었다.
여기서는 매우 단순한 웹 서비스를 빌드한다. 먼저 단순한 Java™ 애플리케이션을 작성한다. Java 애플리케이션이 정상적으로 작동하는지 확인한 후 IBM Rational® Application Developer for WebSphere® Software를 사용하여 웹 서비스를 생성한다. 그런 다음 생성되는 웹 서비스에서 일부 변경사항을 작성한다. 마지막으로 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구를 사용하여 SOAP 메시지를 작성, 유효성 검증, 전송 및 수신한다.
IBM Rational Application Developer for WebSphere Software를 사용하여 단순한 웹 서비스를 빌드할 수 있다. 웹 서비스는 두 가지 방법으로 빌드할 수 있다.
- 웹 서비스 구현 Java™ 클래스가 WSDL에서 생성되는 하향식 개발
- 웹 서비스가 Java Bean 또는 엔터프라이즈 Java Bean에서 생성되는 상향식 개발
다음 예제에서는 상향식 개발을 사용한 웹 서비스 구현에 대해 설명한다. 먼저 단순한 Java 애플리케이션을 빌드한다. 그런 다음 IBM Rational Application Developer for WebSphere Software를 사용하여 Java 애플리케이션에서 상향식 Java Bean 웹 서비스를 생성한다.
먼저, 시작하는 Java 애플리케이션을 작성한다. 이름이 제공되지 않은 경우에는 애플리케이션에서 "Hello, buddy!"를 리턴한다. 이름이 제공된 경우 애플리케이션은 "Hello," 뒤에 사용자의 이름이 있는 문자열을 리턴한다. 다음은 패키지 데모에 있는 Java 애플리케이션 DemoWebService이다. hello() 메소드는 사용자 이름을 기반으로 문자열을 리턴한다.
Listing 1. DemoWebService.java
/*
* @author: Jinwoo Hwang
* Copyright 2010 IBM Corporation
*/
package demo;
public class DemoWebService {
public String hello(String name) {
if (name == null)
return "Hello, buddy!";
else
return "Hello, " + name + "!";
}
}
|
Java 애플리케이션에서 웹 서비스를 작성하기 전에 Java 애플리케이션을 테스트하는 것이 매우 중요하다. main() 메소드로 클래스를 작성하여 애플리케이션을 실행할 수 있다. 테스트 코드를 작성하지 않고 신속하게 테스트를 수행하기 위해 IBM Rational Application Developer v7에서 제공하는 Universal Test Client를 활용할 수도 있다. Java 클래스의 컨텍스트 메뉴에서 Universal Test Client를 클릭하여 Test Client를 실행하기만 하면 된다.
- Universal Test Client에서 Objects > DemoWebService를 펼친다.
- hello 메소드를 선택한다.
- 문자열 또는 사용자 이름을 Value 필드에 입력한 후 Invoke를 클릭한다.
그림 1. Universal Test Client
널(null) 매개변수로 테스트하여 무슨 일이 발생하는지 확인할 수도 있다. 널(null) 매개변수가 hello() 메소드에 전달되면 예상대로 "Hello, buddy!"가 리턴된다.
그림 2. 널(null) 매개변수가 포함된 Universal Test Client
지금까지는 아무 문제 없이 진행되었다. 이제는 상향식 웹 서비스 개발 방법을 사용하여 Java 클래스에서 웹 서비스를 생성한다.
- Java 애플리케이션 DemoWebService를 선택하고 IBM Rational Application Developer에서 새 웹 서비스를 작성한다.
그림 3. 새 XML 웹 서비스 작성하기
- Java 클래스를 작성했으므로 Web service type으로 Bottom up Java bean Web service를 선택한다. Start client를 선택한 후 Finish를 클릭한다. EJB(Enterprise Bean) 클래스가 있는 경우에는 Java EJB를 작성하여 웹 서비스를 생성할 수도 있다.
그림 4. 서비스 구현 선택하기
모든 것이 제대로 수행되면 Java Resources에서 DemoWebService.java 바로 다음에 DemoWebServiceDelegate.java가 생성된다.
그림 5. DemoWebService.java
DemoWebServiceDelegate.java를 살펴보면 DemoWebServiceDelegate 클래스에서 targetNamespace, serviceName 및 portName을 지정하는 Java 웹 서비스 어노테이션 @javax.jws.WebService를 찾을 수 있다. DemoWebService의 인스턴스가 작성되고 또다른 메소드인 hello()가 DemoWebService의 hello() 메소드에서 정의된다. Java 웹 서비스 어노테이션에 대해 자세히 살펴보려면 JSR(Java Specification Request) 181: Java 플랫폼용 웹 서비스 메타데이터를 참조한다.
Listing 2. DemoWebServiceDelegate.java
/*
* @author: Jinwoo Hwang
* Copyright 2010 IBM Corporation
*/
package demo;
@javax.jws.WebService(targetNamespace = "http://demo/",
serviceName = "DemoWebServiceService",
portName = "DemoWebServicePort")
public class DemoWebServiceDelegate {
demo.DemoWebService _demoWebService = new demo.DemoWebService();
public String hello(String name) {
return _demoWebService.hello(name);
}
}
|
클라이언트 프로젝트에서는 DemoWebServiceService.wsdl 및 DemoWebServiceService_schema1.xsd도 생성된다. DemoWebServiceService.wsdl에는 이전에 빌드한 Java 애플리케이션에 대한 네트워크 서비스를 설명하는 WSDL(Web Service Definition Language)이 포함되어 있다. DemoWebServiceService_schema1.xsd에는 SOAP 메시지에 사용되는 날짜 유형의 구조에 대해 설명하는 XML 스키마가 포함되어 있다.
그림 6. DemoWebServiceService.wsdl
DemoWebServiceService.wsdl을 살펴보면 루트에 정의 요소 세트가 있다는 것을 알 수 있다. 정의 요소 내부에서는 다음과 같은 6개의 요소를 찾을 수 있다.
- 유형
- 메시지
- 포트 유형
- 바인딩
- 서비스
- 포트
유형: 메시지 교환에 사용되는 데이터 유형을 정의한다. DemoWebServiceService.wsdl에서는 WSDL 파일에서 데이터 유형을 정의하는 대신 DemoWebServiceService_schema1.xsd를 가져온다.
메시지: 교환되는 메시지를 정의한다. "hello"와 "helloResponse"라는 두 가지 메시지가 있다. hello 메시지에는 "parameters"라는 부분이 있다. 이 부분에는 "tns:hello" 요소가 있다. helloResponse 메시지에는 hello의 경우와 동일하게 "parameters"라는 부분이 있다. 이 부분에는 "tns:helloResponse" 요소가 있다. hello 및 helloResponse 요소는 DemoWebServiceService_schema1.xsd에 정의되어 있다. 곧 이 내용에 대해 살펴볼 것이다.
포트 유형: 엔드포인트에서 지원하는 오퍼레이션이다. 오퍼레이션은 입력 메시지와 출력 메시지를 제공한다. 입력 메시지 "tns:hello"와 출력 메시지 "tns:helloResponse"로 구성된 "hello"라는 오퍼레이션이 있다. 이 오퍼레이션은 요청-응답 전송이다. WSDL은 엔드포인트에 대해 4가지 다른 전송 기본 요소를 제공한다.
- 단방향
- 요청-응답
- 요청(solicit)-응답
- 알림
단방향 전송에서는 엔드포인트가 메시지를 수신하기만 한다. 요청-응답 전송에서는 엔드포인트가 메시지를 수신한 후 해당되는 메시지를 전송한다. 요청(solicit)-응답에서는 엔드포인트가 메시지를 전송한 후 해당되는 메시지를 수신한다. 알림 전송에서는 엔드포인트가 메시지를 전송하기만 한다.
바인딩: 포트 유형에 의해 정의된 오퍼레이션과 메시지에 대한 프로토콜 세부사항 및 메시지 형식 스펙을 정의한다. 스타일 속성에 대한 "문서"가 있다. 스타일 속성은 두 가지 다른 스타일의 메시지(rpc와 문서)를 제공한다. rpc 스타일에서는 메시지에 매개변수와 리턴값이 포함되어 있다. 문서 스타일에서는 메시지에 문서가 포함되어 있다. 전송 속성의 값에는 SOAP 전송을 위한 URI가 포함되어 있다. http://schemas.xmlsoap.org/soap/http는 SOAP 스펙에서 HTTP 바인딩을 사용할 것임을 의미한다. soapAction 속성에 SOAP의 HTTP 바인딩에 대한 SOAPAction HTTP 헤더의 URI를 지정한다. SOAP의 HTTP 프로토콜 바인딩을 사용하기 때문에 soapAction 속성의 값은 필수이다. soapAction 속성에 대해 비어 있는 문자열 ""를 사용한다. soap:body 요소는 SOAP 메시지의 본문 요소 내부에서 메시지 파트를 결합하는 방법을 지정한다. 사용 속성은 2가지 서로 다른 옵션(리터럴과 인코딩됨)을 제공한다. 여기서는 리터럴을 사용하며 이는 요소 또는 유형 속성을 사용하는 구체적인 스키마 정의를 선택함을 의미한다. 인코딩됨을 사용하는 경우에는 인코딩 규칙이 포함된 추상 유형을 사용한다.
서비스: 관련 포트 세트를 정의한다.
포트: 바인딩의 네트워크 주소를 지정하여 통신 엔드포인트를 정의한다.
http://localhost:9081/HelloWorldWSProject/DemoWebServiceService는 SOAP 엔드포인트의 주소이다.
Listing 3. DemoWebServiceService.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="DemoWebServiceService" targetNamespace="http://demo/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://demo/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<types>
<xsd:schema>
<xsd:import namespace="http://demo/"
schemaLocation="DemoWebServiceService_schema1.xsd" />
</xsd:schema>
</types>
<message name="hello">
<part element="tns:hello" name="parameters" />
</message>
<message name="helloResponse">
<part element="tns:helloResponse" name="parameters" />
</message>
<portType name="DemoWebServiceDelegate">
<operation name="hello">
<input message="tns:hello" />
<output message="tns:helloResponse" />
</operation>
</portType>
<binding name="DemoWebServicePortBinding" type="tns:DemoWebServiceDelegate">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<operation name="hello">
<soap:operation soapAction="" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<service name="DemoWebServiceService">
<port binding="tns:DemoWebServicePortBinding" name="DemoWebServicePort">
<soap:address
location=
"http://localhost:9081/HelloWorldWSProject/DemoWebServiceService" />
</port>
</service>
</definitions>
|
DemoWebServiceService.wsdl에서 DemoWebServiceService_schema1.xsd를 가져온다. 이제 DemoWebServiceService_schema1.xsd를 살펴본다. DemoWebServiceService_schema1.xsd는 구조에 대해 설명하고 XML 문서의 컨텐츠를 제한하기 위해 XML 스키마 정의 언어로 작성되어 있다. hello와 helloResponse라는 두 개의 요소가 있다. 각 요소에는 유형이 있다. hello 유형에는 문자열인 "arg0" 요소가 있다. "arg0" 요소는 선언에 있는 minOccurs 속성의 값이 0이기 때문에 선택사항이다. minOccurs 속성에 1 이상의 값이 사용되면 요소가 나타나야 한다. helloResponse 유형의 “return” 요소의 경우에도 동일하다.
Listing 4. DemoWebServiceService_schema1.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="http://demo/" version="1.0" xmlns:tns="http://demo/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="hello" type="tns:hello" /> <xs:element name="helloResponse" type="tns:helloResponse" /> <xs:complexType name="hello"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string" /> </xs:sequence> </xs:complexType> <xs:complexType name="helloResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:schema> |
WSDL 및 SOAP용 웹 서비스 유효성 검증 도구 시작하기
지금까지는 WSDL과 스키마에 대해 살펴봤다. 이제는 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구에서 웹 서비스를 호출할 수 있도록 웹 서비스 서버를 시작한다.
WSDL 및 SOAP용 웹 서비스 유효성 검증 도구를 실행하려면 W3C(World Wide Web Consortium)의 XML 암호화 구문 및 처리 스펙(http://www.w3.org/TR/xmlenc-core/)을 기반으로 한 XML 디지털 암호화 및 Java 6 이상의 런타임 해독 API와 Java 6 이상의 런타임 환경이 필요하다.
IBM Java 6에서는 JSR 106: XML 디지털 암호화 API의 구현을 제공한다. IBM Java 6가 있는 경우에는 진행할 준비가 되어 있으므로 다른 항목을 설치하지 않아도 된다.
Java 6 런타임 환경(예: Sun Microsystems™ Java 6)을 가지고 있을 때 이 환경에서 XML 디지털 암호화 API를 제공하지 않는 경우에는 JSR 106 또는 http://santuario.apache.org/에서 확보할 수 있는 Apache™ XML Security 버전 1.4.3을 구현하는 라이브러리를 설치해야 한다. 바이너리 배포판의 사본을 다운로드하여 디렉토리에 압축 해제한 후 –vmargs 및 –DAXS 명령행 옵션을 사용하여 디렉토리 위치를 도구에 알려주기만 하면 된다.
이 기사 작성 시 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구는 XML 디지털 암호화 및 암호 해독을 위한 Apache XML Security 버전 1.4.3 및 JSR 106을 지원한다. SOAP 메시지에서 디지털 서명을 확인하려면 JSR 105: XML 디지털 서명 API를 구현하는 라이브러리가 필요하다. 다행히 Sun Microsystems와 IBM의 Java 6 가상 시스템은 JSR 105의 구현을 제공한다. 왜냐하면 Java 6를 최소 Java 런타임 환경으로 선택했기 때문이다. Java 6에서 JSR 105를 구현하는 라이브러리를 제공하지 않는 경우에는 JSR 105를 지원하는 라이브러리를 찾아야 한다.
http://www.alphaworks.ibm.com/tech/wsvt에서 무료로 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구의 사본을 다운로드할 수 있다. 설치는 매우 단순하다. 패키지를 디렉토리에 압축 해제한 후 wsvt.exe를 실행하면 된다. 기본 Java 가상 시스템이 XML 디지털 서명과 디지털 암호화 및 암호 해독을 지원하는 Java 6가 아닌 경우에는 -vm 옵션을 사용하여 Java 6의 위치를 지정해야 한다. 예제는 다음과 같다.
wsvt –vm c:\IBMjava6\bin\java.exe
IBM Java 6가 있는 경우에는 다른 항목을 설치하지 않아도 된다. 필요한 모든 항목이 IBM Java 6에 포함되어 있다. Sun Microsystems의 Java 6가 있는 경우에는 암호화된 SOAP 메시지를 암호 해독하려면 Apache XML Security의 위치를 도구에 알려야 한다.
예를 들어, wsvt –vm c:\SUNjava6\bin\java.exe –vmargs –DAXS=C:\xml-security-1_4_3\libs는 C:\xml-security-1_4_3\libs에 있는 Apache XML Security 라이브러리 버전 1.4.3이 포함된 Sun Java 6로 도구를 시작한다.
Apache XML Security 버전 1.4.3이 9개의 JAR 파일과 함께 제공되는 경우에도 WSDL 및 SOA용 웹 서비스 유효성 검증 도구에서
실제로 사용하는 Apache XML Security 라이브러리 파일의 목록은 다음과 같다.
commons-logging.jar
serializer.jar
xalan.jar
xmlsec-1.4.3.jar
WSDL 및 SOAP용 웹 서비스 유효성 검증 도구의 MANIFEST.MF에서는 다음을 찾을 수 있다.
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
external:$AXS$/commons-logging.jar
external:$AXS$/serializer.jar
external:$AXS$/xalan.jar
external:$AXS$/xmlsec-1.4.3.jar
이것이 암호화된 SOAP 메시지를 암호 해독하기 위해 Sun Java 6 환경에 –vmargs –DAXS=C:\xml-security-1_4_3\libs가 필요한 이유이다.
필자는 Sun Java 런타임 환경, Apache XML Security 및 일부 Eclipse 플러그인에서 찾은 XML 관련 클래스 사이의 클래스 로딩 충돌 및 비호환을 해결하는 데 상당히 많은 시간을 들여야 했다. IBM Java 런타임 환경은 JSR 106 구현과 함께 제공되고 Apache XML Security가 필요하지 않았기 때문에 편리했다.
다음으로 이 도구가 시작되어 실행되면 새 프로젝트를 작성할 수 있다. 프로젝트의 XML 파일에 SOAP 메시지, WSDL 파일 및 WSDL 파일과 연관된 복수의 스키마 파일을 가질 수 있다. 한 프로젝트에 복수의 WSDL 파일이 있는 경우에는 SOAP 메시지 XML 파일이 유효성 검증될 때 하나의 WSDL 파일만 사용되고 다른 WSDL 파일은 무시된다. 다른 WSDL 파일을 사용할 별도의 프로젝트를 작성해야 한다. 각 SOAP 메시지는 파일 확장자가 .xml인 파일에 저장되어야 한다. 그렇지 않으면 SOAP 메시지로 처리되지 않는다.
- 마우스 오른쪽 단추를 클릭한 후 New > Project를 선택하여 새 프로젝트를 작성한다.
그림 7. 새 프로젝트 작성하기
- General 아래에서 Project를 선택한다.
그림 8. 마법사 선택하기
- Project name에 "Test Project"를 입력한 후 Finish를 클릭한다.
그림 9. 프로젝트 이름
"Test Project"라는 프로젝트를 작성했다. 이제 WSDL과 XSD를 프로젝트로 가져올 수 있다.
- 프로젝트를 선택한 후 컨텍스트 메뉴에서 Import를 클릭한다.
그림 10. 가져오기
- General 아래에서 File System을 선택한다.
그림 11. 가져오기 소스 선택하기
- WSDL 및 XSD가 저장된 디렉토리를 선택한다.
- 2개의 파일(DemoWebServiceService.wsdl 및 DemoWebServiceService_schema1.xsd)을 선택한 후 Finish를 클릭한다.
그림 12. 파일 시스템에서 가져오기
이제 WSDL 및 XSD가 포함된 프로젝트가 있다. WSDL을 두 번 클릭하여 설계 모드 및 소스 모드에서 WSDL을 검토할 수 있다. 설계 모드에서는 입력 및 출력으로 웹 서비스를 시각화할 수 있다.
그림 13. 설계 모드
소스 모드에서는 텍스트 편집기로 WSDL을 보고 편집할 수 있다.
그림 14. 소스 모드
XSD 편집기로 XSD 파일을 열 수 없는 경우에는 XSD 파일의 컨텍스트 메뉴에서 Open With > XML Editor를 선택하여 XML 편집기로 XSD 파일을 열 수 있다.
그림 15. XML 편집기로 열기
XML 편집기로 DemoWebServiceService_schema1.xsd를 열었다.
그림 16. XML 편집기
WSDL과 스키마에서 SOAP 메시지를 유효성 검증할 준비가 되었다. 이제 SOAP 메시지로 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구를 테스트할 시간이다. 프로젝트에 SOAP 메시지가 있어야 한다. SOAP 메시지는 유효성 검증되려면 파일 확장자가 .xml인 파일에 있어야 한다.
- New > XML을 선택하여 프로젝트에서 SOAP 메시지를 작성한다.
그림 17. 새 XML
- 새 SOAP 메시지의 상위 폴더로 Test Project를 선택한다. 해당 폴더가 아직 선택되어 있지 않은 경우에는 File name 필드에 "DemoSOAPMessage.xml"을 입력한 후 Finish를 클릭한다.
그림 18. 상위 폴더 입력하기
이 도구는 새 XML 파일이 포함된 XML 편집기를 자동으로 불러온다. xml 버전과 xml 인코딩이 포함된 행 하나만 있다. SOAP 메시지를 처음부터 작성하기 전에 이 하나의 행이라도 있어서 다행이다. SOAP 메시지 작성 방법을 모를 수 있다. 걱정할 것 없다. 다음 섹션에서 SOAP 메시지를 작성하는 단계에 대해 설명한다.
그림 19. 새 XML 파일
SOAP 메시지를 빌드하려면 필자의 이름인 "Jinwoo"가 포함된 "parameters" 매개변수를 사용하여 "hello" 서비스를 호출한다. 물론 사용자 자신의 이름을 사용할 수 있다. 네임스페이스 "http://demo/"를 사용한다. 여기서 주의해야 한다. "http://demo"가 아니라 "http://demo/"이다. 이 둘은 굉장한 차이가 있다.
Listing 5. HelloWorldSOAPmessage.xml
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://demo/">
<soapenv:Body>
<ns0:hello>
<parameters>Jinwoo</parameters>
</ns0:hello>
</soapenv:Body>
</soapenv:Envelope>
|
SOAP 메시지에서 문제점을 찾았는가? 문제점을 찾은 경우에도 걱정할 것 없다. 이 기사의 후반부에서 이러한 문제에 대해 다룬다.
그림 20. DemoSOAPMessage.xml
메시지를 웹 서비스 서버에 전송할 준비가 되어 있는가?
- SOAP 메시지를 선택한 후 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구에서 Transmit SOAP Request and Receive SOAP Response를 클릭한다.
그림 21. SOAP 요청 전송 및 SOAP 응답 수신하기
- Transmit SOAP Request and Receive SOAP Response 창에서 Service Address, SOAPAction 및 Content-Type에 입력할 수 있다. DemoWebServiceService.wsdl의 바인딩 섹션에서 soapAction 속성에 대해 비어 있는 문자열 ""를 사용했기 때문에 이 애플리케이션에서는 SOAPAction이 필요없다.
- 서버가 localhost:9081에 있는 경우 Service Address에 http://localhost:9081/HelloWorldWSProject/DemoWebServiceService를 입력한다. 그렇지 않은 경우에는 웹 서비스를 사용할 수 있는 올바른 주소를 입력해야 한다.
- Content-Type으로 text/html을 선택한다.
- OK를 클릭하여 SOAP 메시지를 서버에 전송한다.
그림 22. 서비스 엔드포인트 주소 입력하기
서버가 시작되어 실행 중인 경우에는 SOAP 응답을 수신할 수 있어야 한다. 아무 응답도 수신되지 않는 경우에는 주소와 컨텐츠 유형이 올바른지 확인한다.
그림 23. 응답
이제 SOAP 응답을 수신했다. 수신된 응답은 프로젝트에도 저장된다. 하지만 잠시 기다리자. 뭔가 잘못되었다는 것을 눈치챘는가? "Hello, Jinwoo!" 대신 "Hello, buddy!"가 수신되었다. 무엇이 잘못되었을까? 단서가 없는가?
안타깝게도 웹 서비스 서버는 무엇이 잘못되었는지 알려주지 않았다. 오류 메시지도 없었고 경고 메시지도 없었다. 이 상황은 예상치 않은 SOAP 응답이 전송되지만 웹 서비스 서버가 무엇이 잘못되었는지 알지 못하는 매우 위험한 상황으로 발전할 수 있다. SOAP 응답의 수신자도 문제의 SOAP 메시지에서 문제점을 인지하지 못할 수 있다.
WSDL 및 SOAP용 웹 서비스 유효성 검증 도구가 잘못된 부분을 찾을 것이다.
Listing 6. 응답
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns2:helloResponse xmlns:ns2="http://demo/">
<return>Hello, buddy!</return>
</ns2:helloResponse>
</soapenv:Body>
</soapenv:Envelope>
|
다음 단계에서는 요청 SOAP 메시지에 문제가 있는지 확인하기 위해 DemoSOAPMessage.xml 파일을 유효성 검증하는 방법을 보여 준다.
- 요청 SOAP 메시지를 선택한 후 Validate를 클릭한다.
그림 24. 요청 SOAP 메시지 유효성 검증하기
WSDL 및 SOAP용 웹 서비스 유효성 검증 도구가 SOAP 메시지에서 잘못된 부분을 찾았다.
Invalid SOAP message:cvc-complex-type.2.4.a:Invalid
content was found starting with element 'parameters'. One of '{arg0} is expected. |
그림 25. 올바르지 않은 SOAP 메시지
- 이 도구는 "parameters"에 대해 불만을 토로한다. 해당 값을 arg0으로 변경한 후 저장한다.
Listing 7. 편집된 SOAP 메시지
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://demo/">
<soapenv:Body>
<ns0:hello>
<arg0>Jinwoo</arg0>
</ns0:hello>
</soapenv:Body>
</soapenv:Envelope>
|
- 수정된 SOAP 요청 메시지를 유효성 검증한다. 더이상 오류 메시지가 표시되지 않는다.
그림 26. SOAP 메시지 편집하기
- 이제 수정된 요청 메시지를 서버에 전송할 준비가 완료되었다. SOAP 메시지를 선택한 후 Transmit SOAP Request and Receive SOAP Response를 클릭한다.
그림 27. SOAP 요청 전송 및 SOAP 응답 수신하기
- 서버가 localhost:9081에 있는 경우 Transmit SOAP Request and Receive SOAP Response 창의 Service Address에 http://localhost:9081/HelloWorldWSProject/DemoWebServiceService를 입력한다.
- Content-Type으로 text/html을 선택한 후 OK를 클릭한다.
그림 28. SOAP 요청 전송하기
이번에는 예상한 올바른 응답을 수신했다.
그림 29. 올바른 응답
Listing 8. SOAP 응답
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns2:helloResponse xmlns:ns2="http://demo/">
<return>Hello, Jinwoo!</return>
</ns2:helloResponse>
</soapenv:Body>
</soapenv:Envelope>
|
잘못된 네임스페이스를 전송하면 어떤 일이 일어날까?
- 네임스페이스를 "http://demo2/"로 변경한 후 저장한다.
그림 30. 네임스페이스 변경하기
Listing 9. 네임스페이스 변경
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns0="http://demo2/">
<soapenv:Body>
<ns0:hello>
<arg0>Jinwoo</arg0>
</ns0:hello>
</soapenv:Body>
</soapenv:Envelope>
|
- 그런 다음 요청을 서버에 전송할 수 있다.
그림 31. 메시지 전송하기
Server returned HTTP response code:500 for URI: http://localhost:9081/HelloWorldWSProject/DemoWebServiceService라는 IOException이 표시된다.
그림 32. IOException
웹 서비스 서버는 IOException과 함께 응답했지만 무엇이 잘못되었는지 파악하기에 충분한 정보가 되지 못했다. 이 도구로 메시지를 유효성 검증하여 문제점을 해결하기 위해 더 적절한 정보를 얻을 수 있는지 확인한다.
그림 33. 메시지 유효성 검증하기
이 도구는 "Invalid SOAP message:cvc-complex-type.2.4.a:Invalid content was found starting with element ‘ns0:hello'. One of '{"http://demo/":hello,"http://demo/":helloResponse}' is expected."라는 메시지를 표시한다.
이 메시지는 "http://demo/"를 예상했다고 지적한다. HTTP 응답 코드 500이 아니라 바로 이 내용이 정확하게 우리가 알고 싶어하던 것이다.
그림 34. 올바르지 않은 SOAP 메시지
SOAP 메시지가 암호화되어 있는 경우는 어떨까? 키와 암호가 있으면 이것은 전혀 문제가 되지 않는다. 다른 일반 SOAP 메시지와 마찬가지로 SOAP 메시지를 선택한 후 Validate를 클릭하기만 하면 된다. SOAP 메시지가 암호화되어 있는 경우에는 다음과 비슷한 화면이 표시된다.
그림 35. 키 저장소 선택
이 기사 작성 시에는 세 가지 유형의 키 저장소가 지원되었다.
- JKS(Java Key Store)
- JCEKS(Java Cryptography Extension Key Store)
- 개인 정보 교환 구문 표준(공개 키 암호 표준 #12)
키 저장소에 대한 정보(파일 이름, 파일 유형 및 암호)를 제공해야 한다. 정보가 올바른 경우에는 키와 암호를 선택해야 한다. 키 저장소에 대한 정보와 키 저장소에 있는 키 및 인증서 목록도 찾을 수 있다(예: 키 저장소 유형, 공급자 이름, 공급자 버전, 공급자 정보, 키 유형, 작성 날짜, 인증서 유형, 알고리즘 및 형식).
그림 36. 키 선택
모든 정보가 올바른 경우 이 도구는 암호 해독된 SOAP 메시지를 생성한 후 해당 메시지를 유효성 검증한다.
그림 37. 암호 해독된 SOAP 메시지
현재는 다음 암호화 알고리즘이 지원된다.
- 초기화 벡터가 포함된 CBC(Cipher Block Chaining)의 AES(Advanced Encryption Standard)(128/192/256비트)
- AES(Advanced Encryption Standard) 키 암호화(128/192/256비트)
- Triple-DES(Triple Data Encryption Algorithm Modes of Operation) 키 암호화
- CBC(Cipher Block Chaining) 모드의 triple-DES(Triple Data Encryption Algorithm Modes of Operation) 키 암호화
- RSA 암호 스펙 버전 1.5
- 마스크 생성 함수가 포함된 RSA OAEP(Optimal Asymmetric Encryption Padding) 메소드
SOAP 메시지에 디지털 서명이 되어 있는 경우는 어떤가? SOAP 메시지를 선택한 후 SOAP Message Digital Signature Verification을 클릭하기만 하면 된다.
그림 38. SOAP 메시지 디지털 서명 확인
디지털 서명이 올바른 경우에는 다음 화면이 표시된다.
그림 39. 올바른 SOAP 메시지 디지털 서명
올바르지 않은 경우 이 도구는 서명이 올바르지 않다고 알려 준다. 현재는 다음과 같은 디지털 서명 알고리즘과 스펙이 지원된다.
- SHA-1(Secure Hash Algorithm 1)
- HMAC(Hash Message Authentication Code)
- DSA(Digital Signature Algorithm)
- PKCS #1(Public-Key Cryptography Standards)
- 보안 해시 알고리즘(SHA-1)이 포함된 RSA 암호 알고리즘
- 표준 XML 버전 1.0 및 1.1
- XSLT(XSL Transformations) 버전 1.0
- XML 경로 언어(XPath) 버전 1.0
- Base64
작성하여 테스트한 단순 웹 서비스에는 아무 문제가 없는 것처럼 보인다. 이 도구를 "실제" 환경에서 사용할 수 있는가? 미국 NOAA(National Oceanic and Atmospheric Administration)의 기상청에서 제공하는 프로덕션 웹 서비스를 사용해 볼 수 있다.
- 프로젝트를 작성한다.
그림 40. 프로젝트 작성하기
- SOAP 메시지 XML을 작성한다.
그림 41. 상위 폴더 입력하기
그림 42. 새 XML 파일
미국 기상청은 SOAP(imple Object Access Protocol) 웹 서비스를 통해 검색할 수 있는 NDFD(National Digital Forecast Database)를 운영한다. 자세한 정보는 http://www.weather.gov/forecasts/xml/에서 확인할 수 있다.
미국 기상청에서는 다양한 웹 서비스를 제공한다. 위도와 경도로 식별되는 지정된 위치에 대한 일기 예보를 제공하는 NDFDgenByDay라는 서비스를 사용해 볼 수 있다.
NDFDgenByDay에 액세스하려면 다음 정보를 제공해야 한다.
표 1. NDFDgenByDay
| 서비스 이름 | NDFDgenByDay |
|---|---|
| 엔드포인트 | http://www.weather.gov/forecasts/xml/SOAP_server/ndfdXMLserver.php |
| SoapAction | http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgenByDay |
| encodingStyle | http://schemas.xmlsoap.org/soap/encoding/ |
| 네임스페이스 | http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl |
| 위도 | 10진수 |
| 경도 | 10진수 |
| startDate | 날짜 |
| numDays | 정수 |
| 형식 | 문자열 |
이 예제에서는 특정 위치(LAT38.9,LON-77.01)에 대해 2010년 7월 23일부터 1주일 동안의 일기 예보를 24시간 제공하는 요청 SOAP 메시지를 빌드하려고 한다.
Listing 10. 요청 SOAP 메시지
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns6244:NDFDgenByDay> <latitude xsi:type="xsd:string">38.99</latitude> <longitude xsi:type="xsd:string">-77.01</longitude> <startDate xsi:type="xsd:string">2010-07-23</startDate> <numDays xsi:type="xsd:string">7</numDays> <format xsi:type="xsd:string">24 hourly</format> </ns6244:NDFDgenByDay> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
네임스페이스 없이 제대로 작동했기 때문에 네임스페이스는 정의하지 않았다. 네임스페이스 문제가 발생하는 경우에는 네임스페이스를 정의해야 한다.
그림 43. 작성된 SOAP 네임스페이스
메시지를 선택한 후 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구에서 Transmit SOAP Request and Receive SOAP Response를 클릭한다.
표 2. 요청 정보
| Name | 값 |
|---|---|
| 엔드포인트 | http://www.weather.gov/forecasts/xml/SOAP_server/ndfdXMLserver.php |
| SoapAction | http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl#NDFDgenByDay |
| 컨텐츠 유형 | text/xml; charset=utf-8 |
그림 44. 요청 전송하기
미국 기상청에서 일기 예보를 수신했지만 HTML 특수 엔티티로 인해 읽기가 어렵다.
그림 45. 응답 메시지
파일 확장자를 .html로 변경한 후 웹 브라우저로 보면 HTML 특수 엔티티를 변환할 수 있다.
그림 46. XML 파일 이름 바꾸기
그림 47. 새 이름
그런 다음 웹 브라우저로 HTML을 연다.
그림 48. 웹 브라우저로 열기
이제 XML 출력이 표시된다. 하지만 컨텐츠가 형식화되어 있지 않기 때문에 여전히 컨텐츠를 읽기 어렵다.
그림 49. XML 출력
단순히 컨텐츠를 복사한 후 형식화할 새 XML 문서를 작성할 수 있다.
그림 50. XML 복사하기
새 XML 파일을 작성하여 붙여넣은 후 형식화한다.
그림 51. 새 XML 파일
마침내 일기 예보가 훨씬 더 읽기 쉬워졌다.
그림 52. 형식화된 메시지
이 팁이 마음에 들지 않는 경우에는 자체 메소드를 사용하여 HTML 출력을 형식화할 수 있다. 대부분의 웹 서비스는 XML 출력을 제공하므로 항상 이 방법을 수행할 필요는 없다.
여기서는 WSDL 및 SOAP용 웹 서비스 유효성 검증 도구를 사용하여 SOAP 메시지를 작성, 전송, 수신 및 유효성 검증했다. WSDL 및 SOAP용 웹 서비스 유효성 검증 도구는 대부분의 웹 서비스 서버에서 감지하지도 못하여 실제로 심각한 위험을 초래할 수 있는 문제점을 정확히 지적할 수 있다. 개발 단계에서 이 도구를 사용하면 프로덕션에서 문제가 발생하는 경우 해결책을 찾는 시간을 줄일 수 있다.
교육
-
필자의 기술 관련 기사 페이지
- Webcast replay:
Simple Object Access Protocol Debugging
-
Web Services Validation Tool for WSDL and SOAP
-
Web Services Activity
-
Web Services Architecture
-
Web Services Description Language (WSDL)
-
Extensible Markup Language (XML)
-
Overview of SGML Resources
-
JSR 105: XML Digital Signature APIs
-
JSR 106: XML Digital Encryption APIs
-
JSR 181: Web Services Metadata for the
Java™ Platform
-
Apache XML Security
-
IBM developer kits
-
U.S. National Digital Forecast Database (NDFD) Simple Object Access Protocol (SOAP) Web Service
-
FIPS PUB(Federal Information Processing Standards Publication) 161-2
- developerWorks의
SOA와 웹 서비스 영역에서 개발자의 기술을 향상시키는 데 도움이 되는 참고자료를 다운로드할 수 있다.
- 기술 서점에서
다양한 기술 주제와 관련된 서적을 살펴보자.
제품 및 기술 얻기
- IBM 제품 평가판을
다운로드하거나 IBM SOA Sandbox의
온라인 시험판을 살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
토론
- developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.

Jinwoo Hwang is a software engineer, an inventor, an author, and a technical leader within IBM WebSphere Application Server Technical Support in Research Triangle Park, North Carolina. He is the architect and creator of the IBM HeapAnalyzer (http://www.alphaworks.ibm.com/tech/heapanalyzer) and many other technologies. He is the author of the book C Programming for Novices (ISBN:9788985553643, Yonam Press, 1995) as well as many other webcasts and articles (http://jinwoohwang.sys-con.com). He is an IBM Certified Solution Developer and IBM Certified WebSphere Application Server System Administrator as well as a SUN Certified Programmer for the Java platform.