2021. 1. 14. 22:35ㆍ보안\암호화
MAC이란
MAC의 개념
MAC은 Message Authentication code의 줄임말로, 메시지를 인증하기 위해서 사용하는 정보입니다.
예를 들어, 유저 A가 인터넷으로 연결된 유저 B에게 메시지를 보냈다고 가정합니다. 이 메시지에서 A가 보냈다는 것은 매우 중요한 정보를 담고 있으며, 따라서 위조 혹은 변조되면 안 됩니다. 메시지가 인터넷을 가로지르면 메시지 변조와 위조의 위험에 노출됩니다.
이러한 문제를 해결하기 위해서는 메시지의 무결성과 메시지 인증이 담보되어야 합니다. 무결성이란 '메시지가 변조되지 않았다'는 성질이며, 메시지 인증이란 '올바른 송신자로부터 온 메시지'라는 성질입니다.
MAC는 메시지에 붙이는 작은 정보로 이를 이용해서 무결성과 인증 문제를 해결합니다.
MAC의 동작 원리
- 송신 메시지를 준비합니다.
- 송신 메시지를 MAC 함수에 통과시킵니다.
- MAC 함수를 이용해 메시지를 이용해서 MAC 정보를 만들고 이것을 메시지에 붙입니다.
- 메시지를 수신합니다.
- 수신측 역시 MAC 함수를 이용해서 메시지에 대한 MAC를 생성합니다.
- MAC 함수의 결과로 나온 MAC 정보와 수신 메시지의 MAC 정보가 일치하면, 이 메시지는 안전한 메시지로 인증됩니다.
HMAC이란
HMAC의 개념
HMAC이란 REST API가 요청을 받았을 때, 이 요청이 신뢰할 수 있는 호출인지 확인하는 방법 중 하나입니다. 사용자의 ID와 암호 같이 민감한 정보를 직접 받을 필요 없이 사전에 공유한 secret key와 전송할 message를 입력받아서 Hash 기반의 MAC를 생성해서 전송하며 서버는 secret key와 message를 기반으로 MAC를 검증해서 secret key를 소유한 클라이언트가 보낸 메시지가 맞는지 인증할 수 있습니다.
HMAC의 동작 원리
- 해쉬 생성: 클라이언트는 key + message를 HMAC 알고리즘으로 처리하여 해쉬 값을 만들어 냅니다.
- 요청 보내기: 생성된 해쉬와 message를 HTTP 요청으로 REST API 서버에 보냅니다. 보통 해쉬는 HTTP 헤더 또는 url에 포함됩니다.
- 해쉬 생성: 서버는 클라이언트에게서 받은 요청 내의 message와 본인이 가지고 있던 key를 조합하여 HMAC로 해쉬 값을 생성합니다.
- 비교: 클라이언트에서 넘어온 해쉬와 서버에서 생성된 해쉬가 동일한지 비교합니다. 동일하면 인증 성공입니다.
HMAC을 더 안전하게 사용하는 방법
전송시 안전한 채널(HTTPS)을 사용
HMAC은 secret key가 없다면 message의 위변조가 불가능하지만 원문 message를 같이 보내야 하므로 보안을 위해 HTTPS와 같이 안전한 전송 채널을 사용하는 것이 좋습니다.
Secret key 관리
클라이언트가 전송한 요청은 중간에 해커가 가로챌 수 있지만 secret key가 없다면 위변조해도 서버의 검증 과정에서 에러가 나게 됩니다, 반대로 secret key가 유출된다면 해커가 임의로 위변조할 수 있으므로 secret key를 안전하게 관리하고 유출 우려가 있을 경우 재발급해서 사용해야 합니다.
Reply attach 방지
클라이언트가 전송한 요청은 중간에 해커가 가로채서 replay attack에 활용할 수 있습니다. 그래서 전송 message에 timestamp나 serial, nonce등 변하는 값을 포함하는게 필요합니다.
전자서명과의 비교
HMAC대신 전자 서명을 사용하면 더 안전하고 견고해지지만 클라이언트에게 인증서를 발급하고 등록 및 분실/만료시 재발급/갱신해야 하는 부담이 있습니다. 특히 전자 서명은 HMAC 방식에 비해서 많은 연산을 필요로 하므로 서버 부하가 많이 생기고 속도가 느린 단점이 있으므루 REST API등에는 HMAC을 사용하고 전자계약 등 사용자의 부인 방지가 필요한 업무에만 전자 서명을 사용하는 것이 좋습니다.
참고: https://hanee24.github.io/2018/04/22/hmac-authentication/
참고: https://www.joinc.co.kr/w/man/12/hmac