Webhook
イベント発生時にサーバーが指定された URL に HTTP リクエストを送信する、プッシュ型の通知メカニズム
APIイベント駆動
Webhook とは
Webhook は、イベントが発生した際にサーバーが事前に登録された URL に HTTP POST リクエストを送信するプッシュ型の通知メカニズムである。「逆 API」とも呼ばれ、クライアントがポーリングする代わりに、サーバーがクライアントに通知する。
GitHub の Push イベント、Stripe の支払い完了、Slack のメッセージ投稿など、SaaS の連携で広く使われている。
ポーリングとの比較
ポーリング: クライアントが定期的に「新しいデータある?」と問い合わせ
[クライアント] → GET /events → [サーバー] → "なし"
[クライアント] → GET /events → [サーバー] → "なし"
[クライアント] → GET /events → [サーバー] → "あり!"
Webhook: サーバーがイベント発生時に通知
[サーバー] → POST /webhook → [クライアント] → "受信!"
| 観点 | Webhook | ポーリング |
|---|---|---|
| リアルタイム性 | 即座 | ポーリング間隔に依存 |
| サーバー負荷 | イベント時のみ | 定期的にリクエスト |
| 実装の複雑さ | 受信エンドポイントが必要 | シンプル |
| 信頼性 | 配信失敗のリトライが必要 | 確実に取得できる |
セキュリティ
署名検証
Webhook の送信元が正当であることを確認するため、HMAC 署名を検証する。
import { createHmac } from 'crypto';
function verifySignature(body: string, signature: string, secret: string): boolean {
const expected = 'sha256=' + createHmac('sha256', secret).update(body).digest('hex');
return timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
べき等性
Webhook は同じイベントが複数回配信される可能性がある (at-least-once)。イベント ID で重複を検出し、べき等に処理する。
信頼性の確保
Webhook の配信が失敗した場合のリトライ戦略:
- 即座にリトライ (1 回)
- 指数バックオフでリトライ (1 分、5 分、30 分)
- 最大リトライ回数に達したら DLQ に移動
- 管理画面で手動再送を提供
SQS を挟むパターン
Webhook を直接処理すると、処理が遅い場合にタイムアウトする。SQS を挟んで非同期処理にする。
[外部サービス] → POST → [API Gateway] → [Lambda A: SQS に送信] → 200 OK
↓
[SQS] → [Lambda B: 実際の処理]
実務での活用方法は関連書籍にも詳しい。