SOAP 프로토콜이란?

Kevin·2024년 8월 4일
2

Network

목록 보기
10/15
post-thumbnail

🫡 서론

최근 특정 로직을 개발하면서 해당 로직을 구현하는데 있어서 특정 API로 SOAP 프로토콜 으로 Request를 보내고 Response를 받았어야 하는 경우가 있었다.

이전까지 SOAP 프로토콜을 들어본 적 자체가 없기에 어떠한 개념인지 자체가 인식이 되지않았다.

해당 로직을 구현하기 이전에 SOAP 프로토콜에 대해서 먼저 공부를 해야 할 필요성을 느껴 정리하며 공부 해보고자 한다.


😘 본론

SOAP 통신이란?

SOAP 통신에 대해서 위키피디아에서는 아래와 같이 설명 하고 있다.

SOAP(Simple Object Access Protocol)은 일반적으로 널리 알려진 HTTPHTTPSSMTP 등을 통해 XML 기반의 메시지를 컴퓨터 네트워크 상에서 교환하는 프로토콜이다.

SOAP은 웹 서비스에서 기본적인 메시지를 전달하는 기반이 된다.

즉 쉽게 설명을 하면 SOAP은 웹 서비스 상호작용을 위해 XML로 작성되는 메시지 형식을 통해 교환 프로토콜이다.

SOAP이란 서로 다른 service들간의 연동을 목적으로 상호 이해 가능한 포맷의 메세지를 송수신 하여서 원격지에 있는 서비스 객체나 API를 자유롭게 사용하고자 하는 목적으로 태어났다.

SOAP 통신은 고수준의 보안을 제공할 수 있어 공공 기관이나 금융기관 같이 고 수준의 보안을 필요로 하는 곳에서 많이 사용된다.

SOAP은 인터넷을 사용하는 모든 서버에 의해서 지원되는 HTTP를 활용한다.

이러한 SOAP 프로토콜은 아래 사진과 같은 통신의 흐름을 가지고 있다.

해당 통신 과정을 자세히 알아보기에 앞서서 먼저 필수적으로 알아야 할 개념들에 대해서 살펴보고자 한다.

위의 흐름에서 서비스 요청자, 서비스 제공자, 서비스 브로커라는 개념이 존재한다.

서비스 요청자는 일반적으로 API를 사용하는 Client를 의미하고, 서비스 제공자는 API를 제공하는 Server를 의미한다.

서비스 브로커라는 개념은 조금 생소할텐데, 서비스 브로커는 서비스 제공자와 요청자 사이에서 둘 사이에 위치하며 UDDI, 서비스 등록 및 검색, 저장, 관리하는 주체를 의미한다.


UDDI?

여기서 이야기 되는 UDDI란 어떠한 개념일까?

UDDI란 Universal Description, Discovery and Integration을 의미하며 WSDL을 저장하는 public registry를 의미한다.

꼬리에 꼬리를 물어 궁금한 부분들이 나온다.


WSDL?

그렇다면 WSDL은 어떠한 개념일까?

WSDL이란 Web Services Description Language이고, 이는 웹 서비스가 기술된 정의 파일의 총칭으로 XML을 사용해 기술된다.

웹 서비스의 구체적인 내용이 기술되어 있는 문서이고, 이 때 서비스 제공 장소, 서비스 메세지 포맷, 프로토콜들이 기술되어있다.


WSDL 2.0은 아래의 format으로 이루어져 있다.

  • Types : 교환될 메시지 설명 및 사용될 데이터 형식 정의
  • Interface : operation 정의 (input & output)
  • Binding : interface에 정의된 작업의 메시지 형식 및 프로토콜을 정의하여 클래스 화 한다.
  • Service : WebService의 URL endpoint를 정의한다.

Types

