SOAP (Simple Object Access Protocol) is a messaging protocol used to exchange structured XML messages between applications in web services, commonly carried over HTTP with optional security extensions like WS-Security. The protocol is widely deployed in enterprise systems including financial, telecommunications, and government integrations where formal service contracts and strict message typing are required, but operational teams must carefully manage DNS records, certificates, endpoint descriptions, and XML validation to prevent silent failures and security vulnerabilities. Key operational challenges include stale DNS records causing routing failures, certificate-hostname mismatches breaking TLS handshakes, oversized XML payloads exceeding gateway limits, and unvalidated XML input exposing services to injection attacks and denial of service.
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には、エンドポイントの場所に内部ホスト名やプライベートアドレスが埋め込まれていることがよくあります。外部クライアントは契約を正常にインポートしても、エンドポイントの解決や接続に失敗してしまいます。