본인확인 결과조회 API
해당 페이지는 NHN KCP 본인확인 V2의 결과조회 요청 및 응답에 대해 설명합니다.
본인확인 결과조회는 인증 완료 후 가맹점 Ret_URL로 전달된 결과가 정상인 경우, 거래등록키와 주문번호를 이용해 인증 결과 데이터를 조회하는 API입니다.
결과조회 요청은 암호화하지 않은 평문 JSON으로 전송하며, 정상 응답으로 받은 enc_cert_data와 rv는 NHN KCP에서 제공하는 라이브러리의 decryptJson 함수를 이용해 복호화합니다.
요약
대상 서비스
본인확인 V2
HTTP Method
POST 방식으로 JSON Body를 전송합니다.
Content-Type
application/json; charset=utf-8 형식으로 요청합니다.
통신 보안
TLS 1.2 이상 환경에서 통신합니다.
테스트 URL
https://testcert.kcp.co.kr/api/query/getCertData.do
운영 URL
https://cert.kcp.co.kr/api/query/getCertData.do
Request Body
암호화를 적용하지 않은 평문 JSON을 전송합니다.
정상 응답 기준
res_cd 값이 0000이면 정상 처리입니다.
요청 정보
Request Header 예시
Content-Type: application/json site_cd: AO7F3
Header 파라미터
본인확인 거래등록과 결과 조회에는 동일한 사이트코드를 사용합니다.ex) site_cd: AO7F3
Request Body 예시
{
"reg_cert_key": "1234567890123456",
"ordr_idxx": "TEST1234567890"
} 요청 파라미터
인증 결과 Callback으로 전달된 값이 가맹점 DB에 저장된 거래등록키와 일치하는지 검증한 후 사용합니다.ex) reg_cert_key: 1234567890123456
본인확인 거래등록 요청 시 사용한 값과 동일한 주문번호를 입력합니다.ex) ordr_idxx: TEST1234567890
응답 정보
결과조회 실패 시 res_cd와 res_msg 외의 응답 데이터는 리턴되지 않습니다.
정상 응답으로 받은 enc_cert_data와 rv는 반드시 함께 복호화하고, 원문 인증정보와 암호화 키가 웹이나 로그에 노출되지 않도록 관리하세요.
Response Body 예시
{
"res_cd": "0000",
"res_msg": "정상처리",
"enc_cert_data": "EqdEAebCPHh...",
"rv": "Q2hhbmd1VGh...HQ="
} 응답 파라미터
응답으로 받은 rv와 함께 NHN KCP 제공 라이브러리의 decryptJson 함수에 전달하여 복호화합니다.ex) enc_cert_data: EqdEAebCPHh...
결과조회 응답으로 받은 enc_cert_data와 한 쌍으로 사용하며, 값을 변경하거나 다른 응답의 값과 혼합하지 않습니다.ex) rv: Q2hhbmd1VGh...HQ=
구현 참고사항
첨부한 JSP 샘플의 Callback 검증, 결과조회 API 호출, 응답 확인 및 decryptJson 복호화 방식을 기준으로 작성했습니다.
JSP 샘플 구현 포인트 보기
인증 결과 Callback으로 받은 reg_cert_key를 가맹점에 저장된 거래등록키와 비교한 후, 거래등록 단계에서 저장한 주문번호와 함께 결과조회 API를 호출합니다.
// Callback 거래등록키 검증 String callbackRegCertKey = request.getParameter("reg_cert_key"); String storedRegCertKey = loadRegCertKeyFromDatabase(); String storedOrderId = loadOrderIdFromDatabase(); if (!storedRegCertKey.equals(callbackRegCertKey)) { throw new IllegalArgumentException("거래등록키가 일치하지 않습니다."); }
// 본인확인 결과조회 요청 JSON 구성 JSONObject body = new JSONObject(); body.put("reg_cert_key", storedRegCertKey); body.put("ordr_idxx", storedOrderId); String jsonBody = body.toJSONString(); URL url = new URL("https://testcert.kcp.co.kr/api/query/getCertData.do"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("site_cd", "AO7F3"); try (OutputStream os = conn.getOutputStream()) { os.write(jsonBody.getBytes(StandardCharsets.UTF_8)); os.flush(); }
// 정상 응답 데이터 복호화 JSONObject queryResult = (JSONObject) new JSONParser().parse(responseBody); String resCd = (String) queryResult.get("res_cd"); String encCertData = (String) queryResult.get("enc_cert_data"); String rv = (String) queryResult.get("rv"); if ("0000".equals(resCd)) { String certDataJson = Crypto.decryptJson(encCertData, rv, encKey, siteCd); JSONObject certData = (JSONObject) new JSONParser().parse(certDataJson); // CI, DI, 이름, 생년월일 등 필요한 인증정보를 서버에서 처리 }
샘플은 세션에 거래등록키와 주문번호를 저장하지만, 운영 환경에서는 DB나 별도 보안 저장소에서 조회하고 Callback 값과 일치 여부를 검증하는 방식을 사용하세요. 결과조회가 끝난 거래등록키는 재사용되지 않도록 처리하는 것이 안전합니다.