검증 기준일: 2026-03-08
이 문서는 아래 공식 자료에서 실제로 확인된 내용만 정리한다.
- 개발가이드 상품 페이지: https://developer.codef.io/products/public/each/pp/nhis-health-check
- 메뉴 상세: https://admin.codef.io/dev-guide-menu/menu-detail/KR_PB_PP_004?mode=real
- 입력 파라미터 명세: https://admin.codef.io/dev-guide-menu/api-input-param/KR_PB_PP_004?mode=real
- 입력 샘플 JSON: https://admin.codef.io/dev-guide-menu/sample/KR_PB_PP_004/in?mode=real
- easycodef-java 저장소: https://github.com/codef-io/easycodef-java
- easycodef-java
EasyCodef.java: https://raw.githubusercontent.com/codef-io/easycodef-java/master/src/main/java/io/codef/api/EasyCodef.java - easycodef-java
EasyCodefConnector.java: https://raw.githubusercontent.com/codef-io/easycodef-java/master/src/main/java/io/codef/api/EasyCodefConnector.java
- 상품명:
건강검진결과 - menuCode:
KR_PB_PP_004 - 라우터:
/products/public/each/pp/nhis-health-check - 엔드포인트:
/v1/kr/public/pp/nhis-health-checkup/result - timeout:
300
공식 입력 파라미터 명세에서 확인된 주요 키:
organizationloginTypecertTypecertFilekeyFilecertPasswordidentitybirthDateidentityEncYnloginTypeLeveluserNametelecomphoneNoidinquiryTypesearchStartYearsearchEndYeartype
연도 관련 공식 키는 searchStartYear, searchEndYear이다. START_YEAR, END_YEAR는 공식 입력 파라미터 명세나 공식 샘플 JSON에서 확인되지 않았다.
공식 간편인증 샘플 JSON에는 다음 키가 포함된다.
{
"organization": "0002",
"loginType": "5",
"loginTypeLevel": "1",
"userName": "홍길동",
"phoneNo": "010********",
"id": "사용자 계정을 식별할 수 있는 유일 값 세팅",
"identity": "19**0101",
"inquiryType": "0",
"searchStartYear": "2021",
"searchEndYear": "2021",
"type": "1",
"telecom": "0"
}공식 샘플 JSON에는 simpleAuth 키가 1차 요청 입력부에 없다.
간편인증 수단 선택 관련 공식 입력 설명은 아래와 같다.
loginType="5"일 때loginTypeLevel필수- 공식 문서에 기재된 주요 값:
1: 카카오톡3: 삼성패스4: KB모바일5: 통신사(PASS)6: 네이버7: 신한인증서8: toss10: NH인증서
loginTypeLevel="5"인 경우telecom필수0: SKT (SKT 알뜰폰)1: KT (KT 알뜰폰)2: LG U+ (LG U+ 알뜰폰)
메뉴 상세 문서에서 확인된 내용:
- 이 상품은 추가인증 대상 상품이다.
- 추가 인증이 필요한 경우 응답 코드가
CF-03002이고data.continue2Way=true가 내려온다. - 추가 인증 방식은
data.method에서 확인한다. - two-way code 목록:
005: 전자서명003: 간편인증001: 보안문자
공식 문서와 easycodef-java 기준으로 정리하면 아래와 같다.
- 이 상품은 "추가인증 대상 상품"이다.
- 하지만
twoWayInfo는 모든 응답에 항상 존재하는 값이 아니다. twoWayInfo는 1차 요청 결과가 추가인증 단계일 때만 필요하다.- 판단 기준:
- 응답 코드가
CF-03002 data.continue2Way=true- 응답에
data.twoWayInfo또는 동등한 two-way 정보가 존재
- 응답 코드가
- 위 조건일 때만 2차 요청으로 전환한다.
- 2차 요청이 성공하면 최종 응답은 일반 성공 응답(
CF-00000)이 될 수 있으며, 이때는 더 이상twoWayInfo가 필요하지 않다.
즉, "추가인증 대상 상품"과 "twoWayInfo가 항상 내려온다"는 의미는 다르다.
공식 two-way 정보에서 확인된 입력/출력:
- 추가인증 입력 파라미터:
simpleAuth - 설명:
"0": cancel, "1": ok - 추가인증 출력 파라미터:
commSimpleAuth - 입력 샘플:
{
"simpleAuth": "1"
}메뉴 상세 및 easycodef-java에서 공통으로 확인되는 조건:
is2Way는truetwoWayInfo는 포함되어야 함twoWayInfo필수 키:jobIndexthreadIndexjtitwoWayTimestamp
easycodef-java의 requestCertification은 위 조건을 만족하지 않으면 추가인증 요청으로 보지 않는다.
실무 해석상 중요한 점:
- 간편인증 승인 후 2차 요청이 성공하면 최종 응답은
CF-00000일 수 있다. - 이 최종 성공 응답에는
twoWayInfo가 더 이상 포함되지 않을 수 있다. - 따라서 성공 응답의 일반
data필드(resReferenceList,resResultList,resCheckupTarget등)를twoWayInfo로 해석하면 안 된다. CF-00000인데twoWayInfo가 없다는 이유만으로 추가인증 미완료로 처리하면 오동작할 수 있다.
이번 확인에서 본 DEMO 성공 응답 예시는 아래 특성을 가졌다.
result.code = CF-00000result.message = 성공serviceType = DEMOdata.resReferenceList존재data.resResultList = []twoWayInfo없음
이 패턴은 "추가인증이 끝난 성공 응답"으로 해석하는 것이 자연스럽다. 다만 DEMO에서는 실제 결과 목록이 비어 있을 수 있다.
메뉴 상세 문서의 twowayNote에 있는 내용:
- 간편인증 타임아웃:
4분 30초 - 간편인증 시 인증을 완료하지 않고
simpleAuth에"1"을 입력할 경우:2번까지는 재시도3번 시도시 CF-12872 오류 발생
메뉴 상세 문서의 입력부 특이사항:
id는 금융인증서 사용 시 필수 입력id는 간편인증 사용 시 선택 입력- 간편인증에서
id를 입력하면 일정 시간 동안 사용자 계정을 식별하는 값으로 사용된다. - 문서에는 다건 요청을 위해
id값이 필수이며,id를 입력하지 않을 경우 단건 처리라고 설명되어 있다.
메뉴 상세 문서의 입력부 특이사항:
identityEncYn:"Y"birthDate:yymmddidentity: 주민등록번호 뒤 7자리
birthDate: 미입력identity: 주민등록번호 13자리
입력 파라미터 명세에서는 간편인증(loginType="5")일 때 identity 설명이 생년월일(YYYYMMDD)로 기재되어 있다.
EasyCodef.java에는 메서드가 분리되어 있다.
requestProduct(...): 일반 상품 요청requestCertification(...): 추가인증 요청
requestProduct(...)는 is2Way, twoWayInfo가 요청 파라미터에 포함되어 있으면 유효하지 않은 요청으로 본다.
requestCertification(...)는 아래를 확인한다.
is2Way == truetwoWayInfo존재twoWayInfo안에jobIndex,threadIndex,jti,twoWayTimestamp존재
EasyCodefConnector.execute(...)에서 확인된 처리:
bodyMap을 JSON 문자열로 직렬화- 그 JSON 문자열 전체를
URLEncoder.encode(..., "UTF-8")처리 - 인코딩된 문자열을 POST body로 전송
requestProduct(...)는 Accept: application/json 헤더를 설정한다.
EasyCodefConnector에서 확인된 토큰 처리:
- OAuth endpoint는
EasyCodefConstant.OAUTH_DOMAIN + EasyCodefConstant.GET_TOKEN - grant type:
client_credentials - scope:
read - Authorization: Basic clientId/clientSecret
공식 메뉴 상세 문서의 twowayNote에 원인이 직접 기재되어 있다.
- 인증 완료 전
simpleAuth="1"반복 입력 - 2번까지 재시도
- 3번째에
CF-12872
공식 two-way 정보 기준으로 간편인증 추가인증 입력은 simpleAuth이고, 출력 확인 값은 commSimpleAuth이다.
확인 가능한 사실:
- 간편인증 추가인증 입력 샘플에
simpleAuth: "1"이 존재한다. - 간편인증 추가인증 출력 파라미터에
commSimpleAuth가 존재한다.
아래 항목은 위 공식 자료에서 직접 확인된 사실만 기반으로 한 체크리스트다.
- 1차 요청 엔드포인트는
/v1/kr/public/pp/nhis-health-checkup/result - 연도 키는
searchStartYear,searchEndYear - 간편인증 1차 요청은
loginType="5"사용 - 간편인증 수단 선택은
loginTypeLevel로 구분 PASS는loginTypeLevel="5"와telecom(0|1|2) 조합 사용CF-03002또는continue2Way=true일 때만 2차 요청으로 전환- 간편인증 2차 요청은
is2Way=true필요 - 간편인증 2차 요청은
twoWayInfo필수 data.method == simpleAuth인 경우 2차 입력값simpleAuth사용- 최종 성공 응답(
CF-00000)에는twoWayInfo가 없을 수 있음 - 최종 성공 응답의 일반
data필드를 two-way 정보로 오인하면 안 됨 - 간편인증 승인 전에
simpleAuth="1"을 반복 전송하면CF-12872가 발생할 수 있음 - 간편인증 타임아웃은 문서상
4분 30초