SOAP(Simple Object Access Protocol)は、アプリケーションがエンタープライズWebサービス内で構造化されたXMLメッセージを交換できるようにするメッセージングプロトコルであり、通常はHTTPを介して転送され、暗号化や署名のためのWS-Security拡張機能がオプションで利用可能です。 運用チームは、正確なDNSレコード、有効なTLS証明書、および適切に検証されたXML解析を維持し、サイレント障害を防止する必要があります。これは、古くなったエンドポイントレコード、証明書の不一致、およびサイズ超過のペイロードが、金融、通信、政府機関のシステム統合においてサービス中断の一般的な原因となっているためです。 メッセージレベルの保護とトランスポート層のセキュリティのどちらを採用するかについて慎重な判断を下すとともに、WSDL契約やホスト名解決を注意深く監視することは、SOAPサービスへの到達性を維持し、多くの場合フォールバックメカニズムが存在しない統合の失敗を防ぐために不可欠です。
SOAPの仕組み
SOAPでは、すべての通信をクライアントとサービス間で送受信されるXMLメッセージとして構成します。メッセージ形式は仕様によって固定されていますが、その下層のトランスポートは柔軟であり、通常はHTTPが使用されます。
- サービスの説明:サービスは、その操作と、各操作が受け付け・返すメッセージタイプを列挙した契約(通常はWSDLドキュメント)を公開します。
- エンベロープの構築:クライアントはリクエストをSOAPエンベロープで包みます。エンベロープには、セキュリティやルーティング情報などのメタデータを含むオプションのヘッダーと、リクエストのペイロードを含む必須のボディが含まれます。
- トランスポート経由での送信:クライアントは、エンベロープをサービスエンドポイントに送信します。多くの場合、これはHTTP POSTリクエストのボディとして送信されます。
- リクエストの処理:受信ノードはXMLを解析し、ヘッダーブロックを処理し、要求された操作を実行します。
- 応答またはフォルトの返却:サービスは、結果を含む SOAP エンベロープを返信します。処理に失敗した場合、ボディにはエラーを説明するフォルト要素が含まれます。
SOAPメッセージは、最終的な受信者が受け取る前に、ヘッダーブロックに対して処理を行う仲介サーバーを経由することがあります。WS-Securityなどの拡張機能により、トランスポートに依存しないメッセージレベルの署名や暗号化が追加されます。
SOAPでよくある問題
クライアントは通常、サービスのホスト名を設定済みであるか、WSDLに埋め込まれているため、IPアドレスが変更されたにもかかわらず、長いTTLでキャッシュされた古いAレコードが残っていると、リクエストが誤ったホストに送信されてしまいます。この場合、一部のクライアントグループでは接続タイムアウトやHTTPエラーが発生する一方で、他のクライアントは正常に動作するという現象が見られます。
SOAP over HTTPSでは、証明書の名前がクライアントが使用するホスト名と一致しない場合、TLSハンドシェイクに失敗します。これは、証明書を再発行せずに、サービスを新しいエイリアスやロードバランサーのアドレスの背後に移動させた後に、よく発生します。
添付ファイルや深くネストされた要素を含む大規模なエンベロープは、プロキシやゲートウェイのボディサイズ制限を超過し、リクエストのタイムアウトやHTTP 413レスポンスを引き起こす可能性があります。また、大規模なメッセージの解析はサービスのCPU使用率を上昇させ、これがネットワークの問題のように見えることもあります。
スキーマ検証を行わずにXMLを受け入れるサービスや、外部エンティティの解決を許可するサービスは、細工されたドキュメントによるXML外部エンティティ攻撃やサービス拒否攻撃の標的となる可能性があります。また、サービスが予期しない外部DNSルックアップを行う可能性もあります。
サーバー上で生成されたWSDLには、エンドポイントの場所に内部ホスト名やプライベートアドレスが埋め込まれていることがよくあります。外部クライアントは契約を正常にインポートしても、エンドポイントの解決や接続に失敗してしまいます。