WebhookとAPIの違い:取りに行くか、送ってもらうか

WebhookとAPIの違い

WebhookとAPIの違い:プッシュとプル、署名、リトライ | We.Inc

WebhookとAPIの違いを、比較表、ポーリングとプッシュのトレードオフ、ブラウザー上で動くHMAC署名チェッカー、リトライの扱い、冪等な受信側コードで解説します。

API呼び出しでは、自分のコードが好きなときに別のサービスへデータを要求します。これがプルです。Webhookでは、何かが起きた瞬間にサービスが自分のURLへHTTP POSTを送ってきます。これがプッシュです。多くの連携では両方を使います。Webhookで変更をすばやく知り、API呼び出しで最新の完全なレコードを取得します。

APIリクエストとWebhookの比較

支払いが完了したかを確認するために毎分APIをポーリングすると、リクエストが無駄になるうえ、それでも知るのが遅れます。Webhookは方向を逆にしますが、責任も自分に移ります。エンドポイントを公開し、各メッセージが本物であることを確認し、すばやく応答し、同じイベントが2回届いても対処できなければなりません。このページでは、それぞれの作業をコピーできるコードとともに解説します。

よくある質問

WebhookはAPIの一種ですか?

大まかに言えば、そうです。JSONの本文を持つHTTPリクエストで、逆方向に送られるだけです。リバースAPIと呼ばれることもあります。重要な違いは、誰が通信を開始し、誰が受信のためにオンラインでいる必要があるかです。

ポーリングとWebhookのどちらを使うべきですか?

必要なイベントについて提供元がWebhookを用意していて、公開HTTPSエンドポイントを運用できるならWebhookを使いましょう。Webhookがない場合、ファイアウォールの内側にいる場合、1分程度の遅れが問題にならない少数の確認であれば、ポーリングを使います。

Webhookが本当に提供元から来たとどうやってわかりますか?

多くの提供元は、自分と相手しか知らないシークレットで計算した本文のHMAC SHA-256をヘッダーで送ってきます。たとえばGitHubはsha256=プレフィックス付きのX-Hub-Signature-256を、Stripeはタイムスタンプ付きのStripe-Signatureを使います。何かを信頼する前に、再計算して比較してください。

エンドポイントが停止していたらどうなりますか?

多くの提供元は、失敗した配信を試行の間隔を広げながら、提供元ごとに決まった期間リトライします。たとえばStripeは本番イベントを最大3日間リトライし続けます。それを過ぎると、イベントはAPIかダッシュボードからしか取得できません。

Webhookのハンドラーが処理の前に応答すべきなのはなぜですか?

提供元が応答を待つ時間は短いからです。コードが先にメールを送ったりほかのサービスを呼び出したりすると、すでに処理済みでも配信がタイムアウトしてリトライされることがあります。ジョブをキューに入れて200を返し、処理はその後で行いましょう。

プル:APIを呼び出す

プッシュ:Webhookを受信する

両方を組み合わせる

署名を確認するWebhook受信側

NodeとExpress:生の本文に対するHMAC SHA-256

express.rawで本文をバイト列のまま保持し、署名が一致するようにします。このヘッダー形式はGitHubのsha256=の慣例に従っています。ほかの提供元ではヘッダー名を変えてください。

リトライと重複の扱い

イベントIDに一意インデックスを付けると、2回目の配信では挿入が失敗するため、イベントが何回届いても処理は1回だけ実行されます。

各イベントIDを1回だけ記録する(PostgreSQL)

ON CONFLICT DO NOTHINGは重複の場合に行を返さないので、コードではそれを処理済みとして扱います。

ポーリングという代替手段

ポーリングは運用が簡単ですが、遅く通信量も多くなります。カーソルを保持し、毎回のポーリングで新しいものだけを要求しましょう。

HMAC SHA-256署名チェッカー

本文とシークレットを貼り付けると、提供元が送るはずの署名を計算します。受け取ったヘッダーを貼り付ければ比較できます。すべてWeb Crypto APIを使ってブラウザー内で動作し、どこにも送信されません。

生のリクエスト本文

Webhookシークレット

この本文に付くべき署名

受け取った署名ヘッダー(任意)

一致:この本文とシークレットからこの署名が得られます。

不一致:本文が変わったか、シークレットが間違っているか、ヘッダーが別の形式です。

計算中

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る