시작하기

이 문서에서는 앱 사용자가 자신의 사용자 사진에 대한 변경 사항을 게시할 때마다 나에게 알림을 보내도록 Webhooks를 설정하는 방법을 설명합니다. 이 Webhooks를 설정하는 방법을 이해하면 모든 Webhooks를 설정하는 방법을 알게 될 것입니다.

어떠한 Webhooks를 설정하든 다음과 같은 단계를 따라야 합니다.

  1. HTTPS 요청을 처리할 수 있는 안전한 서버에서 엔드포인트를 생성합니다.
  2. 앱의 앱 대시보드에서 Webhooks 제품을 구성합니다.

이러한 단계는 아래에 자세히 설명되어 있습니다.

Create an Endpoint

Your endpoint must be able to process two types of HTTPS requests: Verification Requests and Event Notifications. Since both requests use HTTPs, your server must have a valid TLS or SSL certificate correctly configured and installed. Self-signed certificates are not supported.

The sections below explain what will be in each type of request and how to respond to them. Alternatively, you can use our sample app which is already configured to process these requests.

Verification Requests

Anytime you configure the Webhooks product in your App Dashboard, we'll send a GET request to your endpoint URL. Verification requests include the following query string parameters, appended to the end of your endpoint URL. They will look something like this:

Sample Verification Request

GET https://www.your-clever-domain-name.com/webhooks?
  hub.mode=subscribe&
  hub.challenge=1158201444&
  hub.verify_token=meatyhamhock
ParameterSample ValueDescription

hub.mode

subscribe

This value will always be set to subscribe.

hub.challenge

1158201444

An int you must pass back to us.

hub.verify_token

meatyhamhock

A string that that we grab from the Verify Token field in your app's App Dashboard. You will set this string when you complete the Webhooks configuration settings steps.

Note: PHP converts periods (.) to underscores (_) in parameter names.

Validating Verification Requests

