Webhook 생성기
Webhook 페이로드 템플릿 생성 및 HMAC 서명 계산
📖 GitHub·Stripe·Slack 웹훅 서명이 다른 이유 가이드 보기
Webhook 생성기란?
Webhook 페이로드 템플릿을 생성하고, 선택한 템플릿에 맞는 실제 플랫폼별 서명 형식으로 HMAC-SHA256 서명을 계산합니다. GitHub는 페이로드 바디 그대로를 해시해 sha256=HEX로, Stripe는 "현재 유닉스 타임스탬프.바디" 문자열을 해시해 t=타임스탬프,v1=HEX로, Slack은 "v0:타임스탬프:바디" 문자열을 해시해 v0=HEX(+타임스탬프 헤더 값)로 각각 다르게 서명을 만듭니다 — 세 플랫폼 모두 이름은 "HMAC-SHA256 서명"이지만 실제로 해시하는 대상 문자열이 서로 다르므로, 템플릿을 바꾸면 출력되는 서명 형식과 계산 방식도 함께 바뀝니다. 시크릿 키를 입력하면 선택된 템플릿에 맞는 형식으로 서명이 자동 계산되어, 수신 서버 쪽 검증 로직을 테스트할 때 실제 값처럼 활용할 수 있습니다.
자주 묻는 질문
HMAC-SHA256 서명이란?
시크릿 키와 메시지(서명 대상 문자열)를 해시 함수로 결합해 만든 인증 코드입니다. 수신 측이 동일한 시크릿으로 같은 문자열을 다시 해시해 값이 일치하면, 발신자가 시크릿을 알고 있고 내용이 변조되지 않았다는 것을 확인할 수 있습니다.
GitHub 템플릿을 선택하면 어떤 형식의 서명이 나오나요?
페이로드 바디 전체를 그대로 HMAC-SHA256 해시해 sha256=HEX 형식으로 표시합니다. 실제 GitHub Webhook의 X-Hub-Signature-256 헤더와 동일한 형식입니다.
Stripe 템플릿을 선택하면 어떤 형식의 서명이 나오나요?
현재 유닉스 타임스탬프를 생성해 "{타임스탬프}.{바디}" 문자열을 HMAC-SHA256 해시하고, t=타임스탬프,v1=HEX 형식으로 표시합니다. 실제 Stripe-Signature 헤더와 동일한 구조이며, 타임스탬프를 서명 대상에 포함시키는 것은 오래된 요청을 재전송하는 리플레이 공격을 막기 위함입니다.
Slack 템플릿을 선택하면 어떤 형식의 서명이 나오나요?
현재 유닉스 타임스탬프를 생성해 "v0:{타임스탬프}:{바디}" 문자열을 HMAC-SHA256 해시하고, v0=HEX 형식과 함께 X-Slack-Request-Timestamp 헤더에 넣을 타임스탬프 값도 함께 표시합니다. 실제 Slack 서명 검증에는 이 두 값이 모두 필요합니다.
생성된 서명을 수신 서버에서 어떻게 검증하나요?
동일한 시크릿으로, 해당 플랫폼이 실제로 서명하는 문자열(GitHub는 바디 자체, Stripe/Slack은 타임스탬프가 결합된 문자열)을 똑같이 재구성해 HMAC-SHA256 해시한 뒤, 수신한 서명 헤더 값과 비교합니다. 문자열 구성 방식이 플랫폼마다 다르므로 이 부분을 혼동하면 시크릿이 맞아도 검증이 항상 실패합니다.
커스텀 JSON도 사용할 수 있나요?
네. Custom 템플릿을 선택하고 원하는 JSON을 직접 입력하면 GitHub와 동일한 방식(바디 전체를 그대로 해시)으로 서명이 계산됩니다.
페이로드 크기 정보는 왜 표시되나요?
바이트 수는 Content-Length 헤더 설정이나 요청 크기 제한 확인에, 문자 수는 로그 분석이나 UI 표시 시 참고용으로 제공됩니다. 멀티바이트 문자(한글 등)가 포함되면 두 값이 다르게 나옵니다.
서명이 서버로 전송되나요?
아니요. 시크릿 키, 페이로드, 서명 계산 전부 브라우저의 Web Crypto API(crypto.subtle)로만 처리되며 네트워크로 전송되지 않습니다.