개요

여러 빌더사(ex. cafe24, shopify)의 웹훅을 받아서 처리하려고 하면 HMAC을 항상 검증하라는 안내가 나와있다. HMAC 검사를 하지 않아도 잘 동작이 되고 큰 문제가 없을것 같았지만 빨간 글자로 필수라고 까지 안내가 나와있었기 때문에 HMAC에 대해서 좀 더 알아보고 왜 HMAC을 써야만 하는지에 대해서 알아보자.

cafe24 hmac 설명

HMAC 이란?

HMAC은 Hash-based Message Authentication Code 의 약자다. 해시 기반 메시지 인증코드를 나타낸다. HMAC은 무결성과 인증을 위해 사용 되는 암호화 기술이다.

HMAC 은 일방향 해시함수와 비밀키를 이용하여 메시지에 대한 인증 코드를 생성한다. 해시함수는 임의 길이의 메시지를 고정된 길이의 해시값으로 변환하는 알고리즘. HMAC은 이러한 해시 함수를 사용하여 메시지를 해시한 후 비밀키를 추가로 활용하여 인증코드를 생성한다. 일반적인 해시함수와의 차이점은 사전공유된 키와 메세지를 함께 해시함수를 통하여 해시값으로 만들고 이를 통하여 무결성을 검증한다는 점이다.

HMAC의 목적

  • 메시지 무결성 보호 : HMAC을 사용하여 메시지가 변조되었는지를 확인할 수 있다. 비밀키를 알지 못하는 사람은 올바른 HMAC을 생성할 수 없어 메시지 변경을 캐치할 수 있다.
  • 메시지 인증 : HMAC은 메시지의 송신자가 메시지를 생성한 것임을 인증하는데 사용할 수 있다. HMAC을 생성할 수 있는 비밀키는 송신자만 알고있어서 올바른 HMAC이라면 올바른 송신자일 가능성이 높다.

키 사전공유

HMAC을 사용하는데 있어서 가장 중요한 부분 중 하나는 키의 사전 공유이다. 키가 안전하게 공유되지 않는다면 HMAC을 사용하는 이유가 없어지게 된다. 키를 사전공유하는 방법은 여러가지가 있다.

  1. 직접 공유 : 가장 간단한 방법으로 안전한 채널을 통하여 공유한다. 이때 다른 누구에게도 노출되면 안된다
  2. 비밀 키 교환 : 공개 키 암호화를 사용하여 키 교환 프로토콜을 통해 안전하게 키를 공유할 수 있다.
  3. 키 관리 시스템(KMS) : 큰 조직에서는 키 관리 시스템을 사용하여 키를 안전하게 관리하고 배포할 수 있다.
  4. 인증서 기반 키 교환 : 인증서를 사용하여 서로의 신뢰를 확인하고 키를 안전하게 교환할 수 있다. TLS 프로토콜에서는 서버와 클라이언트 간의 통신을 보호하기 위해 인증서가 사용된다.
  5. 사전 공유된 키(Pre-Shared Key, PSK) : 일부 보안 프로토콜에서는 사전 공유된 키를 사용하여 통신을 보호한다.

HMAC에 사용되는 알고리즘

HMAC에 사용되는 알고리즘은 당연히 해시 함수 알고리즘이 사용된다. 그중에서 가장 많이 사용되는 알고리즘은 SHA-256 이다. SHA-256은 안전성 뿐만아니라 널리 지원되는 알고리즘이고 효율성 및 표준화에도 다른 알고리즘보다 우수한 면이 있어서 SHA-256이 주로 사용된다. 주로 사용되는 알고리즘일 뿐이지 다른 해시 함수 알고리즘을 사용하지 않는것은 아니다.

HMAC 만 사용한다고 해서 안전할까?

HMAC 만 사용한다고 해서 완벽하게 안전하다고 할 수 없다. 그래서 보통 HTTPS와 함께 사용한다. HMAC은 비밀키가 없다면 위변조가 불가능하지만 메세지를 같이 보내기 때문에 HTTPS와 같은 안전한 통신을 사용해야한다. HTTPS는 데이터를 암호화하여 중간자 공겨을 방지하고 HMAC은 데이터 전송 중 변경되지 않음을 확인할 수 있다. 이를 통해 좀 더 안전한 데이터 무결성을 보장할 수 있게 된다.

HMAC의 문제점

지금까지 살펴본 내용은 모두 HMAC을 무조건적으로 사용하여야하고 그래야만 안전할 것 같았다. 하지만 무조건 좋은점만 있는 것은 아니다. 우선 키의 관리고 매우 중요하다. 키가 노출되거나 탈취되면 보안의 성능이 크게 저하될 수 밖에 없다. 또한 안전하지 않은 해시 함수를 사용하게 되면 이 점이 암호 분석 공격의 대상이 될 수 있다. 또한 해시함수를 통해서 추가 계산이 필요한데 모든 메세지를 통해 해싱하게 되므로 대용량 데이터를 처리할 때 성능저하가 발생할 수 있다.

타임스탬프와 함께 사용하면

올바른 HMAC은 데이터 무결성과 인증을 보장하는데 매우 강력하다. 매우 강력하지만 추가적으로 타임스탬프와 함께 사용하게 되면 단점을 더 보완하고 강력한 무결성과 인증을 보장할 수 있다.

  1. 재생 공격 방지 : 타임스탬프를 사용하면 HMAC을 생성한 시간을 포함하여 메시지를 서명할 수 있다. 이를 통해 이전 캡처한 HMAC을 재사용하는 공격을 방지할 수 있다.
  2. 메시지 수명 관리 : 타임스탬프를 사용하면 메시지의 수명을 관리할 수 있다. 메시지 수명이 만료되면 해당 메시지를 거부 할 수 있다.
  3. 동사 요청에 대한 처리 : 타임스탬프를 통해서 동시에 들어오는 요청에 대해서 순서 및 유효성을 확인할 수 있다.

타임스탬프를 사용할때 중요한점은 서버와 클라이언트의 시계가 일치해야한다. 일치하지 않는다면 예기치 못한 오류가 발생할 수 있다.

0개의 댓글