PHP로 카페24 앱을 만들었을 때 hmac 검증하기

 PHP를 사용하여 카페24 쇼핑몰에 사용되는 앱을 만들고 있습니다.

 앱의 관리자 페이지를 접근할 때 사용자 인증을 해야 하는데, 카페24의 페이지를 거쳐서 접근하는 사람만 앱의 관리 페이지에 접근할 수 있게 하는 방식입니다.

 쉽게 말해서 카페24가 제공하는 버튼을 눌러 들어와야 내가 만든 서버에 로그인이 됩니다. 때문에 사용자가 정확한 경로로 접근 했는지 확인을 해야 합니다. 그 방법으로는 요청 파라미터 값으로 들어오는 hmac 값을 검증하는 게 있습니다. (개발자 문서)

 PHP를 사용해 검증하는 소스를 다음과 같이 만들었습니다.

$hmac = $_GET['hmac'];
$key = [SECRET_KEY];
$url = [REQUEST_URL];

// 주소에서 쿼리 문자 분리.
// URL인코딩 되어있는 요청받은 그대로의 주소를 가지고 추출한다.
$query = parse_url($url, PHP_URL_QUERY);
$query = substr($query, 0, strrpos($query, '&'));

// 해시값 생성.
$hash = base64_encode(hash_hmac('sha256', $query, $key, true));

$pass = ($hmac === $hash);

 쿼리 문자열은 파라미터를 가공해 만들지 말고, 요청 URL을 통으로 얻어 앞 부분과, 뒤쪽 hmac 부분을 제거한 다음에 사용하는 것을 추천합니다.

 요청 URL은 URL 인코딩이 되어 있습니다.
hmac 부분이 빠진 쿼리 문자열은 URL 인코딩된 그대로 해시값을 만들어야 합니다.
다만 생성된 해시값과 비교할 hmac 값은 URL 디코딩된 값을 사용해야 합니다.

댓글