Explorar o código

모바일 본인인증 추가 및 SameSite 적용

jsshin %!s(int64=5) %!d(string=hai) anos
pai
achega
795bf3f4a7

+ 2 - 1
src/main/java/com/style24/front/biz/thirdparty/NiceCertify.java

@@ -185,6 +185,7 @@ public class NiceCertify {
 
 
 		String sRequestNo = TsfSession.getAttribute("REQ_SEQ");	// 세션에 저장된 요청번호
+		log.info("sRequestNo ===> {}, sRequestNumber ===> {}",sRequestNo ,sRequestNumber);
 		if (!sRequestNo.equals(sRequestNumber)) {
 			sResponseNumber = "";
 			sAuthType = "";
@@ -260,7 +261,7 @@ public class NiceCertify {
 
 		GagaMap resultMap = new GagaMap();
 		resultMap.setString("sEncData", ipinClinet.getCipherData());
-
+		resultMap.setString("CPREQUEST", sCPRequestNo);
 		return resultMap;
 	}
 

+ 12 - 5
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -69,11 +69,15 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 05
 	 */
 	@RequestMapping("/id/find/form")
-	public ModelAndView idFindForm() {
+	public ModelAndView idFindForm(@RequestParam(value = "sEncData", required = false) String sEncData
+			, @RequestParam(value = "authMethod", required = false) String authMethod) {
+
 		ModelAndView mav = new ModelAndView();
 
-		mav.setViewName(super.getDeviceViewName("customer/IdFindForm"));
+		mav.addObject("sEncData", sEncData);
+		mav.addObject("authMethod", authMethod);
 
+		mav.setViewName(super.getDeviceViewName("customer/IdFindForm"));
 		return mav;
 	}
 
@@ -350,7 +354,8 @@ public class TsfCustomerController extends TsfBaseController {
 	 * @since 2021. 02. 09
 	 */
 	@GetMapping("/nice/cellphone/form")
-	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl, @RequestParam(value = "custparams", required = false) String custparams) {
+	public ModelAndView niceCellphoneForm(@RequestParam(value = "redirectUrl", required = false) String redirectUrl
+			, @RequestParam(value = "custparams", required = false) String custparams) {
 		ModelAndView mav = new ModelAndView();
 		GagaMap result = niceCertify.certifyCellPhone();
 
@@ -389,13 +394,15 @@ public class TsfCustomerController extends TsfBaseController {
 	 * 나이스 인증 콜백
 	 * @param encodeData - 휴대폰인증에서 전달받은 인증결과 암호화 데이터 취득
 	 * @param encData - 아이핀에서 전달받은 인증결과 암호화 데이터 취득
+	 * @param redirectUrl - 모바일은 호출한 URL 암호화 데이터 전달
 	 * @return ModelAndView
 	 * @author jsshin
 	 * @since 2021. 02. 09
 	 */
 	@RequestMapping("/nice/certify/callback")
-	public ModelAndView niceCertifyCallback(
-		@RequestParam(value = "EncodeData", required = false) String encodeData, @RequestParam(value = "enc_data", required = false) String encData, @RequestParam(value = "param_r1", required = false) String redirectUrl) {
+	public ModelAndView niceCertifyCallback(@RequestParam(value = "EncodeData", required = false) String encodeData
+			, @RequestParam(value = "enc_data", required = false) String encData
+			, @RequestParam(value = "param_r1", required = false) String redirectUrl) {
 
 		ModelAndView mav = new ModelAndView();
 		String sEncData = "";

+ 2 - 2
src/main/java/com/style24/front/support/config/TsfRedisSessionConfig.java

@@ -88,8 +88,8 @@ public class TsfRedisSessionConfig extends AbstractHttpSessionApplicationInitial
 		serializer.setUseBase64Encoding(false);
 
 		// SSL인증서 적용 시 주석 제거
-//		serializer.setUseSecureCookie(true);
-//		serializer.setSameSite("NONE");
+		serializer.setUseSecureCookie(true);
+		serializer.setSameSite("NONE");
 
 		return serializer;
 	}

+ 164 - 154
src/main/webapp/WEB-INF/views/mob/SigninFormMob.html

@@ -20,19 +20,19 @@
 
 <th:block layout:fragment="content">
 	<main class="container mb">
-		<div class="close">
-			<a href="javascript:history.back(-1);" class="btn_close"><span></span><span></span></a>
-		</div>
-
 		<!-- ★ 컨텐츠 시작 -->
 		<section class="content mb_login">
-
+			<div class="inner">
+				<div class="close"><a href="javascript:history.back(-1);" class="btn_close"><span></span><span></span></a></div>
+			</div>
 			<div class="inner">
 				<h2 class="title">로그인</h2>
 			</div>
 			<div class="inner">
 				<form class="form_wrap form_full" name="loginForm" id="loginForm" th:action="@{/login}" method="post">
-					<div class="form_head"><h3 class="title sr-only">로그인</h3></div>
+					<div class="form_head">
+						<h3 class="title sr-only">로그인</h3>
+					</div>
 					<div class="form_field mt0">
 						<input type="text" name="loginId" placeholder="아이디" class="form_control"minlength="4" maxlength="12" required="required" data-valid-type="alphaNumeric" data-valid-name="아이디"/>
 					</div>
@@ -47,37 +47,23 @@
 						</div>
 						<div class="right">
 							<ul>
-								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a></li>
-								<li><a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a></li>
+								<li>
+									<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a>
+								</li>
+								<li>
+									<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a>
+								</li>
 							</ul>
 						</div>
 					</div>
 					<div class="help_block">
 						<!-- 보안문자 입력시 -->
-						<div>
-							<div class="captcha" style="display: none;"> <!-- 캡차영역 -->
-								<ul>
-									<li class="lap"> <!-- 캡차이미지 -->
-										<div class="captcha_box"> <!-- 캡차이미지 -->
-											<img src="" id="imgCaptcha"/>
-										</div>
-										<div class="captcha_btn_dual">
-											<button type="button" id="play_audio" onclick="fnReloadCaptchaImage();">새로고침</button>
-											<button type="button" id="swap_captcha">음성듣기</button>
-										</div>
-									</li>
-									<li class="captcha_area">
-										<label for="captcha" id="label_captcha_area" class="sr-only">보안문자 입력</label>
-										<input type="text" id="captcha" name="captcha" placeholder="위 보안문자 이미지에 보이는 문자 입력" title="문자입력"/>
-									</li>
-								</ul>
-							</div>
-							<p class="t_err mt10 t_err_login_fail" style="display: none;">
+							<div id="recaptcha" class="g-recaptcha" style="display: none;" data-callback="fnRecaptchaCallback" th:data-sitekey="${sitekey}"></div>
+							<p class="t_err t_err_login_fail" style="display: none;">
 								<span id="err_msg">보안문자 입력을 다시 시도해 주세요.</span><br>
 								(10회 이상 실패하면 180초 동안 로그인이 불가능 합니다.)<br>
 								<span id="login_fail_cnt">4</span>회 실패 / 잔여 : <span id="login_remain_cnt">6</span>회<span id="blockSecs1" style="display: none;"> / <span id="blockSecs2">180</span>초 남음
 							</p>
-						</div>
 						<!-- //보안문자 입력시 -->
 					</div>
 					<div class="ui_row mt20">
@@ -88,128 +74,56 @@
 					<h3 class="sr-only">간편로그인</h3>
 					<ul class="login_utill">
 						<li class="lu_kakao">
-							<a href="javascript:void(0)">
+							<a href="javascript:void(0)" onclick="cfnLoginKakao();">
 								<div class="ico"></div>카카오로<br>시작하기
 							</a>
 						</li>
 						<li class="lu_naver">
-							<a href="javascript:void(0)">
+							<a href="javascript:void(0)" onclick="cfnLoginNaver();">
 								<div class="ico"></div>네이버로<br>시작하기
 							</a>
 						</li>
 						<li class="lu_yes24">
-							<a href="javascript:void(0)">
+							<a href="javascript:void(0)" onclick="cfnLoginYes24();">
 								<div class="ico"></div>YES24로<br>시작하기
 							</a>
 						</li>
 					</ul>
 				</div>
-				<div class="t_c mt30"><botton class="btn_nonMb">비회원 주문조회</botton>
+				<div class="t_c mt30">
+					<botton class="btn_nonMb">비회원 주문조회</botton>
 				</div>
-
+			</div>
 		</section>
-		<!-- ★ 컨텐츠 종료 -->
-
+	<!--  컨텐츠 종료 -->
 	</main>
 
 <script th:inline="javascript">
 /*<![CDATA[*/
 	let ckLoginId = "ckLoginId";
+	let rechaptchCheck = true;
 
-	// 로그인블락시간(초) 설정
-	let fnSetLoginBlockTime = function() {
-		let blockSecs = Number($("#blockSecs2").html()) - 1;
-		$("#blockSecs2").html(blockSecs);
-		if (blockSecs == 0) {
-			clearTimeout(fnSetLoginBlockTime);
-			$('#btnLogin').attr('disabled',false);
-		} else {
-			setTimeout(fnSetLoginBlockTime, 1000);
-		}
-	}
-	
 	// 로그인
 	$('#btnLogin').on('click', function() {
 		if (!gagajf.validation($('#loginForm'))) {
 			return;
 		}
+		if (!rechaptchCheck) {
+			mcxDialog.alert("자동 방지 봇을 확인 한뒤 진행 해 주세요.");
+			return;
+		}
 
-		let params = new Object();
+		let params = {};
 		params.loginId = $('#loginForm input[name=loginId]').val();
 		params.passwd = $('#loginForm input[name=passwd]').val();
-		
+
 		$.post($('#loginForm').prop('action')
 			, $.param(params)
-			, function(result) {
-				if (result.status != 'OK') {
-
-					if (result.status == 'PWD_5WRONG') {
-						// Do nothing
-					} else if (result.status == 'DORMANT_CUST') {
-						// 휴면회원
-						mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
-							sureBtnText: "확인",
-							sureBtnClick: function() {
-								cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-							}
-						});
-
-						return;
-					} else if (result.status == 'SECEDE_CUST') {
-						// 탈퇴회원
-					} else if (result.status == 'SESSION_EXPIRED') {
-						// 세션만료
-					}
-
-					if (!gagajf.isNull(result.message)) {
-						let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
-						
-						$("#err_msg").html(result.message);
-						$("#login_fail_cnt").html(loginFailCnt);
-						$("#login_remain_cnt").html(10 - loginFailCnt);
-						$(".t_err_login_fail").show();
-						
-						if (loginFailCnt >= 5 && loginFailCnt < 10) {
-							// 비밀번호 5회 이상 틀린 경우 캡챠 노출
-							$('.captcha').show();
-						} else if (loginFailCnt >= 10) {
-							$('.captcha').hide();
-							
-							// 비밀번호 10회 이상 틀린 경우 로그인 블락
-							let blockSecs = Number(result.loginFailInfo.blockSecs);
-							if (blockSecs > 0) {
-								$("#blockSecs2").html(blockSecs);
-								fnSetLoginBlockTime();
-								$("#blockSecs1").show();
-								$('#btnLogin').attr('disabled',true);
-							}
-						}
-					}
-
-					return; // 정상적으로 로그인 되지 않았으므로 return
-				}
-				
-				document.location.href = result.returnUrl;
-				
-// 				if (gagajf.isNull(result.returnUrl)) {
-// 					cfnGoToPage(_PAGE_MAIN);
-// 				} else {
-// 					if (result.returnUrl.indexOf(_PAGE_DIRECT_BUY) > -1) {
-// 						// 바로주문
-// 						jfOrderByMember();
-// 					} else if (result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_ID_FIND) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_PW_FIND) > -1 ||
-// 						result.returnUrl.indexOf(_PAGE_CUSTOMER_JOIN_COMPLETE) > -1) {
-// 						cfnGoToPage(_PAGE_MAIN);
-// 					} else {
-// 						document.location.href = result.returnUrl;
-// 					}
-// 				}
-			}
+			, fnReloadAfterLogin
 			, 'json');
 	});
-	
+
+
 	// Save ID
 	$('#chkSaveId').on('click', function() {
 		if ($(this).is(":checked")) {
@@ -222,15 +136,115 @@
 			}
 		}
 	});
-	
-	// 캡챠 이미지 로딩
-	let fnReloadCaptchaImage = function() {
-		$('#imgCaptcha').attr('src', '/common/captcha.do?dummy=' + new Date());
+
+	//엔터키 로그인
+	$('#loginForm input[name=passwd]').keypress(function (event) {
+		if (event.which === 13) {
+			event.preventDefault();
+			$('#btnLogin').trigger('click');
+		}
+	});
+
+	// 로그인 후 처리
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else {
+			fnFailLoginProcess(result);
+		}
+	};
+
+	// 로그인 실패 후 과정
+	var fnFailLoginProcess = function (result) {
+		// 탈퇴회원
+		if (result.status === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 휴면회원
+		if (result.status === 'DORMANT_CUST') {
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		}
+		// CI(본인인증)정보 없는 회원
+		if (result.status === 'CI_EMPTY') {
+			// 본인이증 필요한 회원
+			mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
+				}
+			});
+			return;
+		}
+		// 비밀번호 틀린 경우
+		if (!gagajf.isNull(result.message)) {
+			grecaptcha.reset(); // 리캡챠 리셋
+			let loginFailCnt = Number(result.loginFailInfo.loginFailCnt);
+			$("#err_msg").html(result.message);
+			$("#login_fail_cnt").html(loginFailCnt);
+			$("#login_remain_cnt").html(10 - loginFailCnt);
+			$(".t_err_login_fail").show();
+
+			// 비밀번호 5회 이상 틀린 경우 캡챠 노출
+			if (loginFailCnt >= 5 && loginFailCnt < 10) {
+				$('#recaptcha').show();
+				rechaptchCheck = false;
+			// 비밀번호 10회 이상 틀린 경우 로그인 블락
+			} else if (loginFailCnt >= 10) {
+				$('#recaptcha').hide();
+				rechaptchCheck = true;
+				let blockSecs = Number(result.loginFailInfo.blockSecs);
+				if (blockSecs > 0) {
+					$("#blockSecs2").html(blockSecs);
+					fnSetLoginBlockTime();
+					$("#blockSecs1").show();
+					$('#btnLogin').attr('disabled',true);
+				}
+			}
+		}
+
+		return; // 정상적으로 로그인 되지 않았으므로 return
 	}
 
-	// SNS 로그인 콜백함수
+
+	// 구글 캡챠 콜백함수
+	var fnRecaptchaCallback = function () {
+		let token = $("#g-recaptcha-response").val();
+		let params = {};
+		params.token = token;
+		gagajf.ajaxSubmit('/verify/recaptcha','', fnVerifyReCaptchaCallback, params);
+	};
+
+	// Token 인증
+	var fnVerifyReCaptchaCallback = function (result) {
+		if (result.success) {
+			rechaptchCheck = true;
+		} else {
+			rechaptchCheck = false;
+		}
+	};
+
+	// 로그인블락시간(초) 설정
+	let fnSetLoginBlockTime = function() {
+		let blockSecs = Number($("#blockSecs2").html()) - 1;
+		$("#blockSecs2").html(blockSecs);
+		if (blockSecs <= 0) {
+			clearTimeout(fnSetLoginBlockTime);
+			$('#btnLogin').attr('disabled',false);
+		} else {
+			setTimeout(fnSetLoginBlockTime, 1000);
+		}
+	}
+
+	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
 	var fnSnsSigninCallback = function(userInfo) {
-		// Ci이 조회 시 없음
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
 		if (userInfo.custStat === 'DUP_PHONE_CUST') {
 			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
 			return;
@@ -239,58 +253,54 @@
 			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
 			return;
 		}
-		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
-		}
-		// Ci이 조회 시 있음
+		// 2. SNS 로그인 정보로 탈퇴확인
 		if (userInfo.custStat === 'SECEDE_CUST') {
 			mcxDialog.alert("탈퇴 회원 입니다.");
 			return;
 		}
+		// 3. SNS 로그인 정보로 휴면확인
 		if (userInfo.custStat === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
 		}
-		if (userInfo.custStat === 'FAIL_CUST') {
-			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		if (userInfo.custStat === 'NEED_AGREE_CUST') {
+			cfnConsentUseInfo(userInfo.custNm);
 			return;
 		}
+		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
 		if (userInfo.custStat === 'NEW_CUST') {
 			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			return;
 		}
-
-
+		// 7.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
 		if (userInfo.custStat === 'SUCC_CUST') {
 			let params = {};
 			params.snsType = userInfo.snsType;
 			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
 			$.post(_frontUrl + '/login'
 				, $.param(params)
-				, function(result) {
-					fnReloadAfterLogin(result);
-				}
+				,fnReloadAfterLogin
 				, "json");
 		}
-
-
-	};
-
-	var fnReloadAfterLogin = function(result) {
-		if (result.status === 'OK') {
-			document.location.href = result.returnUrl;
-		} else if (result.status === 'EMAIL_DUP') {
-
-		} else if(result.status === 'DORMANT_CUST') {
-			cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
-		} else if(result.status === 'SECEDE_CUST') {
-
-		} else {
-			//cfnGoToPage(_PAGE_CUSTOMER_JOIN_CERTIFY_SNS);
-		}
 	};
 
-
-
 	$(document).ready(function() {
+
 		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));
 		if (gagajf.isNull($('#loginForm input[name=loginId]').val())) {
 			$('#loginForm input[name=loginId]').focus();
@@ -306,4 +316,4 @@
 </th:block>
 
 </body>
-</html>
+</html>

+ 143 - 0
src/main/webapp/WEB-INF/views/mob/SnsCallBackFormMob.html

@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : SigninFormWeb.html
+ * @desc    : 로그인 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.15   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<head th:replace="~{mob/common/fragments/HeadMob :: head}"></head>
+<th:block th:replace="~{mob/common/fragments/VariablesMob :: variables}"></th:block>
+<th:block th:replace="~{mob/common/fragments/ScriptsMob :: scripts}"></th:block>
+<body>
+
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	const resultMap = [[${resultMap}]];
+
+	// SNS 로그인 콜백함수(네이버, 카카오, YES24)
+	var fnSnsSigninCallback = function(userInfo) {
+		// 1. CI 정보로 사용자가 없어서 회원가입 프로세스 처리 중 이메일, 휴대전화 중복
+		if (userInfo.custStat === 'DUP_PHONE_CUST') {
+			mcxDialog.alert("이미 사용 중인 휴대전화번호 입니다.");
+			return;
+		}
+		if (userInfo.custStat === 'DUP_EMAIL_CUST') {
+			mcxDialog.alert("이미 사용 중인 이메일 입니다.");
+			return;
+		}
+		// 2. SNS 로그인 정보로 탈퇴확인
+		if (userInfo.custStat === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 3. SNS 로그인 정보로 휴면확인
+		if (userInfo.custStat === 'DORMANT_CUST') {
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		}
+		// 4. 휴대전화 정보가 없으면 SNS 가입화면 이동
+		if (userInfo.custStat === 'EMPTY_PHONE_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_SNS_JOIN);
+		}
+		// 5. YES24 첫 로그인 시도 시 정보동의 페이지 이동
+		if (userInfo.custStat === 'NEED_AGREE_CUST') {
+			cfnConsentUseInfo(userInfo.custNm);
+			return;
+		}
+		// 6. SNS 정보로 가입 성공시 가입완료 페이지 이동
+		if (userInfo.custStat === 'NEW_CUST') {
+			cfnGoToPage(_PAGE_CUSTOMER_JOIN_COMPLETE);
+			return;
+		}
+		// 7.SNS 정보로 가입 실패시 안내 창 알림
+		if (userInfo.custStat === 'FAIL_CUST') {
+			mcxDialog.alert("회원가입에 실패 했습니다.<br> 고객센터에 문의 하시기 바랍니다.");
+			return;
+		}
+		// 8. SNS 로그인 연동 성공 및 기존 SNS 연동된 회원 로그인 시도
+		if (userInfo.custStat === 'SUCC_CUST') {
+			let params = {};
+			params.snsType = userInfo.snsType;
+			params.snsId = [[${snsLoginPrefix}]] + userInfo.snsId;
+			$.post(_frontUrl + '/login'
+				, $.param(params)
+				,fnReloadAfterLogin
+				, "json");
+		}
+	};
+
+	// 로그인 후 처리
+	var fnReloadAfterLogin = function(result) {
+		if (result.status === 'OK') {
+			document.location.href = result.returnUrl;
+		} else {
+			fnFailLoginProcess(result);
+		}
+	};
+
+	// 로그인 실패 후 과정
+	var fnFailLoginProcess = function (result) {
+		// 탈퇴회원
+		if (result.status === 'SECEDE_CUST') {
+			mcxDialog.alert("탈퇴 회원 입니다.");
+			return;
+		}
+		// 휴면회원
+		if (result.status === 'DORMANT_CUST') {
+			mcxDialog.alertC("휴면 고객님께서는 휴면을<br>해지하신 후 사용하실 수 있습니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_DORMANT);
+				}
+			});
+			return;
+		}
+		// CI(본인인증)정보 없는 회원
+		if (result.status === 'CI_EMPTY') {
+			// 본인이증 필요한 회원
+			mcxDialog.alertC("본인인증 후 다시 로그인 하시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_CUSTOMER_CERTIFICATION);
+				}
+			});
+			return;
+		}
+
+		return; // 정상적으로 로그인 되지 않았으므로 return
+	}
+	$(document).ready(function() {
+		if (gagajf.isNull(resultMap.snsId) && gagajf.isNull(resultMap.snsType)){
+			mcxDialog.alertC("인증에 실패하였습니다.<br> 로그인 정보를 확인해주시기 바랍니다.", {
+				sureBtnText: "확인",
+				sureBtnClick: function() {
+					cfnGoToPage(_PAGE_LOGIN);
+				}
+			});
+		} else {
+			fnSnsSigninCallback(resultMap);
+		}
+	});
+
+
+/*]]>*/
+</script>
+
+
+</body>
+</html>

