여러 빌더사(ex. cafe24, shopify)의 웹훅을 받아서 처리하려고 하면 HMAC을 항상 검증하라는 안내가 나와있다. HMAC 검사를 하지 않아도 잘 동작이 되고 큰 문제가 없을것 같았지만 빨간 글자로 필수라고 까지 안내가 나와있었기 때문에 HMAC에 대해서 좀 더 알아보고 왜 HMAC을 써야만 하는지에 대해서 알아보자.
HMAC은 Hash-based Message Authentication Code 의 약자다. 해시 기반 메시지 인증코드를 나타낸다. HMAC은 무결성과 인증을 위해 사용 되는 암호화 기술이다.
HMAC 은 일방향 해시함수와 비밀키를 이용하여 메시지에 대한 인증 코드를 생성한다. 해시함수는 임의 길이의 메시지를 고정된 길이의 해시값으로 변환하는 알고리즘. HMAC은 이러한 해시 함수를 사용하여 메시지를 해시한 후 비밀키를 추가로 활용하여 인증코드를 생성한다. 일반적인 해시함수와의 차이점은 사전공유된 키와 메세지를 함께 해시함수를 통하여 해시값으로 만들고 이를 통하여 무결성을 검증한다는 점이다.
HMAC을 사용하는데 있어서 가장 중요한 부분 중 하나는 키의 사전 공유이다. 키가 안전하게 공유되지 않는다면 HMAC을 사용하는 이유가 없어지게 된다. 키를 사전공유하는 방법은 여러가지가 있다.
HMAC에 사용되는 알고리즘은 당연히 해시 함수 알고리즘이 사용된다. 그중에서 가장 많이 사용되는 알고리즘은 SHA-256 이다. SHA-256은 안전성 뿐만아니라 널리 지원되는 알고리즘이고 효율성 및 표준화에도 다른 알고리즘보다 우수한 면이 있어서 SHA-256이 주로 사용된다. 주로 사용되는 알고리즘일 뿐이지 다른 해시 함수 알고리즘을 사용하지 않는것은 아니다.
HMAC 만 사용한다고 해서 안전할까?
HMAC 만 사용한다고 해서 완벽하게 안전하다고 할 수 없다. 그래서 보통 HTTPS와 함께 사용한다. HMAC은 비밀키가 없다면 위변조가 불가능하지만 메세지를 같이 보내기 때문에 HTTPS와 같은 안전한 통신을 사용해야한다. HTTPS는 데이터를 암호화하여 중간자 공겨을 방지하고 HMAC은 데이터 전송 중 변경되지 않음을 확인할 수 있다. 이를 통해 좀 더 안전한 데이터 무결성을 보장할 수 있게 된다.
지금까지 살펴본 내용은 모두 HMAC을 무조건적으로 사용하여야하고 그래야만 안전할 것 같았다. 하지만 무조건 좋은점만 있는 것은 아니다. 우선 키의 관리고 매우 중요하다. 키가 노출되거나 탈취되면 보안의 성능이 크게 저하될 수 밖에 없다. 또한 안전하지 않은 해시 함수를 사용하게 되면 이 점이 암호 분석 공격의 대상이 될 수 있다. 또한 해시함수를 통해서 추가 계산이 필요한데 모든 메세지를 통해 해싱하게 되므로 대용량 데이터를 처리할 때 성능저하가 발생할 수 있다.
올바른 HMAC은 데이터 무결성과 인증을 보장하는데 매우 강력하다. 매우 강력하지만 추가적으로 타임스탬프와 함께 사용하게 되면 단점을 더 보완하고 강력한 무결성과 인증을 보장할 수 있다.
타임스탬프를 사용할때 중요한점은 서버와 클라이언트의 시계가 일치해야한다. 일치하지 않는다면 예기치 못한 오류가 발생할 수 있다.