웹훅 지급대행 검증
안녕하세요. 토스페이먼츠 지급대행을 이용중인데,
https://docs.tosspayments.com/reference/using-api/webhook-events 검증을 해보려고 합니다.
그런데, 여러 방식으로 입력해보아도 검증값이 다르게 나와서요.
우선 제가 검증해본 것은 이렇습니다.
개발자 센터 - 웹훅 이벤트 페이지의 이벤트 발생시간의 payload를 가져오고
기존에 웹훅 이벤트를 받았을때의 tosspayments-webhook-transmission-time 헤더값을 가져옵니다.
payload를 json으로 직렬화 한 후
HMACSHA256(payload:tosspayments-webhook-transmission-time) == base64.decode(signature v1 값 2개 순회)
위의 예시 해싱하는 데이터예시는 (일부 데이터 숨김, 날짜데이터는 정확)
"{"eventType":"payout.changed","createdAt":"2024-12-02T12:15:20+09:00","version":"2022-11-16","eventId":"eventId","entityType":"payout","entityBody":{"id":"id","refPayoutId":"regPayId","destination":"destination","scheduleType":"EXPRESS","payoutDate":"2024-12-02","amount":{"currency":"KRW","value":1111},"transactionDescription":"대금지급","requestedAt":"2024-12-02T10:35:02+09:00","status":"COMPLETED","error":null,"metadata":null}}:2024-12-03T11:00:38+09:00"
의 문자열입니다.
혹시나 해서 뒤의 시간부분을 {"2024-12-03T11:00:38+09:00"}, {2024-12-03T11:00:38+09:00} 으로도 진행해보았습니다.
혹시 처리 잘못된 값이 있을까요??
웹훅 이벤트 | 토스페이먼츠 개발자센터
토스페이먼츠에서 제공하는 웹훅 이벤트 목록입니다.
53 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.
말씀하신데로
원본 Json:{createdAt}로 작성하였는데, 동작하지 않네요.
매번 웹훅 요청시마다
tosspayments-webhook-transmission-time 헤더값,
tosspayments-webhook-signature 헤더값이 변경되는데 이거는 상관없는 걸까요?
상점ID의 보안키를 hmac 비밀키로 byte 형식으로 변환하고,
Json:{tosspayments-webhook-transmission-time} <-- 이것도 바이트로 변환 하신거 맞으실까요?
웹훅 을 받으셨으면 받은 웹훅의 payload 에 있는 createdAt 를 가져다가 검증하시는거구요.
tosspayments-webhook-signature 값은 여러개가 될 수 있는데
이 중에 어느 한개와도 일치하면 검증되었다고 판단하시면 됩니다.
HMACSHA256 시크릿키로 상점 보안키를 바이트화 해서 사용하고
해시처리할 데이터에는 payload를 바이트변환후 넣습니다.
웹훅 검증이 목적이므로, 당연히 payload 는 받은 그대로 사용해주셔야하구요~
네 받아온 payload 문자 그대로 payload에 넣어주었습니다. (공백, 줄바꿈등)
괜찮으시다면 해시할 데이터를 어떻게 넣었는지 보여드릴 수 있습니다.
웹훅 을 받으셨으면 받은 웹훅의 payload 에 있는 createdAt 를 가져다가 검증하시는거구요. <<
이게 문서와는 조금 달라서
변경된 사항일까요??
한 3주 전에도 제가 테스트했을 때 검증 값은 문제 없었어서 당시에도 디스코드 문의도 해소 되었었는데요.
확인할 수 있는 웹훅 정보 남겨주시겠어요?
저도 한번 확인해보겠습니다
어떤것을 드리면
확인해주실 수 있을까요??
포스트 생성시 주신 정보가 실제 값인가요?
id같은 값은 제외하고
일자만 남겨서
어떤 웹훅 payload 인지 알아야 검증을 해볼 수 있으니
비교할 웹훅 정보를 요청 드렸습니다.
저도 한번 해보려고요
다 남겨드려도 괜찮을까요?? 기존 페이로드
💡 정보 제출
민감 정보를 안전하게 제출해주세요
여기에 남겨주세요
네 방금 전달드렸습니다.
확인했습니다!
제가 전에 테스트했던 케이스에서는 우연히 createdAt 값이 맞아 떨어졌던것 같네요;;
내용은 정정해둘게요.
저희 웹훅 나갔는데 401 응답을 받았습니다. 200 이 아니어서인지 헤덜 로그에 tosspayments-webhook-* 관련 정보가 없네요.
아 그러면 매번 헤더값을 이용해서 검증하는게 맞군요?
한번 저희 로그로 전송되는 걸로 다시 한번 해보도록 하겠습니다.
네 그렇습니다. 저희쪽 헤더 로그가 없어서 체크까지는 진행 못해봤습니다.
기대리님 제가 로그에 찍인 헤더정보들 드릴테니 한번 부탁드려도 될까요?
네 좋습니다. 저도 다시 한번 해볼게요
💡 정보 제출
민감 정보를 안전하게 제출해주세요
여기에 추가로 남겨주세요 🙏
전달드렸습니다.
네 확인했습니다.
참, payload 확인하다보니 금액이 저희 로그에는
"amount":{"currency":"KRW","value":178020.0} 로 되어 있던데, 아까 제출해주신 정보에는 178020 이더라고요.
이 부분도 체크 한번 부탁 드립니다
아하
저는 개발자센터 -> 웹훅 이벤트에있는
payload를 긁어온건데
개발자센터 웹훅에 지급대행 웹훅 로그가 보이나요?
원래 제공이 안되었었거든요. 언제 추가되었지.. 😅
바꿔보기는 했는데
이벤트 발행 시간 누르면 나오더라구요
.0을 붙이거나 안붙이거나 둘다 안되네요..
아 잠시만요
음 안되는군요..
일단 개발자센터 웹훅 페이로드랑 실제 로그(이전에 검증에 성공했던 로그 포맷) 포맷도 개행문자 등 조금 다른것 같습니다.
개발자센터 말고 웹훅 실제 수신한 payload 를 봐주시는게 맞을것 같고요.
로그에 들어온 payload 랑 공유 주신 signature, transmittionTime 정보로 테스트 했을 때 다른 값이 나오면서 검증 실패하긴 하네요.
실제 웹훅 발송 후 200 처리 되는 건으로 확인을 해봤으면 합니다.
그러면 무조건 200나오게 처리하고
다시 문의드리는게 나을까요?
네 그렇게 해주시면 감사하겠습니다!
네 그런데 다시전송하면 401에러 나오는데
URL 변경을 하지 않았는데 다른 문제가 있을까요?
혹시 처음에 200 떨어졌나요? 저는 401 로그만 5건 확인이 됩니다
200은 안보였고요
1시 40분까지
200 이었으면 재발송이 없을텐데 이상하군요.
웹훅이 들어온것이 확인이되는데
로그를 쌓고있거든요 들어올때마다
아 제가 로깅하려고 바꾼것때문에 오류난것일수도 있어서
다시 배포하고 200응답 드리도록 하겠습니다.
지금 바로 전송하였는데, 확인해주실 수 있을까요??
572e1ab6a75f6675165d2c2d58d44b59692f7f5106d71d90b5155729f91769bc 인데 둘다 안맞네요.
지급대행 관련 팀에 확인해봐야 할 것 같습니다.
시간이 걸릴 것 같네요.
파악 되는대로 업데이트 드리겠습니다
아 괜찮습니다 급한건 아니라서 확인해주시면 감사하겠습니다.
네 감사합니다!
별개로 혹시 mid가 어떻게 되실까요? 개발자센터에서 지급대행웹훅 API 로그 키워드 뭘로 찾아보셨는지 체크해보려고요
redblue_t2 입니다.
아 API 로그가 아니라 웹훅로그 보신거군요.
네 맞습니다.
그럼 API 로그에 안나오는건 그대로네요. 네 확인 감사합니다.
넵!
확인 되었는데, 다음과 같은 이슈였네요.
김태현님께서는 웹훅 나간 payload 그대로 사용하지 않았기 때문에 불일치했었던 케이스이고,
제가 불일치 했던 이유는 보안키를 다른 값을 넣어서 계속 불일치가 나왔네요. 정상적인 보안키로 바꾸고 아래 값으로 성공했습니다.
25917c79024384ed34e666743e8b4936170ea6071540ddeee4c2a6a4acda7465
techsupport@tosspayments.com 로 메일 주시면,
실제 응답 나갔던 payload 를 전달 드리도록 하겠습니다.
기대리님 안녕하세요.
새벽까지 고생많으셨습니다.
저도 어제 의심했던 부분이 payload 받을때 파서에의해 오브젝트로 변경되는 부분이었는데, 이 부분이 맞았나봅니다.
그래서 오늘 다른날에 요청하였던 웹훅 이벤트에 관하여 payload를 문자열로만 받아서 검증하려고 시도하였는데,
또 다시 실패하더라구요.
그래서 검증처리할때 정확히 입력값을 어떻게 넣으시는지(Hash처리되는 데이터 부분) 확인받고자 이메일 드리도록 하겠습니다.
네 확인하였고 관련 내용 메일로 회신 드리도록 하겠습니다.
메일 드렸습니다. 참고 부탁 드릴게요!
기대리님 감사합니다.
시행착오가 다음과 같이 있었네요.
1. 로깅된 값만 믿고 로직에 오류가 없다고 판별한점.
2. 로깅툴의 기본설정이 pretty print 기능을 활용하여 json구조로 변환(이 과정에서 개행이 입력)되고, .0 의 소숫점값이 소실되는점
오랜시간 수정 후 정상 처리되는 것 확인하였습니다.
도움주셔서 감사합니다.
네 공유해주셔서 감사합니다.