+ 2 - 0
src/main/webapp/WEB-INF/views/mob/common/fragments/HeadMob.html

@@ -63,6 +63,8 @@
 	<script type="text/javascript" src="https://ssl.daumcdn.net/dmaps/map_js_init/postcode.v2.js"></script>
 	<script src="/ux/plugins/lazyload.min.js"></script>
 
+	<script src="https://www.google.com/recaptcha/api.js" async defer></script>
+
 	<!-- Global site tag (gtag.js) - Google Analytics -->
 <!-- 	<script async src="https://www.googletagmanager.com/gtag/js?id=UA-168660512-1"></script> -->
 	<script>

+ 331 - 0
src/main/webapp/WEB-INF/views/mob/customer/IdFindFormMob.html

@@ -0,0 +1,331 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/LoginLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : IdFindFormMob.html
+ * @desc    : 아이디 찾기 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+<th:block layout:fragment="content">
+	<main class="container mb">
+		<!-- ★ 컨텐츠 시작 -->
+		<section class="content mb_idInquiry_1">
+			<div class="inner">
+				<div class="close">
+					<a href="javascript:history.back(-1);" class="btn_close"><span></span><span></span></a>
+				</div>
+			</div>
+			<div class="inner">
+				<h2 class="title">아이디/비밀번호찾기</h2>
+			</div>
+			<div class="inner">
+				<div class="registration_nav">
+					<ul class="tab_btn">
+						<li class="active">
+							<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">아이디찾기</a>
+						</li>
+						<li>
+							<a href="javascript:void(0)" onclick="cfnGoToPage(_PAGE_CUSTOMER_PWD_FIND);">비밀번호 찾기</a>
+						</li>
+					</ul>
+				</div>
+				<div class="registration_tap">
+					<div class="form_group">
+						<!-- 라디오탭 -->
+						<div id="searchDiv" class="radio_nav">
+							<ul class="form_field">
+								<li class="ui_col_4 active">
+									<input type="radio" name="radio1" id="rdi1-1" value="1" checked><label for="rdi1-1"> <span>회원정보인증</span> </label>
+								</li>
+								<li class="ui_col_4">
+									<input type="radio" name="radio1" id="rdi1-2" value="2"><label for="rdi1-2"> <span>휴대폰인증</span> </label>
+								</li>
+								<li class="ui_col_4">
+									<input type="radio" name="radio1" id="rdi1-3" value="3"><label for="rdi1-3"> <span>아이핀인증</span> </label>
+								</li>
+							</ul>
+						</div>
+						<!-- //라디오탭 -->
+						<!-- 라디오탭 -->
+						<div class="radio_tap">
+							<div class="form_group">
+								<form id="searchCustInfo" name="searchCustInfo" class="form_wrap form_full" method="post">
+									<div>
+										<div class="form_field mt0">
+											<input type="text" name="custNm" placeholder="이름" id="custNm" class="form_control" maxlength="30"/>
+										</div>
+										<div class="form_field">
+											<input type="text" name="birthYmd" placeholder="생년월일 8자리 (예:19880912)" id="birthYmd" class="form_control"/>
+										</div>
+										<div class="form_field">
+											<input type="text" name="email" placeholder="이메일" id="email" class="form_control"/>
+										</div>
+										<div class="ui_row mt20">
+											<button type="button" id="btnInfoConfirm" class="btn btn_dark">확인</button>
+										</div>
+									</div>
+								</form>
+							</div>
+							<div class="form_group" style="display: none;">
+								<div class="form_wrap form_full">
+									<div>
+										<div class="txt">
+												회원님의 명의로 등록된 휴대폰으로<br>
+												본인확인을 진행합니다.
+										</div>
+											<div class="ui_row mt20">
+												<button type="button" id="btnCellPhoneCertify" class="btn btn_dark">
+													본인명의 휴대폰으로 인증
+												</button>
+											</div>
+									</div>
+								</div>
+							</div>
+							<div class="form_group hide" style="display: none;">
+								<div class="form_wrap form_full">
+									<div>
+										<div class="txt">
+											아이핀 인증을 통해 찾을 수 있습니다.
+										</div>
+										<div class="ui_row mt20">
+											<button type="button" id="btnIpinCertify" class="btn btn_dark">
+												아이핀 인증
+											</button>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- 아이디찾기 결과 -->
+				<div id="succeedCustId" class="form_wrap form_full" style="display: none;">
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_find"></span>
+							<p>아이디 찾기 결과 안내</p>
+						</div>
+						<div class="form_print_bar mt40">
+							<ul>
+								<li>
+									<span class="t_span">아이디</span>
+									<span id="resultId" name="resultId" class="c_primary bold" data-font="lato"></span>
+								</li>
+								<li>
+									<span class="t_span">가입일자</span>
+									<span id="joinDt" name="joinDt" class="bold" data-font="lato"></span>
+								</li>
+								<li id="liJoinPath">
+									<span class="t_span">가입경로</span>
+									<span id="joinPath" name="joinPath" class="bold" data-font="lato"></span>
+								</li>
+							</ul>
+						</div>
+						<div class="ui_row mt20">
+							<button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_LOGIN);">로그인 하기</button>
+						</div>
+					</div>
+				</div>
+				<!-- //아이디찾기 결과 -->
+				<!-- 회원정보로 아이디찾기 실패일경우 -->
+				<div id="failCustId" class="form_wrap form_full" style="display: none;">
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_none"></span>
+							<p>입력한 정보와 일치하는 아이디가 존재하지 않습니다.</p>
+							<p class="t_info mt10">
+								정확한 확인을 위해 휴대폰 인증/아이핀 인증을 통한<br>아이디 찾기를 진행해 주세요.
+							</p>
+						</div>
+						<div class="btn_group_block btn_group_md ui_row">
+							<div class="ui_col_6">
+								<button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">
+									<span>회원가입</span>
+								</button>
+							</div>
+							<div class="ui_col_6">
+								<button type="button" class="btn btn_dark" onclick="cfnGoToPage(_PAGE_CUSTOMER_ID_FIND);">
+									<span>다시 찾기</span>
+								</button>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- //회원정보로 아이디찾기 실패일경우 -->
+				<!-- 휴대폰,아이핀 본인인증으로 아이디찾기 실패일경우 -->
+				<div id="failAuthentication" class="form_wrap form_full" style="display: none;">
+					<div class="find_result clear">
+						<div class="form_info">
+							<span class="ico_content_none"></span>
+							<p>입력한 정보와 일치하는 아이디가 존재하지 않습니다.</p>
+							<p class="t_info mt10">
+								<span class="c_primary">STYLE24의 새로운 가족이 되어 주세요!</span>
+							</p>
+						</div>
+						<div class="btn_group_block btn_group_md ui_row">
+							<div class="ui_col_12">
+								<button type="button" class="btn btn_primary" onclick="cfnGoToPage(_PAGE_CUSTOMER_JOIN);">
+									<span>회원가입</span>
+								</button>
+							</div>
+						</div>
+					</div>
+				</div>
+				<!-- //휴대폰,아이핀 본인인증으로 아이디찾기 실패일경우 -->
+			</div>
+		</section>
+		<!-- ★ 컨텐츠 종료 -->
+	</main>
+<script th:src="@{'/biz/customer.js?v=' + ${#calendars.format(#calendars.createNow(), 'yyyyMMddHHmmss')}}" src="/biz/customer.js"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	const sEncData = [[${sEncData}]];   //인증 후 해당 페이지로 리다이렉트함
+	const authMethod = [[${authMethod}]]; //인증 후 해당 페이지로 리다이렉트함
+
+	// 회원정보로 아이디 찾기
+	$('#btnInfoConfirm').on('click', function() {
+		let custInfo = $('#searchCustInfo').serializeObject();
+
+		if (gagajf.isNull(custInfo.custNm)) {
+			mcxDialog.alert('이름을 형식에 맞게 입력해주세요.');
+			return;
+		}
+
+		if (gagajf.isNull(custInfo.email)) {
+			mcxDialog.alert('이메일을 입력하여 주세요.');
+			return;
+		}
+
+		if (!fnCheckValidationEmail(custInfo.email)) {
+			mcxDialog.alert('이메일 형식에 맞게 입력해주세요.');
+			return;
+		}
+		custInfo.authMethod = 'custInfo';
+
+		let jsonData = JSON.stringify(custInfo);
+		//console.log('jsonData', jsonData);
+		gagajf.ajaxJsonSubmit('/customer/id/find', jsonData, fnInfoConfirmCallBack);
+	});
+
+	// 찾기결과
+	var fnInfoConfirmCallBack = function (result) {
+		$('#btnInfoConfirm').hide();
+		$('#searchDiv').hide();
+		$('.regist_box').hide();
+		$('.form_field').hide();
+		if (result.isFind) {
+			fnGetDisplaySucc(result.authMethod, result);
+		} else {
+			fnGetDisplayFail(result.authMethod);
+		}
+	};
+
+	// 찾기성공
+	var fnGetDisplaySucc = function (authMethod, custInfo) {
+		$('#resultId').text(custInfo.maskingCustId);
+		$('#joinDt').text(fnToDateFormat(custInfo.joinDt));
+		let joinPath = fnSnsJoinPath(custInfo); // 가입경로 : 직접이면 표시 안함, 간편가입 연동 표시
+		if (!gagajf.isNull(joinPath)) {
+			$('#liJoinPath').show();
+			$('#joinPath').text(joinPath);
+		}
+		$('#succeedCustId').show();
+	};
+
+	// 찾기실패
+	var fnGetDisplayFail = function (authMethod) {
+		$('.registration_nav').hide();
+		if (authMethod === 'custInfo') {
+			$('#failCustId').show();
+		}
+		if (authMethod === 'mobile' || authMethod === 'ipin') {
+			$('#failAuthentication').show();
+		}
+	};
+
+	// 가입경로
+	var fnSnsJoinPath = function (custInfo) {
+		let snsType = '';
+		if (!gagajf.isNull(custInfo.ysJoinDt)) {
+			snsType += 'YES24';
+		}
+		if (!gagajf.isNull(custInfo.nvJoinDt)) {
+			if (!gagajf.isNull(snsType)) {
+				snsType += '/'
+			}
+			snsType = 'NAVER'
+		}
+		if (!gagajf.isNull(custInfo.kkJoinDt)) {
+			if (!gagajf.isNull(snsType)) {
+				snsType += '/'
+			}
+			snsType += 'KAKAO';
+		}
+		if (!gagajf.isNull(snsType)) {
+			snsType += ' 연동';
+		} else {
+			snsType += 'STYLE24';
+		}
+		return snsType;
+	};
+
+	// 휴대폰 인증
+	$('#btnCellPhoneCertify').on('click', function () {
+		cfnOpenCellphoneCertify(_PAGE_CUSTOMER_ID_FIND);
+	});
+
+	// 아이핀 인증
+	$('#btnIpinCertify').on('click', function () {
+		cfnOpenIpinCertify(_PAGE_CUSTOMER_ID_FIND);
+	});
+
+	// 나이스 본인인증 후 콜백
+	var fnNiceCallBack = function(encData, authMethod) {
+		if (!gagajf.isNull(encData)) {
+			let custInfo = {};
+			custInfo.encData = encData;
+			custInfo.authMethod = authMethod;
+			let jsonData = JSON.stringify(custInfo);
+			gagajf.ajaxJsonSubmit('/customer/id/find', jsonData, fnInfoConfirmCallBack)
+		}
+	};
+
+	$(document).ready(function () {
+		if (!gagajf.isNull(sEncData)) {
+			fnNiceCallBack(sEncData, authMethod);
+		}
+
+		/* 회원정보인증/휴대폰인증/아이핀인증_taps */
+		$('.radio_tap > .form_group').hide();
+		$('.radio_tap > .form_group').eq(0).show();
+		$('.radio_tap').each(function(){
+			$(this).find('.form_group').hide();
+			$(this).find('.form_group').eq(0).show();
+		});
+
+		$(document).on('click','.radio_nav > ul > li',function(e){
+			$(this).addClass('active').siblings().removeClass('active');
+			$(this).find('input').prop("checked", true);
+			$(this).parent().parent().parent().find('.radio_tap > .form_group').hide();
+			$(this).parent().parent().parent().find('.radio_tap > .form_group').eq($(this).index()).show();
+			return false;
+		});
+	});
+
+/*]]>*/
+</script>
+
+</th:block>
+</body>
+</html>