<wsdl:types>
...
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                xmlns:tns="http://example.org/calculator"
                targetNamespace="http://example.org/calculator"
                elementFormDefault="qualified"
                attributeFormDefault="qualified">
        <xs:element name="AddValuesRequest" type="tns:AddValuesType" />
        <xs:element name="AddValuesResponse" type="tns:AddValuesResponseType" />

        <xs:complexType name="AddValuesType">
            <xs:sequence>
                <xs:element name="FirstValue" type="xs:int" minOccurs="1" maxOccurs="1" />
                <xs:element name="SecondValue" type="xs:int" minOccurs="1" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>

        <xs:complexType name="AddValuesResponseType">
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="Result" type="xs:int" />
            </xs:sequence>
        </xs:complexType>
...
    </xs:schema>
</wsdl:types>

schema에서 필요한 부분을 import 하고, wsdl에서 사용할 데이터 형식을 정의한다.


Interface

<wsdl:interface name="CalculatorInterface">
    <wsdl:fault name="fault" element="calc:CalculationFault" />
    <wsdl:operation name="AddValues" pattern="http://www.w3.org/ns/wsdl/in-out" style="http://www.w3.org/ns/wsdl/style/iri" wsdl:safe="true">
        <wsdl:documentation>Adds up passed values and returns the result</wsdl:documentation>
        <wsdl:input messageLabel="in" element="calc:AddValuesRequest" />
        <wsdl:output messageLabel="out" element="calc:AddValuesResponse" />
        <wsdl:outfault messageLabel="fault" ref="tns:fault" />
    </wsdl:operation>
</wsdl:interface>

Operation, 즉 함수를 정의한다.

이 때 input과 output의 순서 또한 중요하다.

  1. One-way : 클라이언트가 메세지만 보내는 input만 있는 경우
  2. Request-Response : 클라이언트가 Request를 보내면 서버가 Response를 하는 경우

Binding

<wsdl:binding name="CalculatorBinding" interface="tns:CalculatorInterface" type="http://www.w3.org/ns/wsdl/soap" soap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
    <wsdl:operation ref="tns:AddValues" soap:mep="http://www.w3.org/2003/05/soap/mep/soap-response" />
    <wsdl:fault ref="tns:fault" soap:code="soap:Sender" />
</wsdl:binding>

Interface에 정의된 작업에 대한 메세지 형식과 프로토콜을 정의한다.


Service

<wsdl:service name="CalculatorService" interface="tns:CalculatorInterface">
    <wsdl:endpoint name="CalculatorEndpoint" binding="tns:CalculatorBinding" address="http://localhost:8080/services/calculator" />
</wsdl:service>

WebService URL endpoint를 정의한다.

이러한 개념들을 통해 SOAP 통신의 흐름을 알아보자.

SOAP 통신의 흐름은?


위 사진을 글로 과정을 풀어보면 아래와 같다.

  1. 서비스 제공자는 UDDI에 사용가능한 WSDL을 등록한다.
  2. 서비스 사용자는 원하는 서비스를 위해 UDDI를 검색한다.
  3. 서비스 사용자는 원하는 서비스에 대해서 UDDI에서부터 WSDL을 다운로드한다.
  4. 서비스 사용자는 WSDL 문서를 처리하여 적절한 인터페이스에 맞게 SOAP 메세지를 작성한다.
  5. 서비스 사용자는 HTTP를 통해 서비스를 요청한다.
  6. 서비스 제공자는 받은 요청에 대해 내부적으로 로직을 수행 후 결과값을 SOAP 메세지로 작성한 후 HTTP를 통해 요청자에게 반환한다.

즉 SOAP 통신이란?

사용자는 UDDI를 통해 자신이 원하는 웹 서비스를 검색하고, 서비스에 대한 파라미터나 리턴 타입등의 자세한 내용을 알아낸 다음, SOAP 메세지의 형태로 HTTP 프로토콜을 사용하여 통신한다.


일반적으로 API를 사용하려는 Client의 경우에는 Server가 원하는 format에 맞게 요청을 보내는 것이 중요하다.

profile
Hello, World! \n

0개의 댓글