HMAC이란? 메시지 위변조를 막는 방법

HMAC의 정의

HMAC(Hash-based Message Authentication Code)은 해시 함수와 비밀 키를 결합해서 메시지가 중간에 변조되지 않았음을 증명하는 기술입니다. 흔히 SHA-256 같은 해시 함수와 함께 사용되어 HMAC-SHA256이라는 이름으로 자주 등장합니다. 단순히 해시값만 전달하면 누군가 메시지와 해시값을 동시에 바꿔치기할 수 있지만, HMAC은 오직 발신자와 수신자만 아는 비밀 키를 섞어서 계산하기 때문에 키를 모르는 제3자는 올바른 값을 만들어낼 수 없습니다.

비유하자면 편지를 밀랍으로 봉인하는 것과 비슷합니다. 편지 내용(메시지)에 나만 가진 인장(비밀 키)을 찍어 봉인하면, 받는 사람은 봉인 모양만 보고도 편지가 진짜 나에게서 온 것이고 중간에 뜯기지 않았다는 걸 확인할 수 있습니다. 인장이 없는 사람은 아무리 편지 내용을 똑같이 베껴 써도 똑같은 봉인을 만들 수 없습니다.

동작 원리와 예시

HMAC의 계산 과정은 대략 이렇습니다.

  • 비밀 키와 메시지를 특정 방식으로 결합한다
  • 이를 해시 함수에 한 번 통과시킨다
  • 그 결과를 다시 키와 결합해 한 번 더 해시 함수를 적용한다

이렇게 두 번 해싱하는 구조 덕분에 단순히 hash(key + message)로 만드는 것보다 길이 확장 공격 같은 취약점에 안전합니다. 실제 코드에서는 다음과 같이 간단히 사용할 수 있습니다.

import hmac, hashlib
signature = hmac.new(secret_key, message, hashlib.sha256).hexdigest()

수신자는 같은 비밀 키로 동일하게 계산한 값과 전달받은 signature를 비교해서 일치하면 메시지가 변조되지 않았다고 판단합니다.

실무에서 왜 쓰는지

HMAC은 API 요청 서명, 웹훅(Webhook) 검증, JWT 토큰 서명, 세션 쿠키 무결성 검증 등 다양한 곳에서 쓰입니다. 예를 들어 결제 서비스에서 웹훅으로 결제 완료 알림을 보낼 때, 요청 헤더에 HMAC 서명을 함께 담아 보내면 수신 서버는 이 서명을 검증해서 실제로 신뢰할 수 있는 곳에서 온 요청인지, 데이터가 중간에 조작되지 않았는지 확인할 수 있습니다.

암호화가 데이터를 ‘숨기는’ 것이라면, HMAC은 데이터가 ‘진짜이고 안전한지’를 보증하는 역할을 합니다. 두 개념을 헷갈리지 않는 것이 중요하며, 민감한 정보를 다루는 시스템이라면 HMAC을 통한 무결성 검증을 기본 습관으로 익혀두는 것이 좋습니다.

댓글 남기기