+ 32 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceCallbackFormMob.html

@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NiceCallbackFormWeb.html
+ * @desc    : NICE 인증콜백 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.09   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+	<form name="niceCallbackForm" id="niceCallbackForm" method="post" th:action="${redirectUrl}">
+		<input type="hidden" name="sEncData" th:value="${sEncData}"/>
+		<input type="hidden" name="authMethod" th:value="${authMethod}"/>
+	</form>
+<script th:inline="javascript">
+	/*<![CDATA[*/
+	window.onload = function () {
+		document.niceCallbackForm.submit();
+	}
+
+	/*]]>*/
+</script>
+
+</body>
+</html>

+ 37 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceCellPhoneFormMob.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NiceCellPhoneFormWeb.html
+ * @desc    : NICE 휴대폰 인증 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.09   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<form name="niceAuthForm" id="niceAuthForm" method="post" >
+	<input type="hidden" name="m" value="checkplusSerivce" />
+	<input type="hidden" name="EncodeData" th:value="${sEncData}" />
+	<input type="hidden" name="param_r1" th:value="${redirectUrl}"/>
+</form>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	window.onload = function () {
+		document.niceAuthForm.action="https://nice.checkplus.co.kr/CheckPlusSafeModel/checkplus.cb";
+		document.niceAuthForm.submit();
+	};
+	/*]]>*/
+</script>
+
+
+</body>
+</html>

