> For the complete documentation index, see [llms.txt](https://apidoc.tokenpay.me/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://apidoc.tokenpay.me/ko-kr/undefined-1/undefined-4.md).

# 서명 검증

{% hint style="info" %}
팁 (TIP)

가맹점은 다음 단계에 따라 응답 또는 콜백의 서명을 검증할 수 있습니다.

검증된 가맹점의 요청 서명이 올바른 경우, tokenpay는 응답의 HTTP 헤더에 회신 서명을 포함합니다. 가맹점은 응답 서명을 검증하는 것을 권장합니다.

마찬가지로 tokenpay는 콜백의 HTTP 헤더에 콜백 패킷의 서명을 포함합니다. 가맹점은 콜백이 tokenpay에서 전송되었는지 확인하기 위해 콜백 서명을 반드시 검증해야 합니다.
{% endhint %}

### 연결 (Concatenate)

먼저, 가맹점은 응답에서 다음 정보를 가져옵니다.

* HTTP 헤더 `TTPay-Timestamp`의 회신 타임스탬프.
* HTTP 헤더 `TTPay-Nonce`의 회신 무작위 문자열.
* 응답 본문 (Response Body). 인터페이스에서 반환된 순서에 따라 인터페이스를 확인합니다. 순서가 올바르지 않으면 검증에 실패합니다.

서명 문자열은 3줄로 구성되며, 각 줄마다 하나의 매개변수가 있습니다. 줄은 `\n`(줄바꿈, ASCII 인코딩 값 0x0A)으로 끝나며, 마지막 줄에는 `\n`을 추가하지 마십시오. 매개변수 자체가 `\n`으로 끝나는 경우에도 추가로 `\n`을 붙여야 합니다.

```
Reply timestamp\n
Reply random string\n
Reply message body
```

예를 들어 HTTP 회신 메시지는 다음과 같습니다:

```
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 02 Apr 2019 12:59:40 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 2204
Connection: keep-alive
Keep-Alive: timeout=8
Content-Language: zh-CN
TTPay-Nonce: c5ac7061fccab6bf3e254dcf98995b8c
TTPay-Signature: CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvbXILffgAmX4pKql+Ln+6UPvSCeKwznvtPaEx+9nMBmKu7Wpbqm/+2ksc0XwjD+xlvlECkCxfD/OJ4gN3IurE0fpjxIkvHDiinQmk51BI7zQD8k1znU7r/spPqB+vZjc5ep6DC5wZUpFu5vJ8MoNKjCu8wnzyCFdA==
TTPay-Timestamp: 1554209980
Cache-Control: no-cache, must-revalidate

{"app_id":"xxxx"}
```

그러면 서명 문자열은 다음과 같습니다:

```
1554209980
c5ac7061fccab6bf3e254dcf98995b8c
{"app_id":"xxxx"}
```

### 회신 (Reply)

tokenpay 회신 서명은 HTTP 헤더 `TTPay-Signature`를 통해 전송됩니다. (참고: 조판상 줄바꿈이 포함될 수 있으므로 이는 예시이며 실제 데이터는 한 줄에 있어야 합니다.)

```
CtcbzwtQjN8rnOXItEBJ5aQFSnIXESeV28Pr2YEmf9wsDQ8Nx25ytW6FXBCAFdrr0mgqngX3AD9gNzjnNHzSGTPBSsaEkIfhPF4b8YRRTpny88tNLyprXA0GU5ID3DkZHpjFkX1hAp/D0fva2GKjGRLtvYbtUk/OLYqFuzbjt3yOBzJSKQqJsvbXILffgAmX4pKql+Ln+6UPvSCeKwznvtPaEx+9nMBmKu7Wpbqm/+2ksc0XwjD+xlvlECkCxfD/OJ4gN3IurE0fpjxIkvHDiinQmk51BI7zQD8k1znU7r/spPqB+vZjc5ep6DC5wZUpFu5vJ8MoNKjCu8wnzyCFdA==
```

### 판단 (Judgment)

`AES-256-ECB` 방식을 사용하여 서명을 생성합니다([서명 생성](/ko-kr/undefined-1/undefined-2.md) 참조 가능). 생성된 서명을 회신 서명과 비교합니다. 일치하지 않으면 데이터가 변조된 것입니다.
