SOAP APIとは|仕組み・WSDL・WS-*でわかるセキュリティとRESTとの使い分け

SOAP API とは — 概要

SOAP(Simple Object Access Protocol)は、XML をベースにしたメッセージ交換のためのプロトコル仕様です。主に分散システム間でのリモートプロシージャ呼び出しやメッセージングに用いられ、メッセージ構造(Envelope、Header、Body)やエラーフォーマット(Fault)などを標準化します。HTTP を最も一般的なトランスポートとして利用しますが、SMTP や JMS など他のプロトコル上でも運用できます。

歴史と背景

SOAP は 1998〜2000 年頃に主要ベンダ(Microsoft など)の提案を基に登場し、SOAP 1.1(非公式仕様)は 2000 年に広まりました。その後仕様の整理を経て、SOAP 1.2 が W3C の勧告(Recommendation)として 2003 年に公開されました。SOAP は単体ではセキュリティやトランザクション、信頼性を定義しないため、WS-Security、WS-ReliableMessaging、WS-Addressing などの WS-* 系仕様群と組み合わせて使われることが多いです。

技術的構造(メッセージの基本要素)

  • Envelope: メッセージのルート要素。名前空間で SOAP のバージョンを示す。
  • Header: 任意。認証情報、トランザクション ID、ルーティング情報などのメタデータを含む。拡張可能で処理単位を細かく制御できる。
  • Body: 実際の操作(要求/応答)データを含む。SOAP Fault(エラー)もここに含まれる。

SOAP 1.1 の Envelope 名称空間は http://schemas.xmlsoap.org/soap/envelope/、SOAP 1.2 は http://www.w3.org/2003/05/soap-envelope です。

SOAP メッセージの具体例

以下は簡単な SOAP リクエスト/レスポンスの例(document/literal スタイルを想定)です。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:ex="http://example.com/service">
  <soapenv:Header/>
  <soapenv:Body>
    <ex:GetUserRequest>
      <ex:userId>12345</ex:userId>
    </ex:GetUserRequest>
  </soapenv:Body>
</soapenv:Envelope>

レスポンス例(正常応答):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:ex="http://example.com/service">
  <soapenv:Header/>
  <soapenv:Body>
    <ex:GetUserResponse>
      <ex:User>
        <ex:Id>12345</ex:Id>
        <ex:Name>山田太郎</ex:Name>
      </ex:User>
    </ex:GetUserResponse>
  </soapenv:Body>
</soapenv:Envelope>

WSDL とバインディング

WSDL(Web Services Description Language)は SOAP サービスの公開仕様(操作、メッセージフォーマット、エンドポイント、バインディング)を記述するために使われます。WSDL では soap:binding 要素で「style(rpc/document)」や「use(literal/encoded)」を指定します。一般的なベストプラクティスは document/literal(特に document/literal-wrapped)で、RPC/encoded は相互運用性や互換性の観点から避けられる傾向にあります。

トランスポートと HTTP との関係

SOAP 自体はトランスポート非依存ですが、実運用では HTTP(S) が圧倒的に多く用いられます。SOAP 1.1 では HTTP ヘッダに SOAPAction を指定する慣習がありましたが、SOAP 1.2 では MIME タイプ application/soap+xml と action パラメータで管理されるなど整理されています。HTTP ステータスコードの扱いも SOAP 1.2 で明確になっています(メッセージレベルのエラーは 200 OK+Fault、プロトコルレベルのエラーは別の HTTP ステータスを返すなど)。

エラー処理(Fault)

SOAP では Fault 要素が標準のエラー表現を担います。SOAP 1.1 の Fault には faultcodefaultstringfaultactordetail があり、SOAP 1.2 では構造が Code / Reason / Node / Role / Detail に変更・拡張されています。アプリケーションエラーとプロトコルエラーを区別して扱える点が特徴です。

拡張仕様(WS-*)とセキュリティ

SOAP はメッセージ層での拡張性が高く、WS-* 仕様群が発展しました。代表的なもの:

  • WS-Security(OASIS): メッセージ署名、暗号化、トークン(UsernameToken、SAML など)を定義
  • WS-Addressing: メッセージに宛先やメッセージ ID を付与して非同期通信やルーティングをサポート
  • WS-ReliableMessaging: 再送・重複排除などの信頼性機構
  • MTOM / XOP: バイナリデータの効率的な添付(SWA より進化した方法)

これらを組み合わせることで、トランザクション制御やメッセージレベルのセキュリティが可能になりますが、導入は複雑化を招きます。

メリット・デメリット

  • メリット
    • 仕様が標準化されており、インターネット越しの複雑な相互運用性を確保しやすい
    • メッセージレベルのセキュリティ(WS-Security)やトランザクション、信頼性などの豊富な拡張が利用可能
    • WSDL による明確な契約(契約駆動開発)が可能
  • デメリット
    • XML ベースで冗長になりがち、ネットワーク帯域・パースコストが大きい
    • 複雑な仕様群(WS-*)を組み合わせると実装と運用が難しくなる
    • REST/JSON に比べて軽量性やブラウザ中心の利用で不利

REST との比較(いつ SOAP を選ぶか)

REST はシンプルでキャッシュや HTTP の原則を活かしやすく、JSON による軽量データ交換に向いています。一方で SOAP が適するケースは:

  • メッセージレベルのセキュリティや署名・暗号化が必須のシステム
  • トランザクションやビジネスプロセス連携など、WS-* の機能群が要件に合致する場合
  • 既存のエンタープライズ環境(レガシーシステム)と相互運用する必要がある場合

実装とツールチェーン

主要な言語・フレームワーク向けに豊富な実装が存在します。例:

  • Java: JAX-WS、Apache CXF、Axis2、Spring-WS
  • .NET: WCF(Windows Communication Foundation)や .NET Core の一部ライブラリ
  • テスト/デバッグ: SoapUI、Postman(SOAP サポートあり)、Wireshark(HTTP レベルでの解析)
  • C/C++: gSOAP など

開発時は WSDL からクライアントスタブを自動生成し、契約(WSDL)ベースで開発するのが一般的です。

運用上の注意点・ベストプラクティス

  • 可能なら document/literal(wrapped)スタイルを採用し、RPC/encoded を避ける
  • 大きなバイナリは MTOM を使い、Base64 インラインは避ける
  • WS-Security を使う場合はキー管理・証明書更新の運用設計を事前に行う
  • SOAP Fault と HTTP ステータスの扱いをチーム内で統一する(特に SOAP 1.1 と 1.2 で差異あり)
  • バージョニングは名前空間(XML namespace)による管理が一般的
  • ログはメッセージ内容に機密情報(個人情報・パスワードなど)が含まれないようにマスキングする

まとめ

SOAP は堅牢で拡張性の高い XML ベースのメッセージプロトコルで、エンタープライズ用途や高いセキュリティ・信頼性を求める場面で今も有力な選択肢です。一方で、軽量で迅速な開発を優先するモダンな Web API では REST/JSON が優勢です。要件(セキュリティ、トランザクション、既存システムとの相互運用)に応じて適切に選定することが重要です。

参考文献