HMAC 서명 만들기
웹훅이 보낸 서명이 맞는지 확인할 때, 받은 요청 본문을 ‘메시지’에, 서명 헤더 값을 ‘비교할 서명’에 붙여넣으세요.
HMAC 서명은 무엇이고 언제 쓰나요
HMAC(해시 기반 메시지 인증 코드)은 비밀 키와 메시지를 함께 해시해서 만든 서명이에요. 키를 아는 사람만 같은 서명을 만들 수 있어서, 결제·쇼핑몰·메신저 같은 서비스가 보내는 웹훅이 진짜인지, API 요청이 중간에 바뀌지 않았는지 확인하는 데 쓰여요. JWT의 HS256 서명도 HMAC-SHA256이에요.
쓰는 방법
비밀 키와 메시지를 넣으면 결과가 바로 나와요. 키나 메시지가 16진수·Base64로 주어졌다면 형식을 바꿔 주세요(예: 서비스가 키를 Base64로 준 경우 글자 그대로 넣으면 다른 서명이 나와요). 서비스마다 서명을 16진수로 주기도 하고 Base64로 주기도 하니 ‘결과 형식’을 맞추세요. ‘비교할 서명’에 받은 값을 붙여넣으면 형식(16진수 대·소문자, Base64, Base64URL, ‘sha256=’ 머리말)을 알아서 맞춰 비교해요.
서명이 다르게 나오는 가장 흔한 이유는 메시지가 한 글자라도 다른 것이에요. 웹훅은 받은 요청 본문을 JSON으로 다시 정리하지 말고 받은 그대로(빈칸·줄바꿈 포함) 넣어야 해요. 서비스에 따라 ‘시간값 + 점 + 본문’처럼 여러 값을 이어 붙여 서명하기도 하니 그 서비스의 문서를 확인하세요.
계산 방식과 주의할 점
RFC 2104의 HMAC 정의대로, 키를 해시 블록 크기(SHA-256은 64바이트, SHA-512는 128바이트)에 맞춰 ipad·opad와 섞은 뒤 두 번 해시해요. 결과는 파이썬 hmac.new(key, msg, hashlib.sha256)과 같고, 그 값으로 검증했어요. 운영 서버에서 서명을 비교할 때는 hmac.compare_digest처럼 시간이 일정한 비교 함수를 써야 해요.
실제 운영 키는 가능하면 테스트용 키로 확인하고, 화면을 공유하지 마세요. 이 도구는 키와 메시지를 어디에도 보내거나 저장하지 않아요.
참고한 자료
자주 묻는 질문
HMAC과 그냥 SHA-256 해시는 뭐가 달라요?
해시는 누구나 같은 값을 만들 수 있지만, HMAC은 비밀 키가 있어야 같은 값을 만들 수 있어서 ‘보낸 사람 확인’이 돼요.
키를 Base64로 받았어요.
‘키 형식’을 Base64로 바꾸세요. 글자 그대로 넣으면 키 바이트가 달라져 서명이 달라져요.
HMAC-MD5·SHA1도 안전한가요?
HMAC 구조 덕분에 당장 깨지지는 않았지만 새로 만드는 시스템에는 HMAC-SHA256 이상을 권해요.
함께 쓰면 좋은 도구
- 해시 계산·파일 체크섬 확인 (MD5·SHA-256·SHA-512·CRC32)글자나 파일의 MD5·SHA-1·SHA-256·SHA-512·SHA3·CRC32 값을 한 번에 계산하고, 받은 체크섬과 같은지 비교
- JWT 디코더 (토큰 내용 보기·서명 검증·만들기)JWT 토큰의 헤더·내용(클레임)·만료 시각을 한국 시간으로 보고, HS256·RS256·ES256 서명 검증, HS256 토큰 만들기
- Base64 인코딩·디코딩 (글자·파일 ↔ Base64)글자(한글 UTF-8)를 Base64로, Base64를 글자로, 파일·이미지를 data URI로, Base64를 파일로 저장
- 유닉스 시간 변환 (타임스탬프 ↔ 한국 시간 날짜)1700000000 같은 타임스탬프를 한국 시간·UTC 날짜로, 날짜를 타임스탬프로. 초·밀리초·마이크로초 자동 인식, 여러 줄 한꺼번에
- JSON 정리 (보기 좋게 들여쓰기·검증·압축)JSON을 보기 좋게 들여쓰기, 오류 위치 표시, 한 줄 압축, 키 정렬, 문자열 이스케이프
- 정규식 테스트 (정규표현식 매칭 확인)패턴과 플래그로 일치하는 부분을 강조 표시, 그룹 값 표, 바꾸기 미리보기, 자주 쓰는 패턴