이번에 주어진 일로 쿠팡 파트너스 API 연동을 하게 되었다.
나름 재밌게 한 일이라 이번달 글을 쿠팡 파트너스 API 연동에 대해서 글을 적으려고 한다.
현재 앱에서 상품 상세로 들어가게 되면 해당 상품의 키워드를 찾아 쿠팡 API를 찌르게 되면 키워드에 관련하여 상품 목록이 내려오게 된다.
1. Acess Key와 Secret Key를 생성
- 해당 key는 파트너스 회원에게만 제공되기 때문에 블로그에도 공개하지 않는다.
2. 발급받은 Key를 사용하여 HMAC 서명 생성
- HMAC은 해시 메시지 인증코드의 준말로써 RFC2104 표준 암호화 프로토콜이다.
- 쿠팡 파트너스 API는 HMAC 기반으로 제작되어 모든 request header의 Authorization에 생성한 HMAC signature을 함께 보내야 한다.
- 파라미터 값으로 요청 method, 요청 url, secretKey, accessKey를 함께 보내 이 4가지를 사용하여 HMAC signature을 생성하게 된다.
+public class HmacGenerator {
+
+ private static final String ALGORITHM = "HmacSHA256";
+ private static final Charset STANDARD_CHARSET = Charset.forName("UTF-8");
+
+ public static String generate(String method, String uri, String secretKey, String accessKey) {
+ String[] parts = uri.split("\\?");
+ if (parts.length > 2) {
+ throw new RuntimeException("incorrect uri format");
+ } else {
+ String path = parts[0];
+ String query = "";
+ if (parts.length == 2) {
+ query = parts[1];
+ }
+
+ SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyMMdd'T'HHmmss'Z'");
+ dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
+ String dateTime = dateFormatGmt.format(new Date());
+ String message = dateTime + method + path + query;
+
+ String signature;
+ try {
+ SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(STANDARD_CHARSET), ALGORITHM);
+ Mac mac = Mac.getInstance(ALGORITHM);
+ mac.init(signingKey);
+ byte[] rawHmac = mac.doFinal(message.getBytes(STANDARD_CHARSET));
+ signature = Hex.encodeHexString(rawHmac);
+ } catch (GeneralSecurityException e) {
+ throw new IllegalArgumentException("Unexpected error while creating hash: " + e.getMessage(), e);
+ }
+
+ return String.format("CEA algorithm=%s, access-key=%s, signed-date=%s, signature=%s", "HmacSHA256", accessKey, dateTime, signature);
+ }
+ }
+}
3. HMAC 서명을 사용하여 쿠팡 파트너스 API와 통신
String authorization = HmacGenerator.generate(REQUEST_METHOD, url, secretKey, accessKey);
- 위와 같이 API 통신 시, 헤더에 넣을 authorization을 생성한다.
- 헤맸던 부분
: url 입력 시, 해당 url에 쿼리 스트링이 존재할 때 생략하지 않고 반드시 넣어줘야 한다. 안그러면 잘못된 서명이라고 에러가 난다 .. !!
4. API 통신
- 회사에서 쓰고 있는 API 통신은 2가지 인 것 같다.
1) Feign Client 방식
회사에서는 Rest Template 방식보다 Feign Client 방식을 더 선호한다.
그 이유는
1. Rest Template 처럼 매번 코드 구현을 해줄 필요가 없다.
- interface 구현을 통해 공통 관리가 가능
- 코드 간결
2. 연동하는 각각의 서버마다 설정 정보를 다르게 할 수 있다.
- Time out
- Error 정의
3. response data와 request data 정의하기가 쉽다.
2) Rest Template 방식
- 스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화하고 RESTFUL 원칙을 지킨다.
- 기계적이고 반복적인 코드들을 깔끔하게 정리해준다.
1. 동작 원리
- 어플리케이션이 rest template를 생성하고, url, http 메소드 등의 헤더를 담아 요청한다.
- rest template는 httpmessageconverter를 사용하여 requestEntity를 요청 메시지로 변환한다.
- rest template는 clienthttprequestfactory로 부터 clienthttprequest를 가져와서 요청을 보낸다.
- clienthttprequest는 요청 메시지를 만들어서 http 프로토콜을 통해 서버와 통신한다.
- resttemplate는 responseerrorhandler로 오류를 확인하고 있다면 처리로직을 태운다.
- responseErrorHandler는 오류가 있다면 ClientHttpResponse에서 응답 데이터를 가져와서 처리한다.
- RestTemplate는 HttpMessageConverter를 이용해서 응답 메시지를 java object로 변환한다.
- 어플리케이션을 반환
3) 두 방식의 차이
- FeignClient는 async 가 안 된다. (async 를 붙여도 실제로는 비동기식으로 처리되지 않는다.)
- RestTemplate은 된다.
- 실시간으로 계속 추적을 해야 하는 서비스는 응답을 보내고 받을 때까지 기다리면 안 되기 때문에 비동기식으로 해야 한다. 이때 쓰이는 서비스가 Message Queue이다.
'배움 기록_실무 ✏️' 카테고리의 다른 글
구글 OAuth2 인증 방식 (0) | 2022.03.29 |
---|---|
OAuth 동작 방식 (1) | 2022.03.29 |
Spring batch 개발 (4) | 2022.02.10 |
JWT에 대해서 (1) | 2022.01.10 |
AWS SQS (1) | 2021.04.16 |