Webhookは、システム側で出来事が起きた瞬間に、指定したURLへHTTPリクエストを送って知らせる仕組みです。決済の完了やフォームの送信のように、リアルタイム性が求められる連携で広く使われています。
ただし送られてくるリクエストが本物かどうかは、受信側で検証しなければ確認できません。署名の検証を省くと、第三者からのなりすましリクエストをそのまま処理してしまう危険があります。
Webhook は、送信元のシステムで出来事が起きたときに、あらかじめ登録しておいたURLへHTTPリクエストを送る仕組みです。受信側は常に待ち構えているだけで、能動的に確認しにいく必要がありません。
Webhookは受信側が「ください」と聞きに行くのではなく、送信元が「来ました」と知らせに来る。この向きの違いが、ポーリングとの本質的な差になる。
Webhookは通知の即時性で勝るが、受信側が公開URLを持つ必要がある。ポーリングは実装が単純だが、確認間隔の分だけ遅延する。
| 観点 | Webhook | ポーリング |
|---|---|---|
| 通知の即時性 | 出来事の直後に届く | 確認間隔の分だけ遅延する |
| 通信回数 | 出来事があったときのみ | 変化が無くても定期的に発生する |
| 受信側の要件 | 外部から到達できるURLが要る | 送信元への到達性は不要 |
n8n や Zapier のトリガーの多くは、内部的にWebhookとして実装されています。フォームの送信や決済の完了を合図に、登録したワークフローが自動で起動します。
Webhook の実装で多い失敗は、同じ通知が複数回届くことを想定せずに処理を書くことです。送信元がタイムアウトで再送すると、受信側の処理が二重に実行されます。
決済完了の通知が2回届いた場合、何も対策していなければ二重に処理が実行され、二重請求のような事故につながります。通知に含まれる一意のIDを記録し、処理済みかどうかを確認する仕組みが要ります。
受信したリクエストの中で重い処理をすべて完了させてから応答すると、送信元のタイムアウトに間に合わず、不要な再送を招きます。受信確認は即座に返し、重い処理は非同期のキューに回す設計が安全です。
Webhook の受信エンドポイントは、インターネットに公開されたURLである以上、誰からでもリクエストを送れる状態にあります。送信元が本物かどうかを検証する仕組みが無ければ、なりすましを見分けられません。
多くのサービスは、リクエストの本文と共有の秘密鍵からハッシュ値を計算し、ヘッダーに署名として付けて送ってきます。受信側で同じ計算をして署名が一致するか確認すれば、送信元が本物であることを検証できます。
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る