> For the complete documentation index, see [llms.txt](https://workspace-help.nhn-commerce.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://workspace-help.nhn-commerce.com/aurora-guide/api-1/sms-authentication.md).

# 휴대폰 본인인증

회원 본인인증 방법은 이메일 인증 / SMS 인증 / 휴대폰 인증 3가지 인증 방법을 제공합니다.\
아래 어드민 경로에서 설정할 수 있습니다.&#x20;

```
shop by basic/pro : 설정 > 기본정책 > 쇼핑몰 관리 > 쇼핑몰 수정 > 회원 인증 설정
shop by premium : 서비스관리 > 쇼핑몰 관리 > 쇼핑몰 수정 > 회원 인증 설정
```

회원 본인 인증의 경우, 아래와 같은 화면에서 활용됩니다.

* 아이디 및 비밀번호 찾기 시&#x20;
* 성인 인증 필요 시 (성인인증 사용 상품 구매 및 성인인증 인트로페이지)
* 회원 휴면해제 시
* 마이페이지 회원정보 수정 시
* 쇼핑몰 회원가입 시&#x20;

<figure><img src="/files/QDERl8abVLDadwo6JJo2" alt=""><figcaption></figcaption></figure>

***

### 🅐 휴대폰 본인인증 버튼

회원 본인인증 방법을 '휴대폰인증'으로 설정한 경우, 화면 내 '휴대폰 본인인증' 버튼이 노출됩니다.&#x20;

> [GET /malls](https://docs.shopby.co.kr/?url.primaryName=admin/#/Mall/get-malls)
>
> ► 몰 정보 조회하기\
> 쇼핑몰 전반에 대한 기본 정보와 설정 데이터를 조회합니다.

[샵바이 API 호출 가이드](/aurora-guide/api/shopbyapi.md) 문서에서 소개한 GET /malls 내 <mark style="background-color:yellow;">mallJoinConfig</mark> 값을 통해\
어드민의 휴대폰 인증 사용함 여부를 확인합니다.

***

### 🅑 NHN KCP 인증모듈 로직

<figure><img src="/files/P3moO3Bys0atyVfipmuq" alt=""><figcaption></figcaption></figure>

### ⓐ 휴대폰 본인인증 버튼 클릭

휴대폰 본인인증 버튼이 노출된 쇼핑몰 화면에서 버튼 클릭 시,\
/callback/kcp-callback 을 통해 URI key 값 여부를 확인합니다.

### ⓑ HTML form 획득

KCP 인증 모듈 팝업을 출력하기 위해서 GET /kcp/id-verification 을 통해 HTML form을 요청해야 합니다.\
해당 API를 통해 HTML form 생성 시, 화면 내 'NHN KCP 인증 팝업 (외부모듈)'이 노출됩니다.

> [GET /kcp/id-verification/form](https://docs.shopby.co.kr/?url.primaryName=auth/#/KCPCertification/get-kcp-id-verification-form)
>
> ▶ KCP 본인인증 요청하기\
> 본인 인증을 위한 form을 생성합니다

### ⓒ Key 파라미터 획득

'NHN KCP 인증팝업(외부 모듈)'을 통해 사용자가 인증에 성공하면, callback 주소로 본인인증 키 `key` 가 전달됩니다.

#### <mark style="color:purple;">**✓ 예시 코드**</mark>

```
https://{쇼핑몰 도메인}/callback/kcp-callback.html?key=XXXXXXXXXX
```

### ⓓ 본인인증 결과 조회

해당 key 를 파라미터 값으로 본인인증 인증 성공 및 실패 여부를 판단한 뒤, 화면에 성공 및 실패 결과를 전달합니다.\
성공 시 다음 화면으로 리다이렉트 되며 팝업이 종료됩니다.

> [GET /kcp/id-verification/response](https://docs.shopby.co.kr/?url.primaryName=auth/#/KCPCertification/get-kcp-id-verification-response)
>
> ▶ KCP 본인인증 결과 조회하기\
> NHN KCP 본인인증 결과를 확인합니다

### ⓔ 본인인증 결과 획득 <a href="#e2-93-94-eb-b3-b8-ec-9d-b8-ec-9d-b8-ec-a6-9d-ea-b2-b0-ea-b3-bc-ed-9a-8d-eb-93-9d" id="e2-93-94-eb-b3-b8-ec-9d-b8-ec-9d-b8-ec-a6-9d-ea-b2-b0-ea-b3-bc-ed-9a-8d-eb-93-9d"></a>

성공 시 다음 화면으로 리다이렉트 되며 팝업이 종료됩니다.

#### **㉠ 회원가입 진행 중 이루어진 본인인증이었을 경우**

만약 '[회원가입 화면](/aurora-guide/api-1/sign-up-form.md)'에서 휴대폰 본인 인증을 진행한 경우였다면,\
본인인증 성공 시 해당 API 응답 값 중, CI 값을 회원가입 화면으로 전달하여 CI 중복 확인을 추가적으로 진행해야 하며\
phone 핸드폰 번호 값을 회원정보 입력화면에 자동 출력합니다.

#### **㉡ 성인 인증 여부 갱신**

NHN KCP 본인인증 결과 조회 이후 로그인 여부를 판단하여\
만약 해당 회원이 로그인 상태였을 경우(accessToken을 가지고 있었을 경우), 성인인증 여부를 갱신해야 합니다.

> [POST /kcp/age-verification](https://docs.shopby.co.kr/?url.primaryName=auth/#/KCPCertification/post-kcp-age-verification)
>
> ▶ 회원 성인인증 하기\
> 회원 성인인증 여부를 갱신합니다

이전 단계에서 획득한 key 파라미터로 사용합니다.

한 번 성인인증을 완료한 회원은 인증을 완료한 시점부터 1년간 인증 기록이 유지됩니다.\
기간 내 다시 본인인증에 성공할 경우 성인인증 일시가 갱신됩니다.

### ⓕ 팝업 차단 여부 체크 <a href="#e2-93-94-eb-b3-b8-ec-9d-b8-ec-9d-b8-ec-a6-9d-ea-b2-b0-ea-b3-bc-ed-9a-8d-eb-93-9d" id="e2-93-94-eb-b3-b8-ec-9d-b8-ec-9d-b8-ec-a6-9d-ea-b2-b0-ea-b3-bc-ed-9a-8d-eb-93-9d"></a>

사용자의 브라우저 환경에서 팝업 차단 설정이 활성화되어 있는 경우, 인증 모듈이 정상적으로 동작하지 않을 수 있습니다.\
이 경우, 팝업 차단 여부를 확인하고 사용자에게 팝업 허용 안내 메시지를 제공하여 정상적인 인증 절차를 진행할 수 있도록 해야 합니다.

브라우저에서는 특정 사이트에 대한 팝업 허용 설정 상태를 직접적으로 확인할 수 있는 방법은 제공하지 않습니다. 다만, `window.open()` 함수를 통해 팝업 호출 시, 팝업이 정상적으로 열렸는지 여부를 아래와 같은 방식으로 확인할 수 있습니다.

**예시 코드**

```javascript
const popup = window.open('https://example.com', '_blank');
if (!popup || popup.closed || typeof popup.closed === 'undefined') {
  alert('팝업이 차단되어 인증을 진행할 수 없습니다. 브라우저의 팝업 허용 설정을 확인해주세요.');
}
```

KCP 인증 모듈은 HTML form 태그를 이용해 팝업 창을 호출하는 방식을 사용하므로, 이를 응용하여 팝업 차단 여부를 확인할 수 있습니다. 일반적인 `window.open()` 호출 외에도, form을 통한 팝업 호출 시 반환되는 팝업 객체를 활용하여 팝업이 정상적으로 열렸는지 여부를 체크할 수 있습니다.

**예시 코드**

```javascript
const response = await fetch("/kcp/id-verification/form");  // 인증모듈 form 요청(예시)
const source = await response.text();

const parser = new DOMParser();
const doc = parser.parseFromString(source, "text/html"); //DOM Document로 변환

const formElement = doc.querySelector("form#form_auth");  // 응답받은 form 데이터의 name 값 참조
document.body.appendChild(formElement);

const popup = window.open("", formElement.target);  // 응답받은 form 데이터의 target 값 참조
formElement.submit();

if (!popup || popup.closed || typeof popup.closed === 'undefined') {
  alert('팝업이 차단되어 인증을 진행할 수 없습니다. 브라우저의 팝업 허용 설정을 확인해주세요.');
}
```
