본문 바로가기
해외 오픈마켓 - API/Lazada

[API] Lazada - Signature algorithm

by Johnny's 2023. 4. 17.

Signature algorithm

 

Lazada Open Platform은 각 API 요청의 ID를 확인하고 서버는 호출 매개변수가 유효한지 여부도 확인한다. 따라서  HTTP 요청에는 서명 정보가 포함되어야 하고 Lazada API를 호출 하기 위해서는 서명알고리즘에 대한 이해가 필요하다. 위에 설명된 내용을 정리하면 다음과 같다.

 

* 순서

1. 애플리케이션에 할당된 App Key와 Secret으로 요청의 신원을 확인

2. ASCII 테이블의 매개변수 이름에 따라 모든 요청 매개변수를 정렬

3. 정렬된 매개변수와 해당 값을 문자열로 연결

4. 문자열 앞에 API 이름 추가

5. 연결된 문자열을 UTF-8 형식으로 인코딩하고 서명 알고리즘으로 다이제스트를 만듬(HMAC_SHA256 사용)

6. 다이제스트를 16진수 형식으로 변환

 

비고

다이제스트란? Hash 함수를 통과 하기전의 원본 데이터를 메세지(message)라고 부르고, 통과된 이후의 데이터다이제스트(digest)라고 부른다.

 

GenerateAccessToken - Access Token을 발급받는 것으로 예를 들어 보겠다.

해당 명세를 확인해보면 다음 파라미터 값들이 필요하다.(요청시 필수 값들만 작성했다.(requierd=yes))

 

GET/POST /auth/token/create

Common Parameters app_key, timestamp, sign_method, sign

Parameters code

 

1. App Key, Secret 정보를 가져온다.

const app_key = process.env.APP_KEY;
const app_secret = process.env.APP_SECRET;

2. 모든 요청 매개변수를 정렬한다. (ASC 순서)

// 잘못된 예
sign_methodtimestampcodeapp_key

// 반드시 ASC순으로 정렬해야 한다. 
app_keycodesign_methodtimestamp

 

3. 정렬된 매개변수와 해당 값을 문자열로 연결

app_key${app_key}code${code}sign_method${sign_method}timestamp${timestamp}

 

4. 문자열 앞에 API 이름 추가 (경로)

요청하려고 하는 API 주소를 추가해주고, 문자열로 연결

const path = '/auth/token/create';

let sign_format = ${path}app_key${app_key}code${code}sign_method${sign_method}timestamp${timestamp};
sign_format = sign_format.toString();

 

5 ~ 6. 연결된 문자열을 UTF-8 형식으로 인코딩하고 서명 알고리즘으로 다이제스트를 만들고,(HMAC_SHA256 사용) 다이제스트를 16진수 형식으로 변환

 

SHA256

- SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환
- SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력함

- HMAC SHA256 의 경우엔 데이터를 주어진 비밀키(secret) 와 함께 해싱을 하고, 해싱된 결과물을 비밀키와 함께 다시한번 해싱 함

 

Node js에는 crypto 모듈이 내장 되어있음, crypto 또는 crypto-js 모듈을 사용해서 변환시키면 된다.

const crypto = require('crypto');
const CryptoJS = require('crypto-js');

let stringformat = '/api/test/app_keyMyAppKey';
let appSecret = 'MySecretKey';

//M1
const hash1 = CryptoJS.HmacSHA256(stringformat, appSecret).toString(CryptoJS.enc.Hex);
const sign1 = hash1.toUpperCase();

//M2
const hash2 = crypto.createHmac('sha256', appSecret).update(stringformat).digest('hex');
const sign2 = hash2.toUpperCase();

console.log(sign1 == sign2); // true

 

전체코드

    const app_key = process.env.APP_KEY;
    const app_secret = process.env.APP_SECRET;
    
    const timestamp = new Date().getTime().toString();
    const sign_method = "sha256";
    const code = process.env.CODE;
    const path = '/auth/token/create';

    let sign_format = `${path}app_key${app_key}code${code}sign_method${sign_method}timestamp${timestamp}`;
    sign_format = sign_format.toString();
    
    const sign = crypto.createHmac('sha256', app_secret).update(sign_format).digest('hex').toUpperCase();

 

API를 개발할 때, sign을 만들어 주는 부분을 별도로 함수로 빼서 인자로 sign_format 값 만 전달해서 sign 값을 받아오는 형식으로 사용하면 좋을 것 같다.

 

* 참고

- SHA256 해시 함수 사용하기

- LAZADA API 공식문서 - Signature algorithm

댓글