# Webhook の使用に関するベスト プラクティス

Webhook を使用する場合のセキュリティとパフォーマンスを向上させるには、次のベスト プラクティスに従います。

## 最小限のイベントに登録する

必要な Webhook イベントのみをサブスクライブしてください。 これにより、サーバーで実行する必要がある作業量が減ります。 イベントへのサブスクライブに関する詳細については、「[webhookの作成](/ja/enterprise-server@3.22/webhooks/using-webhooks/creating-webhooks)」と「[webhookの編集](/ja/enterprise-server@3.22/webhooks/using-webhooks/editing-webhooks)」を参照してください。

## Webhook シークレットを使用する

> \[!WARNING]
> 機密情報が誤って公開されないよう、ペイロードの URL には機密情報を**含めない**でください。
> これには、独自の API キーとその他の認証資格情報が含まれます。 代わりに、webhook 配信が GitHub によって送信され、改ざんされていないことを検証するには、webhook シークレットを使用します。 詳しくは、「[Webhook 配信を検証する](/ja/enterprise-server@3.22/webhooks/using-webhooks/validating-webhook-deliveries)」をご覧ください。

Webhook シークレットはエントロピーの高いランダムな文字列にしてください。 サーバーがアクセスできる方法で Webhook シークレットを安全に格納してください。

## HTTPS と SSL 検証を使用する

サーバーで HTTPS 接続が使用されていることを確認してください。 既定では、 GitHub は Webhook を配信するときに SSL 証明書を検証します。
GitHub では、SSL 検証を有効のままにすることをお勧めします。

## 30 秒以内に応答する

サーバーは、webhook 配信を受信してから 30 秒以内に 2XX 応答で応答する必要があります。 サーバーの応答にそれ以上の時間がかかる場合、 GitHub は接続を終了し、配信が失敗したと見なします。

タイムリーに応答するために、Webhook ペイロードを非同期的に処理するキューを設定できます。 サーバーは、Webhook を受信したときに応答し、その後の Webhook デリバリーをブロックすることなく、バックグラウンドでペイロードを処理できます。 たとえば、次のようになります。 [Hookdeck](https://hookdeck.com) などのサービスや、[Resque](https://github.com/resque/resque/) (Ruby) などのライブラリを使用できます。 [RQ](http://python-rq.org/) (Python)、または [RabbitMQ](http://www.rabbitmq.com/) (Java)。

## イベントの処理前にイベントのタイプとアクションを確認する

Webhook のイベントの種類は複数あり、イベントの多くには複数のアクション タイプがある可能性があります。
GitHub は、既存のイベントの種類に新しいイベントの種類と新しいアクションを追加し続けます。 アプリケーションでは、ペイロードを処理する前に、Webhook ペイロードのイベントの種類とアクションを確認するようにしてください。 イベントの種類を確認するには、`X-GitHub-Event` 要求ヘッダーを使用します。 アクション タイプを決定するには、イベント ペイロードで最上位の `action` キーを使用します。

## 配信されなかった場合に再配信する

サーバーがダウンした場合は、サーバーが復帰したら、配信されなかった Webhook を再配信してください。 詳しくは、「[Webhook の再配信](/ja/enterprise-server@3.22/webhooks/testing-and-troubleshooting-webhooks/redelivering-webhooks)」をご覧ください。

## `X-GitHub-Delivery` ヘッダーを使用する

リプレイ攻撃では、不適切なアクターが Webhook 配信をインターセプトし、配信を再送信します。 リプレイ攻撃から保護するために、`X-GitHub-Delivery` ヘッダーを使用して、各配信がイベントごとに一意であることを確認できます。

> \[!NOTE]
> 再配信を要求した場合、`X-GitHub-Delivery` ヘッダーは元の配信と同じになります。

## 参考資料

* [REST API を使用するためのベスト プラクティス](/ja/enterprise-server@3.22/rest/using-the-rest-api/best-practices-for-using-the-rest-api)
* [GitHub アプリを作成するためのベスト プラクティス](/ja/enterprise-server@3.22/apps/creating-github-apps/about-creating-github-apps/best-practices-for-creating-a-github-app)