웹훅 signature 검증부분 질문드립니다!

payout.changed, seller.changed 웹훅 헤더에만 포함되는 웹훅 서명입니다. 토스페이먼츠가 보낸 웹훅인지 검증할 수 있는 값입니다. 검증하는 방법은 아래와 같습니다.

{WEBHOOK_PAYLOAD}:{tosspayments-webhook-transmission-time} 값을 보안 키로 HMAC SHA-256 해싱하세요.

웹훅 헤더에서 v1: 뒤에오는 2개의 값을 모두 base64로 디코딩하세요.

1번에서 해시값과 2번에서 디코딩한 값 중 하나가 일치하면 토스페이먼츠에서 보낸 올바른 웹훅이 맞습니다. 일치하지 않으면 토스페이먼츠에서 보낸 웹훅이 아니고 웹훅 데이터를 신뢰할 수 없습니다. 위에 있는 헤더를 예시로 들면, 아래 둘 중 하나의 값이 true이어야 합니다.

HMACSHA256({WEBHOOK_PAYLOAD}:2024-09-05T12:19:21+09:00) == base64.decode(TvgZ2rrdPJvzhDBOej8UMybv0SHufgwdiv6+OzANJd4=)
HMACSHA256({WEBHOOK_PAYLOAD}:2024-09-05T12:19:21+09:00) == base64.decode(/CSvw0DpqBaCVxUAEbzG2Q/7O9V6epYWyKzwavm4MU4=)
payout.changed, seller.changed 웹훅 헤더에만 포함되는 웹훅 서명입니다. 토스페이먼츠가 보낸 웹훅인지 검증할 수 있는 값입니다. 검증하는 방법은 아래와 같습니다.

{WEBHOOK_PAYLOAD}:{tosspayments-webhook-transmission-time} 값을 보안 키로 HMAC SHA-256 해싱하세요.

웹훅 헤더에서 v1: 뒤에오는 2개의 값을 모두 base64로 디코딩하세요.

1번에서 해시값과 2번에서 디코딩한 값 중 하나가 일치하면 토스페이먼츠에서 보낸 올바른 웹훅이 맞습니다. 일치하지 않으면 토스페이먼츠에서 보낸 웹훅이 아니고 웹훅 데이터를 신뢰할 수 없습니다. 위에 있는 헤더를 예시로 들면, 아래 둘 중 하나의 값이 true이어야 합니다.

HMACSHA256({WEBHOOK_PAYLOAD}:2024-09-05T12:19:21+09:00) == base64.decode(TvgZ2rrdPJvzhDBOej8UMybv0SHufgwdiv6+OzANJd4=)
HMACSHA256({WEBHOOK_PAYLOAD}:2024-09-05T12:19:21+09:00) == base64.decode(/CSvw0DpqBaCVxUAEbzG2Q/7O9V6epYWyKzwavm4MU4=)
해당 부분을 현재 구현하고 있는데요, 질문사항이 있습니다. 1. 보안키를 주어진 바이트 전환 함수로 전환하여 hmac에 비밀키로 넣주면 되는지? 2. {WEBHOOK_PAYLOAD}:{tosspayments-webhook-transmission-time} 해당 부분이 request로 오는 body를 "dict : 헤더의 시간" 로 만들어서 hmac에 넣어 해쉬화 하는게 맞는지? 예시) body = {'a':23}, header= {'time':'0000-00-00'} need_to_encode = "{'a':23}:0000-00-00" 감사합니다.
6 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
솔닥 황혁주
솔닥 황혁주OP23h ago
__object = f"{request_body}:{request_headers['tosspayments-webhook-transmission-time']}"

hex_decode(settings.TOSS_SECURITY_KEY)
encrypt_str = hmac.new(
hex_decode(settings.TOSS_SECURITY_KEY), __object.encode(), hashlib.sha256
).digest()
__object = f"{request_body}:{request_headers['tosspayments-webhook-transmission-time']}"

hex_decode(settings.TOSS_SECURITY_KEY)
encrypt_str = hmac.new(
hex_decode(settings.TOSS_SECURITY_KEY), __object.encode(), hashlib.sha256
).digest()
python3.11환경에서 다음과 같은 코드로 해쉬화 하고 있습니다.
OMG
OMG22h ago
1번) 네, 맞습니다. 보안키를 hmac 의 비밀키로 사용하는게 맞습니다. 바이트형식으로 변환해서 넣어주시면 됩니다. 2번) 수신한 웹훅 페이로드에 웹훅이 발송 시간 createdAt 을 tosspayments-webhook-transmission-time 로 넣어주시면 됩니다. 예를 들어, "createdAt":"2024-11-20T19:00:00+09:00" 이면, 위 기준으로 보면 {"a":23}:{"2024-11-20T19:00:00+09:00"} 이렇게 됩니다. 주의하실 점은 웹훅 검증이기 때문에 웹훅 페이로드에 변경이 있으면 안됩니다.
솔닥 황혁주
솔닥 황혁주OP8h ago
그러면 최종 string은
'{"a":23}:{"2024-11-20T19:00:00+09:00"}'
'{"a":23}:{"2024-11-20T19:00:00+09:00"}'
이 되는건가요?
OMG
OMG8h ago
네 바이트형식으로 변환도 해주셔야합니다.
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.