Whenever your endpoint receives a verification request, it must:

  • Verify that the hub.verify_token value matches the string you set in the Verify Token field when you configure the Webhooks product in your App Dashboard (you haven't set up this token string yet).
  • Respond with the hub.challenge value.

If you are in your App Dashboard and configuring your Webhooks product (and thus, triggering a Verification Request), the dashboard will indicate if your endpoint validated the request correctly. If you are using the Graph API's /app/subscriptions endpoint to configure the Webhooks product, the API will indicate success or failure with a response.

Event Notifications

When you configure your Webhooks product, you will subscribe to specific fields on an object type (e.g., the photos field on the user object). Whenever there's a change to one of these fields, we will send your endpoint a POST request with a JSON payload describing the change.

For example, if you subscribed to the user object's photos field and one of your app's Users posted a Photo, we would send you a POST request that would look something like this:

POST / HTTPS/1.1
Host: your-clever-domain-name.com/webhooks
Content-Type: application/json
X-Hub-Signature-256: sha256={super-long-SHA256-signature}
Content-Length: 311

{
  "entry": [
    {
      "time": 1520383571,
      "changes": [
        {
          "field": "photos",
          "value":
            {
              "verb": "update",
              "object_id": "10211885744794461"
            }
        }
      ],
      "id": "10210299214172187",
      "uid": "10210299214172187"
    }
  ],
  "object": "user"
}

Payload Contents

Payloads will contain an object describing the change. When you configure the webhooks product, you can indicate if payloads should only contain the names of changed fields, or if payloads should include the new values as well.

We format all payloads with JSON, so you can parse the payload using common JSON parsing methods or packages.

We do not store any Webhook event notification data that we send you, so be sure to capture and store any payload content that you want to keep.

Most payloads will contain the following common properties, but the contents and structure of each payload varies depending on the object fields you are subscribed to. Refer to each object's reference document to see which fields will be included.

Property Description Type

object

The object's type (e.g., user, page, etc.)

string

entry

An array containing an object describing the changes. Multiple changes from different objects that are of the same type may be batched together.

array

id

The object's ID

string

changed_fields

An array of strings indicating the names of the fields that have been changed. Only included if you disable the Include Values setting when configuring the Webhooks product in your app's App Dashboard.

array

changes

An array containing an object describing the changed fields and their new values. Only included if you enable the Include Values setting when configuring the Webhooks product in your app's App Dashboard.

array

time

A UNIX timestamp indicating when the Event Notification was sent (not when the change that triggered the notification occurred).

int

Validating Payloads

We sign all Event Notification payloads with a SHA256 signature and include the signature in the request's X-Hub-Signature-256 header, preceded with sha256=. You don't have to validate the payload, but you should.

To validate the payload:

  1. Generate a SHA256 signature using the payload and your app's App Secret.
  2. Compare your signature to the signature in the X-Hub-Signature-256 header (everything after sha256=). If the signatures match, the payload is genuine.

Responding to Event Notifications

Your endpoint should respond to all Event Notifications with 200 OK HTTPS.

Frequency

Event Notifications are aggregated and sent in a batch with a maximum of 1000 updates. However batching cannot be guaranteed so be sure to adjust your servers to handle each Webhook individually.

If any update sent to your server fails, we will retry immediately, then try a few more times with decreasing frequency over the next 36 hours. Your server should handle deduplication in these cases. Unacknowledged responses will be dropped after 36 hours.

Note: The frequency with which Messenger event notifications are sent is different. Please refer to the Messenger Platform Webhooks documentation for more information.

Webhooks 제품 구성하기

엔드포인트 또는 샘플 앱이 준비되면 앱의 앱 대시보드를 사용하여 Webhooks 제품을 추가하고 구성합니다. Instagram을 제외한 모든 Webhooks에 대해 /{app-id}/subscriptions 엔드포인트를 사용하여 프로그래밍 방식으로 구성할 수도 있습니다.

이 예시에서는 대시보드를 사용하여 앱 사용자의 사진 변경 사항을 구독하는 Webhooks를 구성할 것입니다.

  1. 앱 대시보드에서 제품 > Webhooks로 이동하고 드롭다운 메뉴에서 사용자를 선택한 다음 이 개체 구독을 클릭합니다.
    사용자 개체 선택
  2. 콜백 URL 필드에 엔드포인트의 URL을 입력하고 확인 토큰 필드에 문자열을 입력합니다. 이 문자열은 모든 인증 요청에 포함됩니다. 샘플 앱 중 하나를 사용하는 경우 이는 앱의 TOKEN 구성 변수에 사용한 것과 동일한 문자열이어야 합니다.

    이벤트 알림 페이로드에 변경된 필드의 이름과 해당 필드의 새로운 값을 포함하려면 값 포함로 설정하세요.
    엔드포인트 URL 및 인증 토큰 문자열 입력
  3. 확인 및 저장을 클릭하면 검증해야 하는 인증 요청이 엔드포인트로 전송됩니다. 엔드포인트가 요청을 성공적으로 검증하면 다음과 같은 내용이 표시됩니다.

    검증 성공
  4. 마지막 단계는 개별 필드를 구독하는 것입니다. photos 필드를 구독하고 테스트 이벤트 알림을 전송합니다.

    사용자 개체에서 사진 필드 구독

    엔드포인트가 올바르게 설정되면 페이로드를 검증하고 검증 성공 시 실행하도록 설정된 코드를 실행합니다. 샘플 앱을 사용 중인 경우 웹 브라우저에서 앱의 URL을 읽어들이세요. 그러면 페이로드 콘텐츠가 다음과 같이 표시됩니다.

    테스트 알림 페이로드를 표시하는 샘플 앱

Webhooks용 mTLS

상호 TLS(mTLS)는 상호 인증에 사용됩니다.

mTLS를 사용하면 네트워크 연결을 하는 양쪽 당사자가 올바른 비공개 키를 가지고 있는지 인증함으로써 서로의 신원을 보장할 수 있습니다. 각 TLS 인증서에 있는 정보가 추가적인 인증을 제공합니다.

mTLS를 구성하는 방법

WhatsApp Business 게정을 구독할 때 mTLS를 활성화하면 Meta가 중간 인증서와 함께 클라이언트 인증서를 표시합니다. 두 인증서는 서버에 보내는 Webhooks 요청의 TLS 핸드셰이크를 만들 때 사용합니다. 그러면 비즈니스의 서버에서 신뢰 체인과 공통 이름(CN)을 통해 이러한 요청을 보낸 사람의 신원을 인증할 수 있습니다.

클라이언트 인증서는 중간 CA 인증서인 DigiCert SHA2 High Assurance Server CA에서 서명된 후, 루트 CA 인증서인 DigiCert High Assurance EV Root CA에서 서명됩니다. 중간 인증서는 graph.facebook.com에 대한 인증서도 서명합니다.

클라이언트 인증서 인증

Webhooks 요청을 수신하기 위한 HTTPS를 설정한 후에 클라이언트 인증서와 공통 이름(client.webhooks.fbclientcerts.com)을 인증하기 위한 다음 단계를 완료하세요.

  1. 루트 인증서 설치
  2. 루트 인증서에 대한 클라이언트 인증서 인증
  3. 클라이언트 인증서의 공통 이름(client.webhooks.fbclientcerts.com) 인증

참고: Webhooks를 수신하는 사람은 HTTPS를 사용해야 합니다. Meta에서는 보안을 위해 항상 HTTPS 서버에서 보낸 인증서를 확인합니다.

서버 설정에 따라 위 단계의 세부 정보가 달라집니다. 이는 Nginx에 대한 예시 한 개, AWS Application Load Balancer(ALB)에 대한 예시 한 개, 이렇게 두 가지 예시로 설명됩니다.

Nginx

  1. 루트 인증서(DigiCert High Assurance EV Root CA)를 DigiCert 서버로 다운로드합니다(예: /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem).

  2. mTLS by Nginx 지침을 활성화합니다(스크린샷 예시).

    ssl_verify_client       on;
    ssl_client_certificate  /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem;
    ssl_verify_depth        3;
    
  3. Nginx 임베디드 변수 $ssl_client_s_dn의 공통 이름이 "client.webhooks.fbclientcerts.com"과 동일한지 확인합니다(스크린샷 예시).

    if ($ssl_client_s_dn ~ "CN=client.webhooks.fbclientcerts.com") {
        return 200 "$ssl_client_s_dn";
    }
    

AWS Application Load Balancer(ALB)

  1. 중간 인증서(DigiCert SHA2 High Assurance Server CA)를 DigiCert에서 S3 버킷으로 다운로드합니다. 루트 인증서는 알고리즘 SHA1withRSA를 사용하여 서명되기 때문에 AWS에서 수락되지 않습니다. 중간 인증서는 SHA256withRSA를 사용하여 인증되기 때문에 AWS에서 수락됩니다.
  2. ALB에서 HTTPS 리스너를 구성하여 S3 버킷의 인증서를 포함하는 트러스트 스토어로 mTLS를 활성화합니다(스크린샷 예시).
  3. 앱 코드의 HTTP 헤더 “X-Amzn-Mtls-Clientcert-Subject”에서 공통 이름을 추출하고 “client.webhooks.fbclientcerts.com”과 동일한지 확인합니다.

다음 단계

Webhooks를 설정하는 방법을 살펴보았으므로, 이제 특정 제품을 위한 Webhooks를 설정할 때 필요한 추가 단계를 설명하는 다른 문서를 참조할 수 있습니다.