+ 37 - 0
src/main/webapp/WEB-INF/views/mob/customer/NiceIpinFormMob.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : NiceIpinFormWeb.html
+ * @desc    : NICE 아이핀 인증 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.02.09   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+
+<form name="niceAuthForm" id="niceAuthForm" method="post" >
+	<input type="hidden" name="m" value="pubmain" />
+	<input type="hidden" name="enc_data" th:value="${sEncData}" />
+	<input type="hidden" name="param_r1" th:value="${redirectUrl}"/>
+</form>
+
+<script th:inline="javascript">
+	/*<![CDATA[*/
+
+	window.onload = function () {
+		document.niceAuthForm.action="https://cert.vno.co.kr/ipin.cb";
+		document.niceAuthForm.submit();
+	};
+	/*]]>*/
+</script>
+
+
+</body>
+</html>

+ 210 - 0
src/main/webapp/WEB-INF/views/mob/customer/PasswordFindFormMob.html

@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="mob/common/layout/LoginLayoutMob">
+<!--
+ *******************************************************************************
+ * @source  : PasswordFindFormMob.html
+ * @desc    : 비밀번호 찾기 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.04.12   jsshin     최초 작성
+ *******************************************************************************
+ -->
+<body>
+	<div class="app">
+
+		<a href="#mainCon" class="skipNav">본문바로가기</a>
+		<header></header>
+
+		<main role="" id="" class="container mb">
+			
+			<!-- ★ 컨텐츠 시작 -->
+			<section class="content mb_idInquiry_1">
+				<div class="inner">
+                    <div class="close">
+                        <a href="#none" class="btn_close"><span></span><span></span></a>
+                    </div>
+                </div>
+				<div class="inner">
+					<h2 class="title">아이디/비밀번호찾기</h2>
+				</div>
+				<div class="inner">
+                        <div class="registration_nav">
+                            <ul class="tab_btn">
+                                <li class="active">아이디찾기</li>
+                                <li>비밀번호찾기</li>
+                            </ul>
+                        </div>
+                        <div class="registration_tap">
+                            <div class="form_group">
+                                <!-- 라디오탭 -->
+                                <div class="radio_nav">
+                                    <ul class="form_field">
+                                        <li class="ui_col_4 active">
+                                            <input type="radio" name="radio1" id="rdi1-1" value="1" checked><label for="rdi1-1"> <span>회원정보인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radio1" id="rdi1-2" value="2"><label for="rdi1-2"> <span>휴대폰인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radio1" id="rdi1-3" value="3"><label for="rdi1-3"> <span>아이핀인증</span> </label> 
+                                        </li>
+                                    </ul>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                  <!-- 라디오탭 -->
+                                <div class="radio_tap">
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="form_field mt0"><input type="text" placeholder="이름" class="form_control"></div>
+                                                <div class="form_field"><input type="password" placeholder="생년월일 8자리(예:19880912)" class="form_control"></div>
+                                                <div class="form_field"><input type="text" placeholder="이메일" class="form_control"></div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">확인</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    회원님의 명의로 등록된 휴대폰으로<br>
+                                                    본인확인을 진행합니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">본인명의 휴대폰으로 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    아이핀 인증을 통해 찾을 수 있습니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">아이핀 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                
+                            </div>
+                            <div class="form_group">
+                                <!-- 라디오탭 -->
+                                <div class="radio_nav">
+                                    <ul class="form_field">
+                                        <li class="ui_col_4 active">
+                                            <input type="radio" name="radios" id="rdi-4" value="4" checked><label for="rdi-4"> <span>회원정보인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radios" id="rdi-5" value="5"><label for="rdi-5"> <span>휴대폰인증</span> </label>
+                                        </li>
+                                        <li class="ui_col_4">
+                                            <input type="radio" name="radios" id="rdi-6" value="6"><label for="rdi-6"> <span>아이핀인증</span> </label> 
+                                        </li>
+                                    </ul>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                  <!-- 라디오탭 -->
+                                <div class="radio_tap">
+                                    <div class="form_group">
+                                         <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="form_field mt0"><input type="text" placeholder="이름" class="form_control"></div>
+                                                <div class="form_field"><input type="password" placeholder="생년월일 8자리(예:19880912)" class="form_control"></div>
+                                                <div class="form_field"><input type="text" placeholder="이메일" class="form_control"></div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">확인</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    회원님의 명의로 등록된 휴대폰으로<br>
+                                                    본인확인을 진행합니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">본인명의 휴대폰으로 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                    <div class="form_group">
+                                        <form class="form_wrap form_full">
+                                            <div>
+                                                <div class="txt">
+                                                    아이핀 인증을 통해 찾을 수 있습니다.
+                                                </div>
+                                                <div class="ui_row mt20"><button class="btn btn_dark">아이핀 인증</button></div>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                                 <!-- //라디오탭 -->
+                                
+                            </div>
+                        </div>
+
+			</section>
+			<!-- ★ 컨텐츠 종료 -->	
+
+		</main>
+
+		<footer></footer>
+
+	</div>
+
+    <script>
+        $(document).ready(function () {
+            /* 아이디/비밀번호 찾기_taps */
+            $('.registration_tap > .form_group').hide();	
+            $('.registration_tap > .form_group').eq(0).show();
+            $(document).on('click','.registration_nav > ul > li',function(e){
+                $(this).addClass('active').siblings().removeClass('active');
+                $('.registration_tap > .form_group').hide();		
+                $('.registration_tap > .form_group').eq($(this).index()).show();
+                return false;
+            });
+
+            /* 회원정보인증/휴대폰인증/아이핀인증_taps */
+            $('.radio_tap > .form_group').hide();	
+            $('.radio_tap > .form_group').eq(0).show();
+            $('.radio_tap').each(function(){
+                $(this).find('.form_group').hide();
+                $(this).find('.form_group').eq(0).show();
+            });
+
+            $(document).on('click','.radio_nav > ul > li',function(e){
+                $(this).addClass('active').siblings().removeClass('active');
+                $(this).find('input').prop("checked", true);
+                $(this).parent().parent().parent().find('.radio_tap > .form_group').hide();		
+                $(this).parent().parent().parent().find('.radio_tap > .form_group').eq($(this).index()).show();
+                return false;
+            });
+        });
+    </script>
+
+    <script type="text/javascript">
+        $(document).ready(function(){
+            setHtop();
+        });
+
+        function setHtop() {
+            if($('header').hasClass('main')) {
+                $('#htopMain').show();
+                $('#htopSub').hide();
+            } else {
+                $('#htopMain').hide();
+                $('#gnb').hide();
+                $('#htopSub').show();
+            }
+        }
+    </script>
+</body>
+
+</html>

