업무중 외부업체의 서버와 서버간 통신을 할 일이 있었다.
서버간 통신의 보안방법으로 HMAC을 사용하였고, 사용하면서 HMAC이 어떤용도로 어떠한 방식으로 인증이 되는지 정리했다.
MAC은 Message Authentication code의 줄임말로, 메시지를 인증하기 위해서 사용하는 정보이다.
예를들어, 유저 A가 인터넷으로 연결된 유저 B에게 메시지를 보냈다고 가정.
이 메시지에서 A가 보냈다는 것은 매우 중요한 정보를 담고 있으며, 따라서 위조 혹은 변조되면 안된다.
메시지가 인터넷을 가로지르면 메시지 변조와 위조의 위험에 노출된다.
이러한 문제를 해결하기 위해서는 메시지의 무결성과 메시지 인증이 담보되어야 한다.
무결성이란 '메시지가 변조되지 않았다' 는 성질이며 '메시지 인증'이란 올바른 송신자로부터 온 메시지 라는 성질이다.
MAC는 메시지에 붙이는 작은 정보로 이를 이용해서 무결성과 인증 문제를 해결한다.
HMAC이란
HMAC이란 REST API요청을 받았을 때, 이 요청이 신뢰할 수 있는 호출인지 확인하는 방법 중 하나이다.
사용자의 Id와 암호같이 민감한 정보를 직접 받을 필요 없이 사전에 공유한 비밀키와 전송할 메시지를 입력받아서,
HASH 기반의 MAC를 생성해서 전송하며 서버는 비밀키와 메시지를 기반으로 MAC를 검증해서 비밀키를 소유한 클라이언트가 보낸 메시지가 맞는지 인증할 수 있다.
HMAC을 더 안전하게 사용하는 방법
HMAC은 시크릿키가 없다면 메시지의 위변조가 불가능하지만 원문 메시지를 같이 보내야 하므로 보안을 위해 HTTPS와 같이 안전한 전송 채널을 사용하는 것이 좋다
클라이언트가 전송한 요청은 중간에 해커가 가로챌 수 있지만 비밀키가 없다면 위변조 해도 서버의 검증과정에서 에러가 나게 된다.
반대로 비밀키가 유출된다면 해커가 임의로 위변조할 수 있으므로 비밀키를 안전하게 관리하고 유출 우려가 있을 경우 재발급해서 사용해야한다.
클라이언트가 전송한 요청은 중간에 해커가 가로채서 replay attack에 활용할 수 있다.
그래서 전송 메시지에 timestamp나 serial,nonce 등 변하는 값을 포함시키는게 필요하다.
비슷한 보안으로 전자서명이 있는데,
HMAC 대신 전자서명을 사용하면 더 안전하고 견고해지지만 클라이언트에게 인증서를 발급하고 등록 및 분실/만료/재발급/갱신 해야하는 부담이 있다.
특히 전자서명은 HMAC 방식에 비해서 많은 연산을 필요로 하므로 서버 부하가 많이 생기고 속도가 느린 단점이 있기에 REST API 등에는 HMAC을 사용하고 전자계약 등 사용자의 부인 방지가 필요한 업무에만 전자 서명을 사용하는게 좋다.