REST API 관련 컨설팅 중 학습한 내용을 공유합니다.
한 고객사의 요청으로 Unleashed 사의 REST 서비스와 연동을 진행했습니다.
그 과정 중 HMAC(해시 기반 메시지 인증 코드) 구현 과정을 공유합니다.
HMAC은 Unleashed 사 뿐아니라 AWS의 REST API 연동에도 사용되는 등 많은 REST 서비스에 구현되는 내용입니다.
MAC과 HMAC
먼저 MAC(Message Authenticate Code: 메시지 인증 코드)를 살펴봅니다.
(출처: https://ko.wikipedia.org/wiki/메시지_인증_코드)
MAC는 발신자(Sender)와 수신자(Receiver) 사이에 메시지 변조 여부를 확인하기 위한 메시지 인증 방식입니다.
위 그림을 통해 설명하면,
Sender는 보내는 메시지(MESSAGE)와 지정된 키(Key)를 조합해 MAC을 만들고 메시지와 MAC을 전달합니다.
Receiver는 메시지와 MAC를 수신 후 메시지와 지정된 키를 조합해 MAC을 만들어 수신한 MAC과 비교해 데이터의 위변조를 판단할 수 있습니다.
HMAC(Hashed MAC)는 MAC Algorithm에 해쉬 함수를 적용해 암호화 하는 방식입니다.
HMAC 예시
제가 진행한 Unleashed 사는 API 요청 시 HTTP 해더에 다음 정보를 포함해야 합니다.
- Content-Type, Accept
- api-auth-id
- api-auth-signature
서비스 제공사의 문서를 보면 HMAC-SHA256을 어떻게 만들어야 하는지 안내합니다.
(메소드 시그니처는 쿼리 스트링을 가져와 API Key를 시크릿 키로 HMAC-SHA256 시그니처를 생성해야 한다.)
위에서 API 키는 서비스 등록시 발급받은 값입니다.
쿼리 스트링은 URL 중 "?" 뒤의 문자열입니다. 예를 들면
Customers?customerCode=ACME 중 customerCode=ACME가 쿼리 스트링입니다.
HMAC-SHA256은 다음과 같이 구현할 수 있습니다.
HMAC-SHA256
다음 샘플은 쿼리스트링(ProductCode=XXX)와 API Key(UNLEASHED_API_KEY: 상수)를 이용해 HMAC을 SHA256으로 시그니처를 생성해 HTTP 해더에 추가하는 내용입니다.
uses System.Hash, // sha256 System.NetEncoding; // base64 var signature: string; param: string; begin param := 'ProductCode=' + AProductCode; // PHP: base64_encode(hash_hmac('sha256', $request, $key, true)); signature := TBase64Encoding.Base64.EncodeBytesToString( THashSHA2.GetHMACAsBytes(param, UNLEASHED_API_KEY, SHA256)); RESTRequest1.Params.AddItem('api-auth-id', UNLEASHED_API_ID, pkHTTPHEADER); RESTRequest1.Params.AddItem('api-auth-signature', signature, pkHTTPHEADER, [poDoNotEncode]); end;
추가 학습할 내용
HMAC 인증외에 OAuth 2.0 인증도 많이 사용됩니다.
다음 글을 통해 OAuth 2.0을 통해 카카오 API에 연동하는 내용을 살펴볼 수 있습니다.
- REST API 이해하기
- REST API 서버 개발하기(엔드포인트 구현, RAD 서버 이용)
- REST API 클라이언트 개발하기(REST Client 이용)
- 데이터셋 기반 REST API 개발하기