개요 #
우시페이가 웹훅 엔드포인트로 전송하는 이벤트를 확인합니다.
우시페이 서명 헤더 #
The 우시페이-서명
헤더에는 서명된 각 이벤트에 포함된 타임스탬프와 서명이 포함되어 있습니다.
타임스탬프 앞에는 t=
로 표시되며, 각 서명 앞에는 v1
.
예를 들어
Wooshpay-Signature:t=1492774577,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4
웹훅 비밀 키 #
우쉬페이는 고유한 비밀 키 를 입력합니다. whsec_
서명을 확인하기 전에 다음에서 웹훅 비밀을 검색해야 합니다. webhook.secret
를 웹훅 객체에 추가합니다.
서명 확인 #
비교하여 헤더에 서명 를 예상 서명를 클릭하면 제3자가 아닌 우시페이가 보낸 것인지 확인할 수 있습니다.
서명을 단계별로 확인하려면 아래 가이드를 따르세요:
1단계: 헤더에서 타임스탬프와 서명을 추출합니다. #
헤더를 분할하여 ,
문자를 구분 기호로 지정하여 요소 목록을 가져옵니다. 그런 다음 각 요소를 분할하여 =
문자를 구분 기호로 지정하여 접두사와 값 쌍을 가져옵니다.
접두사 값 t
는 타임스탬프에 해당하고 v1
는 서명에 해당합니다. 다른 모든 요소는 삭제할 수 있습니다.
예를 들어
t=1687845304,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4
2단계: 준비하기 서명_페이로드
문자열 #
The 서명_페이로드
문자열을 연결하여 생성합니다:
- 타임스탬프(문자열)
- 캐릭터
.
- 실제 JSON 페이로드(요청 본문)
예를 들어
1687845304
+.
+JSON 페이로드
1687845304.{
"id": "evt_1NNUrjL6kclEVx6Mb1x5dKJ3",
"object": "event",
"api_version": "2022-11-15",
"created": 1687845303,
"data": {
"object": {
"id": "prod_O9oUVgsSaordCT",
"object": "제품",
"active": true,
"livemode": true,
"name": "test",
"type": "서비스",
"livemode": true,
"pending_webhooks": 1,
"type": "product.created"
}
3단계: 예상 서명 결정하기 #
SHA256 해시 함수를 사용하여 HMAC을 계산합니다.
- 엔드포인트의 웹훅 시크릿을 키에서 다운로드할 수 있습니다.
webhook.secret
웹후크 객체에서 - 사용
서명_페이로드
문자열을 메시지 2단계에서 이미 준비한 것입니다.
를 통해 키 + 메시지를 사용하면 다음과 같은 HMAC 문자열을 계산할 수 있습니다. 예상 서명
예를 들어
public static void main(String[] args) {
String webhookSecret = "whsec_261V2mfsXt1BsOjJbHaQOxnTzhWZKrUE";
문자열 타임스탬프 = "1687845304";
String requestBody = "{\"id\":\"evt_1NNUrjL6kclEVx6Mb1x5dKJ3\",\"object\":\"event\",\"api_version\":\"2022-11-15\",\"created\":1687845303,\"data\":{\"object\":{\"id\":\"prod_O9oUVgsSaordCT\",\"object\":\"product\",\"active\":true,\"livemode\":true,\"name\":\"test\",\"type\":\"service\",\"livemode\":true,\"pending_webhooks\":1,\"type\":\"product.created\"}";
문자열 서명 페이로드 = 타임스탬프+"."+요청 본문;
String signature = hmacSha256(웹훅시크릿,서명된페이로드);
String WooshpaySignature = "t="+타임스탬프+",v1="+서명;
}
/**
* HMAC-SHA256
*/
public static String hmacSha256(String secret, String message) {
String res;
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
mac.init(secretKey);
byte[] hash = mac.doFinal(message.getBytes());
res = Hex.encodeHexString(hash);
} catch (Exception e) {
null을 반환합니다;
}
return res;
}
4단계: 서명 비교 #
비교 헤더에 서명 를 예상 서명.
동일성 일치의 경우, 두 값의 차이를 계산합니다. 현재 타임스탬프 및 수신된 타임스탬프를 클릭한 다음 그 차이가 허용 범위 내에 있는지 결정하세요.
타이밍 공격으로부터 보호하기 위해 상수 시간 문자열 비교를 사용하여 예상 서명과 수신된 각 서명을 비교할 수 있습니다.