예시
입력 (메시지 + 키)
메시지: GET /api/orders 키: secret-key-1234
출력 (HMAC-SHA256)
3f8b2a4c1d9e7b6f5a2c8d4e1b9f6a3c7d2e8b5a4f1c9d6e3b8a5d2c9f6e3b1a
참고
HMAC 은 message + key 둘 다 필요한 keyed hash. 키 없이는 같은 hash 를 만들 수 없어 메시지 무결성 + 인증을 동시에 보장.
사용법 / 자주 묻는 질문
이런 경우 사용하세요
- API 요청 서명 — AWS Signature V4, Stripe webhook, GitHub webhook 등
- Webhook payload 가 진짜 발신처에서 왔는지 검증
- JWT HS256 알고리즘 학습 — 본질이 HMAC-SHA256
- 메시지 변조 감지 — 키를 모르면 재서명 불가
- 보안 토큰의 무결성 확인 (CSRF 토큰 · session ID 등)
자주 묻는 질문
- Q.HMAC 과 그냥 hash 의 차이는?
- A.SHA-256(message) 은 누구나 만들 수 있어 위조 가능. HMAC-SHA256(message, key) 은 키를 아는 측만 만들 수 있어 진위 보증. 메시지를 누가 보냈는지 확인하려면 HMAC.
- Q.키는 얼마나 길어야 하나요?
- A.SHA-256 기반이라 32바이트(256비트) 이상 권장. 짧은 키는 자동 padding 되지만 공격면이 늘어남. 키는 절대 코드 · 클라이언트에 박지 마세요.
- Q.constant-time 비교가 필요한가요?
- A.예. HMAC 검증 시 단순 `==` 비교는 timing attack 에 취약 — 응답 시간으로 한 글자씩 추측 가능. 서버 코드에서는 `crypto.timingSafeEqual` 같은 함수 사용 필수.
재미있는 사실
HMAC 의 핵심 발견은 '해시 함수에 키를 단순히 붙이면(`hash(key || message)`) 위조가 가능하다' 입니다. SHA-1/SHA-256/MD5 모두 Merkle-Damgård 구조라 length-extension 공격이 통하기 때문이에요. HMAC 의 ipad/opad 더블 hash 는 이걸 깔끔하게 막아줍니다.
Wikipedia — Length extension attackHMAC 은 1996년 Mihir Bellare·Ran Canetti·Hugo Krawczyk 가 CRYPTO 학회에 발표한 'Keying Hash Functions for Message Authentication' 에서 시작됐고, 1997년 RFC 2104 로 표준화됐습니다. IPsec / TLS / JWT(HS256) 모두 같은 뿌리입니다.
RFC 2104 (1997)HMAC 검증은 반드시 constant-time 비교(`crypto.timingSafeEqual` 등)로 해야 합니다. `===` / `strcmp` 는 일치하는 prefix 길이만큼 시간이 길어지는 timing side-channel 을 남기고, 네트워크 너머에서도 통계적으로 측정 가능합니다 — 2009년 Lawson 의 Keyczar 취약점이 유명한 사례.
Wikipedia — Timing attack
관련 도구
- Base64 인코딩 / 디코딩
텍스트를 Base64로 인코딩하거나 디코딩합니다. 브라우저에서 즉시 실행되며 서버로 데이터가 전송되지 않습니다.
- URL 인코딩 / 디코딩
URL에 사용할 수 있도록 텍스트를 퍼센트 인코딩하거나 인코딩된 URL을 디코딩합니다. 브라우저에서 즉시 실행됩니다.
- UUID / ULID 생성기
UUID v4(랜덤) · UUID v7(시간 순서, RFC 9562) · ULID를 브라우저에서 생성합니다.
- JWT 디코더
JWT(JSON Web Token)의 header와 payload를 디코딩하여 표시합니다. 서명 검증은 수행하지 않으며(공개키 필요), 토큰은 브라우저에서만 처리됩니다.
- JWT 생성기 (HMAC)
HS256/HS384/HS512(HMAC-SHA) 알고리즘으로 서명된 JWT를 생성합니다. payload·secret 모두 브라우저에서만 처리 — Web Crypto API 기반.
- SHA 해시
텍스트의 SHA-1·SHA-256·SHA-384·SHA-512 해시를 계산합니다. 브라우저의 Web Crypto API를 사용하며 데이터가 서버로 전송되지 않습니다.
- Hex 인코딩 / 디코딩
텍스트를 16진수로 인코딩하거나 디코딩합니다. UTF-8을 자동 처리하며 공백을 무시합니다.
- HTML 엔티티 인코딩 / 디코딩
HTML 특수 문자(&, <, >, ", ')를 엔티티로 인코딩하거나, 이름/숫자 엔티티를 텍스트로 디코딩합니다.
- 비밀번호 생성기
암호학적으로 안전한 비밀번호·토큰·랜덤 문자열·패스프레이즈를 생성하고 엔트로피를 표시합니다.
- 진수 변환기
BigInt 기반으로 큰 정수까지 2/8/10/16/36진수 변환. 0b/0o/0x 자동 감지.
- URL 파서
URL을 프로토콜·호스트·경로·쿼리·해시로 분해해 한눈에 보여줍니다 (읽기 전용).
- HMAC 검증기
주어진 HMAC 서명이 message + secret 으로 만든 값과 일치하는지 검증합니다. Web Crypto API + constant-time 비교.
- MD5 해시
텍스트의 MD5 해시를 계산합니다. 주의: MD5는 보안용으로 부적합 — 체크섬·레거시 호환에만 사용.
- Punycode (국제화 도메인)
한글·다국어 도메인을 Punycode(xn-- ASCII)로 상호 변환합니다. 브라우저 native URL 사용.
- HTTP 상태 코드
HTTP 상태 코드(1xx-5xx)를 검색·탐색합니다. 설명과 일반 사용 사례 포함.
- User-Agent 파서
User-Agent 문자열을 브라우저·OS·기기·엔진별로 분해합니다.
- Bcrypt 해시
Bcrypt로 비밀번호를 해시하거나 기존 해시와 평문을 검증합니다. salt rounds 조정 가능.
- 쿠키 파서
Cookie 또는 Set-Cookie 문자열을 표로 분해합니다. percent-encoded 값 복원 + Set-Cookie 속성(Path/Domain/Max-Age/SameSite/HttpOnly/Secure) 인식.
- IP / CIDR 계산기
IPv4 주소와 CIDR로 네트워크 주소·브로드캐스트·호스트 범위·서브넷 마스크·호스트 수를 계산합니다.
- cURL 빌더
URL·method·헤더·본문으로 cURL 명령을 만듭니다. JSON content-type 자동.