이 문서는 카카오톡 인증 서비스의 K1400 인증 표준창 API 사용법을 안내합니다.
K1400 인증 표준창은 카카오에서 이용기관에 제공하는 인증 웹 페이지로 Kakao SDK for JavaScript(이하 JavaScript SDK)로 제공합니다. 카카오톡 클라이언트 11.2.0 이상 버전, JavaScript SDK 2.7.4 이상 버전, PC나 태블릿 웹 브라우저 환경에서 사용할 수 있습니다.
사용자는 정보(이름, 생년월일, 전화번호)를 직접 입력하는 휴대폰 인증 또는 QR 코드 스캔 후 2차 인증 문자를 선택하는 QR 인증 방식 중 하나를 선택해 인증 후 전자서명할 수 있습니다. 각 인증 방식에 대한 자세한 내용은 사용자 인증 과정을 참고합니다.
이용기관은 전자서명 상태 확인하기와 전자서명 검증하기로 전자서명 상태를 확인 및 검증하고, 서명자 정보 가져오기로 사용자를 식별 및 검증할 수 있는 서명자 정보를 제공받을 수 있습니다.
카카오톡 인증 서비스 API는 서버간 연동(Server to Server)을 원칙으로 합니다.
K1400 인증 표준창은 Kakao SDK for JavaScript(이하 JavaScript SDK)로 제공합니다. 아래 순서로 Kakao SDK for JavaScript(이하 JavaScript SDK)의 설정, 설치, 초기화를 완료합니다.
인증 표준창의 전자서명 과정에 대해 설명합니다. 아래 시퀀스 다이어그램(Sequence Diagram)과 설명을 참고합니다.
HTTP 302
)됩니다.tx_id
(전자서명 접수번호)error_code
(카카오톡 인증 표준창 에러 코드)tx_id
로 전자서명 상태 확인하기 API를 호출해 상태를 확인할 수 있습니다. (선택)tx_id
로 전자서명 검증하기 API를 호출해 전자서명 결과 값을 전달받습니다.tx_id
로 서명자 정보 가져오기 API를 호출해 서명자 정보를 전달받습니다.인증 표준창의 사용자 인증 과정에 대해 안내합니다. 사용자 인증 중 QR 인증 기능은 카카오톡 클라이언트 11.2.0 이상 버전에서 사용할 수 있습니다. 아래 각 항목의 이미지와 설명을 확인합니다.
HTTP 302
)되고, 사용자의 카카오톡으로 인증 완료 메시지를 전달합니다.HTTP 302
)되고, 사용자의 카카오톡으로 인증 완료 메시지를 전달합니다.인증 표준창 호출하기는 휴대폰 인증 또는 QR 인증할 수 있는 웹 페이지를 열어 사용자에게 인증을 요청하는 API입니다.
JavaScript SDK 설치 후 Kakao.Cert.identify()
로 인증 표준창을 호출합니다. 필수 파라미터를 요청에 포함해야 합니다.
인증 표준창 호출 및 전자서명 완료 후 서명자 정보 가져오기로 응답받을 서명자 정보를 identifyItems
에 지정해야 합니다. 필요한 경우 tabs
로 휴대폰 인증과 QR 인증 탭의 순서 를 정할 수 있습니다.
요청 성공 시 사용자에게 인증 표준창을 표시하고 사용자가 선택한 인증 방식에 따라 사용자 인증 과정을 수행합니다. 사용자 인증이 완료되면 인증 표준창은 tx_id
를 포함한 redirectUri
로 리다이렉트(HTTP 302
)됩니다.
요청 실패 시 문제 해결의 카카오톡 인증 표준창 에러 코드 정보를 확인합니다.
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
redirectUri | String |
요청 처리 결과를 전달받을 Redirect URI | O |
dealerAppKey | String |
딜러사 앱의 JavaScript 키 | O |
settleId | String |
정산 ID, isTest 가 true 인 경우 테스트용 정산 ID로 포함 필요, ID 종류 참고 |
O |
identifyItems | String |
서명자 정보 가져오기 응답으로 확인할 서명자 정보 목록 아래 중 하나 이상의 값을 포함해 쉼표로 구분된 문자열로 전달(예: "name,birthday" )ci : 연계정보name : 이름birthday : 생일phone_number : 전화번호gender : 성별 |
O |
tabs | String |
인증 표준창 탭의 정렬 순서 목록, 아래 값을 모두 포함해 쉼표로 구분된 문자열로 전달(기본값: "phone_number,qr" )phone_number : 휴대폰 인증qr : QR 인증 |
X |
isTest | Boolean |
인증 표준창의 테스트 호출 여부(기본값: false ) |
X |
인증 표준창 호출하기는 응답을 결과별 아래 쿼리 파라미터를 포함해 redirectUri
에 GET
요청으로 리다이렉트(HTTP 302
)합니다.
이름 | 타입 | 설명 |
---|---|---|
tx_id | String |
전자서명 접수번호 전자서명 성공 시 응답에 포함 |
error_code | String |
에러 코드 전자서명 실패 시 응답에 포함 |
Kakao.Cert.identify({
redirectUri: "${REDIRECT_URI}",
dealerAppKey: "${DEALER_APP_JAVASCRIPT_KEY}",
settleId: "${SETTLE_ID}",
isTest: true,
tabs: "qr,phone_number",
identifyItems: "name,birthday,ci",
})
메서드 | URL | 인증 방식 |
---|---|---|
GET |
https://cert-sign.kakao.com/sign/v2/status |
REST API 키 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
필요 | - | - | - |
전자서명 상태 확인하기 API는 인증 표준창(K1400
) 상품으로 요청한 전자서명의 상태를 확인합니다. 사용자가 카카오톡으로 인증을 수행하기 때문에, 이용기관은 전자서명 상태 확인하기 API로만 인증 상태를 확인할 수 있습니다.
헤더(Header)에 이용기관 앱 REST API 키와 딜러사 앱 REST API 키를 담아 GET
으로 요청합니다. 본문에 상태를 확인할 전자서명 요청의 tx_id
와 정산 ID를 포함해야 합니다.
요청 성공 시 응답은 전자서명의 상태를 포함합니다. 전자서명의 상태는 요청(REQUESTED
), 완료(COMPLETED
), 만료(EXPIRED
) 세 가지로 각각 다음과 같이 조치합니다.
viewed_at
필드 값으로 확인 가능전자서명이 완료된 경우에는 사용자가 서명한 일시, 전자서명이 만료되는 일시를 비롯한 시간 정보들을 제공합니다. 이미 이용기관이 전자서명 검증하기 API를 요청해 전자서명 결과 값을 전달받았다면, 전자서명 결과 값이 전달된 일시 정보를 제공합니다.
사용자의 인증서 상태에 따라 인증서를 발급 또는 재발급하거나 2차 본인인증(은행 계좌 확인)을 해야 할 수 있습니다. 이 경우, 추가 인증까지 모두 완료된 후 전자서명 상태가 완료로 변경됩니다.
요청 실패 시 문제 해결의 카카오톡 인증 에러 코드 정보를 확인합니다.
이름 | 설명 | 필수 |
---|---|---|
Authorization | Authorization: KakaoAK ${DEALER_REST_API_KEY} 인증 방식, 딜러사 앱의 REST API 키로 인증 요청 |
O |
Target-Authorization | Target-Authorization: KakaoAK ${PARTNER_REST_API_KEY} 인증 방식, 이용기관 앱 REST API 키로 인증 요청 |
O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
settle_id | String |
정산 ID | O |
tx_id | String |
전자서명 원문 접수번호 | O |
이름 | 타입 | 설명 |
---|---|---|
tx_id | String |
전자서명 원문 접수번호 |
status | String |
전자서명 상태, 다음 중 하나REQUESTED : 사용자에게 전자서명을 요청함, 사용자는 채널 메시지를 통해 전자서명 요청을 받음COMPLETED : 사용자가 전자서명을 완료함EXPIRED : 유효시간 이내에 사용자가 전자서명을 완료하지 않아 요청이 만료됨 |
created_at | String |
전자서명 요청 일시* |
viewed_at | String |
사용자가 전자서명 요청을 확인한 일시* |
completed_at | String |
사용자가 전자서명을 완료한 일시* |
expired_at | String |
전자서명 만료 일시* |
partner_notified_at | String |
이용기관이 전자서명 검증하기 API를 통해 전자서명 결과 값을 전달받은 일시* |
* 시간은 yyyy-MM-dd'T'HH:mm:ss 형식, RFC3339 참고
curl -i -X GET "https://cert-sign.kakao.com/sign/v2/status?settle_id=${SETTLE_ID}&tx_id=${TX_ID}" \
-H "Authorization: KakaoAK ${DEALER_REST_API_KEY}" \
-H "Target-Authorization: KakaoAK ${PARTNER_REST_API_KEY}" \
-H "Content-Type: application/json;charset=UTF-8"
{
"status": "COMPLETED",
"tx_id": "${TX_ID}",
"created_at": "2024-10-28T12:51:31",
"viewed_at": "2024-10-28T12:51:35",
"completed_at": "2024-10-28T12:51:41",
"expired_at": "2024-10-28T13:01:21",
"partner_notified_at": null
}
메서드 | URL | 인증 방식 |
---|---|---|
GET |
https://cert-sign.kakao.com/sign/v2/verify |
REST API 키 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
필요 | - | - | - |
전자서명 검증하기 API는 완료된 전자서명을 검증하고 이용기관에 전자서명 데이터 전문을 제공합니다.
이 API는 완료된 전자서명 요청당 1회만 요청 가능하며, 사용자가 서명을 완료한 후, 일정시간(10분) 동안만 정상 응답합니다. 이후 요청에 대해서는 E2017
에러가 발생합니다.
헤더(Header)에 이용기관 앱 REST API 키와 딜러사 앱 REST API 키를 담아 GET
으로 요청합니다. 본문에 완료된 전자서명 요청의 tx_id
와 정산 ID를 포함해야 합니다.
요청 성공 시 응답은 전자서명의 상태와 전자서명 검증 결과를 포함합니다. 요청 실패 시 문제 해결의 카카오톡 인증 에러 코드 정보를 확인합니다.
전자서명 검증하기 응답 구성은 상품별로 다르므로 다음 표를 참고합니다.
상품 | 기본 검증 값 | data 필드 구성 |
---|---|---|
K1410 , K1430 |
카카오 내부적으로 생성된 임의의 난수값 | result , request_token |
이름 | 설명 | 필수 |
---|---|---|
Authorization | Authorization: KakaoAK ${DEALER_REST_API_KEY} 인증 방식, 딜러사 앱의 REST API 키로 인증 요청 |
O |
Target-Authorization | Target-Authorization: KakaoAK ${PARTNER_REST_API_KEY} 인증 방식, 이용기관 앱 REST API 키로 인증 요청 |
O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
settle_id | String |
정산 ID | O |
tx_id | String |
전자서명 원문 접수번호 | O |
이름 | 타입 | 설명 |
---|---|---|
status | String |
전자서명 상태, 전자서명 검증 시에는 전자서명이 완료된 상태인 COMPLETE 값만 제공되며, 이 외 상태인 경우 에러 응답 |
data | JSON |
전자서명 검증 결과 아래 data: 전자서명 검증 결과 표 참고 |
이름 | 타입 | 설명 |
---|---|---|
result | String |
전자서명 검증 결과Y : 검증 성공N : 실패 |
request_token | String |
카카오 인증 서버에서 생성된 사용자 인증용 임의의 난수, 이용기관에서 처리 불필요 |
curl -i -X GET "https://cert-sign.kakao.com/sign/v2/verify?settle_id=${SETTLE_ID}&tx_id=${TX_ID}" \
-H "Authorization: KakaoAK ${DEALER_REST_API_KEY}" \
-H "Target-Authorization: KakaoAK ${PARTNER_REST_API_KEY}" \
-H "Content-Type: application/json;charset=UTF-8"
{
"status": "COMPLETED",
"data": {
"result": "Y",
"request_token": "${DATA}" // 상단 설명 및 표 참고
}
}
메서드 | URL | 인증 방식 |
---|---|---|
GET |
https://cert-sign.kakao.com/sign/v2/identify |
REST API 키 |
권한 | 사전 설정 | 카카오 로그인 | 동의항목 |
---|---|---|---|
필요 | - | - | - |
서명자 정보받기 API는 서명을 완료한 서명자 정보를 제공합니다.
이 API는 전자서명 검증하기 호출 후 요청 가능하며, 사용자 서명 완료 후 일정시간(10분)동안 1회만 요청 가능합니다. 이후 요청에 대해서는 E2017
에러가 발생합니다. 서명자의 개인정보 제공 동의 및 서명 완료 후, 개발 설계 오류, 네트워크 오류 등으로 인한 이용기관의 정보 수신 실패에 대해 카카오는 책임을 지지 않습니다.
헤더(Header)에 이용기관 앱 REST API 키와 딜러사 앱 REST API 키를 담아 GET
으로 요청합니다. 본문에 완료된 전자서명 요청의 tx_id
와 정산 ID를 포함해야 합니다.
요청 성공 시 응답은 인증 표준창 호출하기 요청의 identifyItems
로 지정한 서명자 정보를 포함합니다. 문제 해결의 카카오톡 인증 에러 코드 정보를 확인합니다.
카카오톡 인증 서비스에서 제공하는 연계정보(CI)와 이름, 생년월일, 전화번호는 사용자 비교 및 검증 용도로만 사용할 수 있습니다. 서명자 정보 가져오기 API를 통해 제공받은 CI, 이름, 생년월일, 전화번호를 이용기관의 정보와 비교해 올바른 사용자인지 검증해야 합니다. 비교 및 검증은 반드시 이용기관 서버에서 수행해야 합니다.
이름 | 설명 | 필수 |
---|---|---|
Authorization | Authorization: KakaoAK ${DEALER_REST_API_KEY} 인증 방식, 딜러사 앱의 REST API 키로 인증 요청 |
O |
Target-Authorization | Target-Authorization: KakaoAK ${PARTNER_REST_API_KEY} 인증 방식, 이용기관 앱 REST API 키로 인증 요청 |
O |
이름 | 타입 | 설명 | 필수 |
---|---|---|---|
settle_id | String |
정산 ID | O |
tx_id | String |
전자서명 원문 접수번호 | O |
identifyItems
로 지정한 서명자 정보만 응답에 포함이름 | 타입 | 설명 |
---|---|---|
name | String |
암호화된 서명자의 이름 |
phone_no | String |
암호화된 서명자의 카카오톡 전화번호 |
birthday | String |
암호화된 서명자의 생년월일 |
gender | String |
암호화된 서명자의 성별 |
ci | String |
암호화된 서명자의 CI(연계정보) |
vid | String |
암호화된 서명자의 CI 검증값, K1400 상품은 CI 검증값을 제공하지 않아 null 로 고정 |
curl -i -X GET "https://cert-sign.kakao.com/sign/v2/identify?settle_id=${SETTLE_ID}&tx_id=${TX_ID}" \
-H "Authorization: KakaoAK ${DEALER_REST_API_KEY}" \
-H "Target-Authorization: KakaoAK ${PARTNER_REST_API_KEY}" \
-H "Content-Type: application/json;charset=UTF-8"
{
"name": "${NAME}",
"phone_no": "${PHONE_NO}",
"birthday": "${BIRTHDAY}",
"gender": "${GENDER}",
}