+ 1 - 0
src/main/webapp/WEB-INF/views/web/customer/IdFindFormWeb.html

@@ -277,6 +277,7 @@
 
 		// 찾기실패
 		var fnGetDisplayFail = function (authMethod) {
+			$('.registration_nav').hide();
 			if (authMethod === 'custInfo') {
 				$('#failCustId').show();
 			}

+ 1 - 1
src/main/webapp/ux/mo/css/layout_m.css

@@ -238,7 +238,7 @@
 .mb .find_result .form_print_bar ul li span.t_span {width:7.5rem; color:#888;}	
 .mb .btn_group_block {float:none; margin-top:3rem; display:flex;}
 .mb [class^="ico_content_"]::before {margin: 0px auto 1.5rem;}
-.ico_content_find::before {width:3.6rem; height:4.6rem; background:url(../images/ico_content_find.png) no-repeat 50% 50%;}
+.ico_content_find::before {width:3.6rem; height:4.6rem; background:url('/images/mo/ico_content_find.png') no-repeat 50% 50%;}
 
 /* mb_login */
 .mb .mb_login .login_check{font-size:1.2rem; line-height:1.8rem;}

+ 4 - 4
src/main/webapp/ux/style24_link.js

@@ -133,7 +133,6 @@ var cfnGoToPage = function(page, ithrCd) {
  *		 MO : redirectUrl 호출하는 페이지에서 넣어줘야됨
  * </pre>
  * @param  redirectUrl - 모바일에서 사용 페이지이동으로 하기 때문에
- * @param  custparams - 회원정보수정 화면에서 사용함
  * @since  : 2021/02/09
  * @author : jsshin
  */
@@ -146,6 +145,7 @@ var cfnOpenCellphoneCertify = function (redirectUrl, custparams) {
 	if ('P' === _frontGb) {
 		window.open(actionUrl, "popupCellphone", "top=" + popupY + ", left=" + popupX + ", width=" + popupWidth + ", height=" + popupHeight + ", fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbar=no");
 	} else {
+		console.log('redirectUrl', redirectUrl);
 		if (!gagajf.isNull(redirectUrl)) {
 			actionUrl = actionUrl + "?redirectUrl=" + redirectUrl;
 			if (!gagajf.isNull(custparams)) {
@@ -300,7 +300,7 @@ function cfnAddCart(cartList) {
  *	 cfnLoginNaver();
  *	 호출된 페이지에서
  *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *	 MO :
+ *	 MO : SnsCallBackFormMob.html 해당 페이지 후 처리
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -326,7 +326,7 @@ var cfnLoginNaver = function (requestGb, chkRememberMe) {
  *	 cfnLoginKakao();
  *	 호출된 페이지에서
  *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *	 MO :
+ *	 MO : SnsCallBackFormMob.html 해당 페이지 후 처리
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin
@@ -352,7 +352,7 @@ var cfnLoginKakao = function (requestGb, chkRememberMe) {
  *	 cfnLoginYes24();
  *	 호출된 페이지에서
  *	 PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
- *	 MO :
+ *	 MO : SnsCallBackFormMob.html 해당 페이지 후 처리
  * </pre>
  * @since  : 2021/02/23
  * @author : jsshin