> For the complete documentation index, see [llms.txt](https://docs.ggwp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ggwp.com/kr/webhooks/receiving-events.md).

# 이벤트 수신

## **이벤트 처리를 위한 일반적인 흐름**

1. 이벤트가 발생(트리거)하면 GGWP 웹후크는 페이로드(POST 요청)를 대상 URL로 전송합니다.
   1. v1.0 : 전송되는 페이로드는 JSON 문자열 형식이며, 키와 값 쌍 사이에 공백이 포함될 수 있습니다. `Content-Type`  헤더는 다음으로 설정됩니다 `application/json` .
   2. v1.1 : 전송되는 페이로드는 공백 없이 JSON 문자열 형식으로 전송됩니다. 이는 HMAC 검증을 위해 페이로드의 공백을 제거하는 추가 단계를 줄여줍니다. `Content-Type`  헤더는 다음으로 설정됩니다 `application/octet-stream` .
2. 들어오는 요청을 HMAC으로 검증하세요. 추가로 서버는(구독 생성 시 설정된) 커스텀 헤더를 인증에 사용할 수 있습니다.
3. 페이로드가 대상 URL에 수신되면, 대상은 **200 상태 코드** 를 반환하여 페이로드를 성공적으로 수신했음을 표시해야 합니다.
4. 1분 내에 200 상태 코드가 반환되지 않으면 시도가 실패한 것으로 간주됩니다. 이벤트에 대한 URL 호출은 최종 포기하기 전 이 후 세 번 재시도됩니다.&#x20;

구독 이벤트를 수신하려면, 고객은 GGWP 웹후크가 전송하는 페이로드를 처리할 수 있는 API를 작성해야 합니다.

## 대상 URL 생성하기

어떤 이벤트 트리거가 발생하면 GGWP는 대상 URL을 호출하여 정보를 전달합니다. 대상 URL은 다음을 지원하는 방식으로 이러한 이벤트를 처리해야 합니다. `POST` API의 메서드.

## 요청 검증

대상 URL로 들어오는 모든 요청은 GGWP에서 온 것인지 확인하기 위해 검증되어야 합니다. 이는 디지털 서명을 계산하여 수행할 수 있습니다. 각 웹후크 요청에는 base64로 인코딩된 `x-ggwp-hmac-sha256` 헤더가 포함되어 있으며, 이는 구독 비밀과 요청에 전송된 데이터를 사용해 생성됩니다.

{% hint style="warning" %}
v1.0 구현의 경우 정확한 서명 검증을 보장하려면 HMAC 다이제스트를 계산하기 전에 페이로드 데이터의 모든 공백을 제거해야 합니다. 이는 형식화나 전송 중에 추가 공백 문자가 포함될 수 있고, 실제 내용에는 영향을 주지 않지만 이를 고려하지 않으면 서명이 일치하지 않을 수 있기 때문입니다.
{% endhint %}

검증하려면 다음 알고리즘에 따라 HMAC 다이제스트를 계산하고, 계산된 HMAC 다이제스트와 헤더 값이 일치하면 웹후크 이벤트가 GGWP에서 전송된 것입니다.

{% code lineNumbers="true" fullWidth="false" %}

```python
# Python 예제

import base64
import hashlib
import hmac
import json


# 웹후크 구독 생성 시 받은 비밀
SECRET_KEY = 'my_secret_key'

def verify_webhook(payload, hmac_header):
    digest = hmac.new(
        SECRET_KEY.encode('utf-8'), 
        json.dumps(payload, separators=(',', ':')).encode("utf-8"),
        digestmod=hashlib.sha256
    ).digest()
    computed_hmac = base64.b64encode(digest)

    return hmac.compare_digest(computed_hmac, hmac_header.encode('utf-8'))

```

{% endcode %}

> GoLang 기반 서버의 경우 v1.1만 사용하는 것이 권장됩니다. v1.0에서의 HMAC 검증은 작동하지 않을 수 있습니다. HMAC 계산은 항상 공백이 제거된(compacted) JSON에서 수행됩니다.

{% code lineNumbers="true" %}

```go
// Go 예제

package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"fmt"
)

// 웹후크 구독 생성 시 받은 비밀
const SECRET_KEY = "my_secret_key"

func verifyWebhook(payload string, hmacHeader string) bool {
	mac := hmac.New(sha256.New, []byte(SECRET_KEY))
	mac.Write([]byte(payload))
	digest := mac.Sum(nil)
	computedHmac := base64.StdEncoding.EncodeToString(digest)
	return hmac.Equal([]byte(computedHmac), []byte(hmacHeader))
}

```

{% endcode %}
