Webhookでは、サーバーがクライアントにリクエストを送る

ここまでのレッスンでは、リクエストを開始するのは、いつもクライアントでした。Webhookは、この向きを逆にします。サーバーが、クライアントがあらかじめ登録したURLにPOSTを送り、何かのイベントが起きたことを知らせます。クライアントは、そのリクエストを求めていません。

このとき、クライアントのエンドポイントは、インターネットからのリクエストを受け付けるサーバーになります。そのため、クライアントは、届いたWebhookが想定した送信元からのものかを検証する必要があります。検証の方法は、共有シークレットを使った署名の確認です。送信元は、ペイロードから署名を計算し、Webhookに含めて送ります。クライアントは、同じ計算をやり直し、送られてきた署名と一致するかを確認します。これは、JWTの署名を検証する仕組みと同じ技法を、トークンではなくWebhookの本文に使ったものです。

クライアントのエンドポイントに届かない場合や、エラーを返す場合、送信元は、通常、間隔を広げながら再送します。これは、失敗したリクエストの再試行と同じパターンです。送信元には、通知が届いたことを知る、他の手段がないためです。

この課の目標

Webhookがどう通常のリクエストの向きを逆転させるかを説明できる。署名検証と再送が、その向きの逆転が生む何のリスクにそれぞれ対処するかを説明できる。

注文が支払われたと主張するWebhookのペイロードが届いたが、クライアントが共有シークレットで同じペイロードから計算した署名と一致しない。クライアントはどうすべき?