이 문서에서는 앱 사용자가 자신의 사용자 사진에 대한 변경 사항을 게시할 때마다 나에게 알림을 보내도록 Webhooks를 설정하는 방법을 설명합니다. 이 Webhooks를 설정하는 방법을 이해하면 모든 Webhooks를 설정하는 방법을 알게 될 것입니다.
어떠한 Webhooks를 설정하든 다음과 같은 단계를 따라야 합니다.
이러한 단계는 아래에 자세히 설명되어 있습니다.
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.
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:
GET https://www.your-clever-domain-name.com/webhooks? hub.mode=subscribe& hub.challenge=1158201444& hub.verify_token=meatyhamhock
Parameter | Sample Value | Description |
---|---|---|
|
| This value will always be set to |
|
| An |
|
| 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.
Whenever your endpoint receives a verification request, it must:
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).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.
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" }
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 |
---|---|---|
| The object's type (e.g., |
|
| An array containing an object describing the changes. Multiple changes from different objects that are of the same type may be batched together. |
|
| The object's ID |
|
| 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. |
|
| 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. |
|
| A UNIX timestamp indicating when the Event Notification was sent (not when the change that triggered the notification occurred). |
|
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:
X-Hub-Signature-256
header (everything after sha256=
). If the signatures match, the payload is genuine.Your endpoint should respond to all Event Notifications with 200 OK HTTPS
.
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 제품을 추가하고 구성합니다. Instagram을 제외한 모든 Webhooks에 대해 /{app-id}/subscriptions
엔드포인트를 사용하여 프로그래밍 방식으로 구성할 수도 있습니다.
이 예시에서는 대시보드를 사용하여 앱 사용자의 사진 변경 사항을 구독하는 Webhooks를 구성할 것입니다.
콜백 URL 필드에 엔드포인트의 URL을 입력하고 확인 토큰 필드에 문자열을 입력합니다. 이 문자열은 모든 인증 요청에 포함됩니다. 샘플 앱 중 하나를 사용하는 경우 이는 앱의 TOKEN
구성 변수에 사용한 것과 동일한 문자열이어야 합니다.
확인 및 저장을 클릭하면 검증해야 하는 인증 요청이 엔드포인트로 전송됩니다. 엔드포인트가 요청을 성공적으로 검증하면 다음과 같은 내용이 표시됩니다.
마지막 단계는 개별 필드를 구독하는 것입니다. photos
필드를 구독하고 테스트 이벤트 알림을 전송합니다.
엔드포인트가 올바르게 설정되면 페이로드를 검증하고 검증 성공 시 실행하도록 설정된 코드를 실행합니다. 샘플 앱을 사용 중인 경우 웹 브라우저에서 앱의 URL을 읽어들이세요. 그러면 페이로드 콘텐츠가 다음과 같이 표시됩니다.
상호 TLS(mTLS)는 상호 인증에 사용됩니다.
mTLS를 사용하면 네트워크 연결을 하는 양쪽 당사자가 올바른 비공개 키를 가지고 있는지 인증함으로써 서로의 신원을 보장할 수 있습니다. 각 TLS 인증서에 있는 정보가 추가적인 인증을 제공합니다.
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
)을 인증하기 위한 다음 단계를 완료하세요.
client.webhooks.fbclientcerts.com
) 인증참고: Webhooks를 수신하는 사람은 HTTPS를 사용해야 합니다. Meta에서는 보안을 위해 항상 HTTPS 서버에서 보낸 인증서를 확인합니다.
서버 설정에 따라 위 단계의 세부 정보가 달라집니다. 이는 Nginx에 대한 예시 한 개, AWS Application Load Balancer(ALB)에 대한 예시 한 개, 이렇게 두 가지 예시로 설명됩니다.
루트 인증서(DigiCert High Assurance EV Root CA)를 DigiCert 서버로 다운로드합니다(예: /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem
).
mTLS by Nginx 지침을 활성화합니다(스크린샷 예시).
ssl_verify_client on;
ssl_client_certificate /etc/ssl/certs/DigiCert_High_Assurance_EV_Root_CA.pem;
ssl_verify_depth 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";
}
“client.webhooks.fbclientcerts.com”
과 동일한지 확인합니다.Webhooks를 설정하는 방법을 살펴보았으므로, 이제 특정 제품을 위한 Webhooks를 설정할 때 필요한 추가 단계를 설명하는 다른 문서를 참조할 수 있습니다.