Procházet zdrojové kódy

카카오 로그인 및 가입 개발 중

jsshin před 5 roky
rodič
revize
3e8bb7f4c9

+ 4 - 1
pom.xml

@@ -59,7 +59,10 @@
 			<artifactId>commons-io</artifactId>
 			<version>2.6</version>
 		</dependency>
-		
+		<dependency>
+			<groupId>com.googlecode.libphonenumber</groupId>
+			<artifactId>libphonenumber</artifactId>
+		</dependency>
 		<!-- /// WEB-INF lib -->
 		<dependency>
 			<groupId>com.gagaframework</groupId>

+ 5 - 2
src/main/java/com/style24/front/biz/service/TsfCustomerService.java

@@ -202,7 +202,8 @@ public class TsfCustomerService {
 
 	/**
 	 * 회원가입 처리
-	 * @param customer - 일반가입, SNS 가입
+	 * @param customer - 일반가입
+	 * @return boolean - 가입 성공 true / 실패 false
 	 * @author jsshin
 	 * @since 2021. 02. 19
 	 */
@@ -210,6 +211,7 @@ public class TsfCustomerService {
 	public boolean saveJoinCustomer(Customer customer) {
 		boolean isJoin = true;
 		// 1. validation
+		customer.setHypenCellPhone();
 		customer.encryptData();
 		if (StringUtils.isNotBlank(customer.getSnsId())) {
 			customer.setEncodedPasswd(" ");
@@ -220,6 +222,7 @@ public class TsfCustomerService {
 		customer.setCustStat(TscConstants.CustStat.ACTIVE.value());
 		customer.setCustGb(TscConstants.CustGb.NORMAL.value());
 		customer.setCustGrade(TscConstants.CustGrade.WELCOME.value());
+
 		int custCnt = customerDao.createCustomer(customer);
 
 		if (custCnt > 0) {
@@ -251,7 +254,7 @@ public class TsfCustomerService {
 
 	/**
 	 * 로그인 처리
-	 * @param custNo - 고객번호
+	 * @param custId - 고객아이디
 	 * @param request - 요청
 	 * @author jsshin
 	 * @since 2021. 02. 18

+ 61 - 16
src/main/java/com/style24/front/biz/thirdparty/KaKaoLogin.java

@@ -2,8 +2,12 @@ package com.style24.front.biz.thirdparty;
 
 import com.gagaframework.web.parameter.GagaMap;
 import com.gagaframework.web.util.GagaFileUtil;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
+import com.google.i18n.phonenumbers.NumberParseException;
+import com.google.i18n.phonenumbers.PhoneNumberUtil;
+import com.google.i18n.phonenumbers.Phonenumber;
 import com.style24.front.support.security.session.TsfSession;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -38,6 +42,8 @@ public class KaKaoLogin {
 	@Autowired
 	private RestTemplate restTemplate;
 
+	public static final String PROTOCOL = "http://";
+
 	private String callBackUrl;
 	private String restApiKey;
 	private String profiles;
@@ -67,16 +73,22 @@ public class KaKaoLogin {
 	}
 
 	public String getAuthorizeUrl(String state) {
-		String apiUrl = authorizeUrl;
-		String redirectUri = GagaFileUtil.getConcatenationPath("https://" + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
-		apiUrl += "?client_id=" + restApiKey + "&redirect_uri=" + redirectUri + "&response_type=code&state=" + state;
-		log.info("api ===> {}", apiUrl);
-		return apiUrl;
+		StringBuilder apiUrlBuilder = new StringBuilder();
+		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
+		apiUrlBuilder.append(authorizeUrl)
+				.append("?client_id=")
+				.append(restApiKey)
+				.append("&redirect_uri=")
+				.append(redirectUri)
+				.append("&response_type=code&state=")
+				.append(state);
+		log.info("apiUrlBuilder ===> {}", apiUrlBuilder.toString());
+		return apiUrlBuilder.toString();
 	}
 
 	public GagaMap getAccessTocken(String code, String state) {
 		GagaMap resultMap = new GagaMap();
-		String redirectUri = GagaFileUtil.getConcatenationPath("https://" + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
+		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
 		String requestGb = "";
 		try {
 			MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
@@ -89,7 +101,7 @@ public class KaKaoLogin {
 			// state 값에 리다이렉트 url 같이 넘겨줌
 			if (StringUtils.isNotBlank(state)) {
 				String[] stateArr = StringUtils.split(state, "!@!");
-				   requestGb = stateArr[1];
+				requestGb = stateArr[1];
 			}
 
 			// Header
@@ -106,7 +118,8 @@ public class KaKaoLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj = gson.fromJson(jsonResult, JsonObject.class);
 
 			resultMap.setString("access_token", obj.get("access_token").toString());
 			resultMap.setString("refresh_token", obj.get("refresh_token").toString());
@@ -137,12 +150,29 @@ public class KaKaoLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("responseEntity.getBody(): {} ", jsonResult);
 
+			Gson gson = new GsonBuilder().create();
+
+			JsonObject obj = gson.fromJson(jsonResult, JsonObject.class);
+			GagaMap properties = gson.fromJson(obj.get("properties"), GagaMap.class);
+			GagaMap kakaoAccount = gson.fromJson(obj.get("kakao_account"), GagaMap.class);
+
+
+
+			String birthYmd = kakaoAccount.getString("birthyear") + kakaoAccount.getString("birthday");
+			String sexGb = kakaoAccount.getString("gender").equals("male") ? "M":"F";
+			String birthSm = kakaoAccount.getString("birthday_type").equals("SOLAR") ? "S":"L";
+			String cellPhnno = getPhoneNumber(kakaoAccount.getString("phone_number"));
+
+			resultMap.setString("snsId", obj.get("id").toString());
+			resultMap.setString("custNm", properties.getString("nickname"));
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
-			JsonObject properties = obj.get("properties").getAsJsonObject();
+			resultMap.setString("email", kakaoAccount.getString("email"));
+			resultMap.setString("ci", kakaoAccount.getString("ci"));
 
-			resultMap.setString("id", obj.get("id").toString());
-			resultMap.setString("name", properties.get("nickname").toString());
+			resultMap.setString("cellPhnno", cellPhnno);
+			resultMap.setString("birthYmd", birthYmd);
+			resultMap.setString("birthSm", birthSm);
+			resultMap.setString("sexGb", sexGb);
 
 		} catch (Exception e) {
 			log.error(e.getMessage());
@@ -172,7 +202,8 @@ public class KaKaoLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj =  gson.fromJson(jsonResult, JsonObject.class);
 			resultMap.setString("access_token", obj.get("access_token").toString());
 
 		} catch (Exception e) {
@@ -199,12 +230,26 @@ public class KaKaoLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
-			resultMap.setString("id", obj.get("id").toString());
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj =  gson.fromJson(jsonResult, JsonObject.class);
+
+			resultMap.setString("snsId", obj.get("id").toString());
 
 		} catch (Exception e) {
 			log.error(e.getMessage());
 		}
 		return resultMap;
 	}
+
+
+	public String getPhoneNumber(String cellPhnno) throws Exception {
+		String result = "";
+		if (StringUtils.isNotBlank(cellPhnno)) {
+			PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
+			Phonenumber.PhoneNumber numberProto = phoneUtil.parse(cellPhnno, "KR");
+			result = phoneUtil.format(numberProto, PhoneNumberUtil.PhoneNumberFormat.NATIONAL).replaceAll("-", "");
+		}
+
+		return result;
+	}
 }

+ 28 - 11
src/main/java/com/style24/front/biz/thirdparty/NaverLogin.java

@@ -4,6 +4,8 @@ import java.net.URI;
 
 import javax.annotation.PostConstruct;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.style24.front.support.security.session.TsfSession;
@@ -41,6 +43,8 @@ public class NaverLogin {
 	@Autowired
 	private RestTemplate restTemplate;
 
+	public static final String PROTOCOL = "http://";
+
 	private String callBackUrl;
 	private String clientId;
 	private String clientSecret;
@@ -71,11 +75,18 @@ public class NaverLogin {
 	}
 
 	public String getAuthorizeUrl(String state) {
-		String apiUrl = authorizeUrl;
-		String redirectUri = GagaFileUtil.getConcatenationPath("https://" + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
-		apiUrl += "?response_type=code&client_id=" + clientId + "&redirect_uri=" + redirectUri + "&state=" + state;
-		log.info("api ===> {}", apiUrl);
-		return apiUrl;
+		StringBuilder apiUrlBuilder = new StringBuilder();
+		String redirectUri = GagaFileUtil.getConcatenationPath(PROTOCOL + TsfSession.getHttpServletRequest().getServerName(), callBackUrl);
+		apiUrlBuilder.append(authorizeUrl)
+				.append("?response_type=code&client_id=")
+				.append(clientId)
+				.append("&redirect_uri=")
+				.append(redirectUri)
+				.append("&state=")
+				.append(state);
+
+		log.info("apiUrlBuilder ===> {}", apiUrlBuilder.toString());
+		return apiUrlBuilder.toString();
 	}
 
 	public GagaMap getAccessTocken(String code, String state) {
@@ -109,11 +120,13 @@ public class NaverLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("getAccessTocken responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj = gson.fromJson(jsonResult, JsonObject.class);
 
 			resultMap.setString("access_token", obj.get("access_token").toString());
 			resultMap.setString("refresh_token", obj.get("refresh_token").toString());
 			resultMap.setString("requestGb", requestGb);
+
 		} catch (Exception e) {
 			log.error(e.getMessage());
 		}
@@ -140,10 +153,11 @@ public class NaverLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("getNaverUserInfo responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
-			JsonObject response = obj.get("response").getAsJsonObject();
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj = gson.fromJson(jsonResult, JsonObject.class);
+			JsonObject response = gson.fromJson(obj.get("response"), JsonObject.class);
 
-			resultMap.setString("id", response.get("id").toString());
+			resultMap.setString("snsId", response.get("id").toString());
 			resultMap.setString("email", response.get("email").toString());
 
 		} catch (Exception e) {
@@ -175,7 +189,9 @@ public class NaverLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("getRefreshTocken responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj =  gson.fromJson(jsonResult, JsonObject.class);
+
 			resultMap.setString("access_token", obj.get("access_token").toString());
 
 		} catch (Exception e) {
@@ -208,7 +224,8 @@ public class NaverLogin {
 			String jsonResult = responseEntity.getBody();
 			log.info("saveUnlink : responseEntity.getBody(): {} ", jsonResult);
 
-			JsonObject obj = new JsonParser().parse(jsonResult).getAsJsonObject();
+			Gson gson = new GsonBuilder().create();
+			JsonObject obj =  gson.fromJson(jsonResult, JsonObject.class);
 
 			resultMap.setString("access_token", obj.get("access_token").toString());
 			resultMap.setString("result", obj.get("result").toString());

+ 23 - 10
src/main/java/com/style24/front/biz/web/TsfCustomerController.java

@@ -581,7 +581,7 @@ public class TsfCustomerController extends TsfBaseController {
 	}
 
 	/**
-	 * 가입
+	 * 가입처리
 	 *
 	 * @param customer - 고객정보
 	 * @return GagaMap - 결과정보
@@ -612,17 +612,30 @@ public class TsfCustomerController extends TsfBaseController {
 
 		// 3.고객정보 생성 및 혜택 처리
 		boolean isJoin = customerService.saveJoinCustomer(customer);
-		// 4.알림톡 및 메일 발송
-		try {
-			if(StringUtils.isNotBlank(customer.getCellPhnno())) {
-				kakaoService.sendJoinCongrat(customer);
-			}
-		} catch (Exception e) {
-			log.error("error", e);
-		}
+
 
 		if (isJoin) {
-			customerService.getLogin(customer.getCustId(),request);
+			// 4.알림톡 발송
+			try {
+				if(StringUtils.isNotBlank(customer.getCellPhnno())) {
+					kakaoService.sendJoinCongrat(customer);
+				}
+			} catch (Exception e) {
+				log.error("error", e);
+			}
+
+			// 5. 이메일 발송
+			try {
+				if(StringUtils.isNotBlank(customer.getEmail())) {
+					// TODO : 2021.02.23 이메일 모듈 개발 필요 jsshin
+				}
+			} catch (Exception e) {
+				log.error("error", e);
+			}
+
+			// 6. 가입성공시 로그인 처리 실패시
+			customerService.getLogin(customer.getCustId(), request);
+
 		} else {
 			TsfSession.setAttribute("maskingCustId",customer.getMaskingCustId());
 		}

+ 131 - 0
src/main/java/com/style24/front/biz/web/TsfIndexController.java

@@ -1,17 +1,24 @@
 package com.style24.front.biz.web;
 
 import java.io.IOException;
+import java.math.BigInteger;
+import java.security.SecureRandom;
 
 import javax.servlet.RequestDispatcher;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import com.gagaframework.web.parameter.GagaMap;
+import com.style24.front.biz.thirdparty.KaKaoLogin;
+import com.style24.front.biz.thirdparty.NaverLogin;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -39,6 +46,12 @@ public class TsfIndexController extends TsfBaseController {
 	@Autowired
 	private TscMessageByLocale message;
 
+	@Autowired
+	private KaKaoLogin kakaoLogin;
+
+	@Autowired
+	private NaverLogin naverLogin;
+
 	/**
 	 * 에러 페이지
 	 * @return
@@ -131,4 +144,122 @@ public class TsfIndexController extends TsfBaseController {
 		return mav;
 	}
 
+	/**
+	 * 카카오 로그인 페이지 호출
+	 *
+	 * @return String
+	 * @author jsshin
+	 * @since 2021. 02. 23
+	 */
+	@GetMapping("/signin/kakologin")
+	public String signinKaKaoLogin(@RequestParam(value = "rememberMe", required = false) String rememberMe, @RequestParam(value = "requestGb", required = false) String requestGb) {
+
+		if (StringUtils.isNotBlank(rememberMe)) {
+			// RememberMe 세션 저장
+			TsfSession.setAttribute("rememberMe", String.valueOf(rememberMe));
+		}
+		// CSRF 방지를 위한 상태 토큰 생성 코드
+		SecureRandom random = new SecureRandom();
+		String state = new BigInteger(130, random).toString(32);
+		state += "!@!" + requestGb;
+		TsfSession.setAttribute("state", state);
+
+		String redirectUrl = kakaoLogin.getAuthorizeUrl(state);
+
+		return "redirect:" + redirectUrl;
+	}
+
+	/**
+	 * 네이버 로그인 페이지 호출
+	 *
+	 * @return String
+	 * @author jsshin
+	 * @since 2020. 5. 25
+	 */
+	@GetMapping("/signin/naverlogin")
+	public String signinNaverLogin(@RequestParam(value = "rememberMe", required = false) String rememberMe, @RequestParam(value = "requestGb", required = false) String requestGb) {
+		if (StringUtils.isNotBlank(rememberMe)) {
+			// RememberMe 세션 저장
+			TsfSession.setAttribute("rememberMe", String.valueOf(rememberMe));
+		}
+
+		SecureRandom random = new SecureRandom();
+		String state = new BigInteger(130, random).toString(32);
+		state += "!@!" + requestGb;
+		TsfSession.setAttribute("state", state);
+
+		String redirectUrl = naverLogin.getAuthorizeUrl(state);
+
+		return "redirect:" + redirectUrl;
+	}
+
+
+	/**
+	 * SNS 로그인
+	 *
+	 * @param session - HttpSession
+	 * @param snsType - SNS유형(NV:네이버, KK:카카오)
+	 * @return ModelAndView
+	 * @author jsshin
+	 * @since 2021. 02. 23
+	 */
+	@RequestMapping("/signin/snsLoginCallback")
+	public ModelAndView signinSnsLoginCallback(@RequestParam(value = "snsType", required = false) String snsType, HttpSession session
+			, @RequestParam(value = "code", required = false) String code, @RequestParam(value = "state", required = false) String state
+			, @RequestParam(value = "error", required = false) boolean isError) {
+
+		ModelAndView mav = new ModelAndView();
+
+		log.info("isError: {}", isError);
+
+		if (isError) {
+			Exception ex = (Exception)session.getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
+			log.debug("e.getMessage(): {}", ex.getMessage());
+			mav.addObject("error", ex.getMessage());
+		}
+
+		GagaMap userInfo = new GagaMap();
+		boolean isSnsLoing = false;
+		if (StringUtils.isNotBlank(code) && "KK".equals(snsType)) {
+			GagaMap tokenInfo = kakaoLogin.getAccessTocken(code, state);
+			userInfo = kakaoLogin.getKakaoUserInfo(tokenInfo.getString("access_token"));
+			userInfo.setString("accessToken", tokenInfo.getString("access_token"));
+			userInfo.setString("refreshToken", tokenInfo.getString("refresh_token"));
+			userInfo.setString("snsType", snsType);
+			userInfo.setString("requestGb", tokenInfo.getString("requestGb"));
+			isSnsLoing = true;
+		}
+
+		if (StringUtils.isNotBlank(state) && "NV".equals(snsType)) {
+			String sessionState = TsfSession.getAttribute("state");
+			if (sessionState.equals(state)) {
+				GagaMap tokenInfo = naverLogin.getAccessTocken(code, state);
+				userInfo = naverLogin.getNaverUserInfo(tokenInfo.getString("access_token"));
+				userInfo.setString("accessToken", tokenInfo.getString("access_token"));
+				userInfo.setString("refreshToken", tokenInfo.getString("refresh_token"));
+				userInfo.setString("snsType", snsType);
+				userInfo.setString("requestGb", tokenInfo.getString("requestGb"));
+				isSnsLoing = true;
+			}
+		}
+
+		// SNS 로그인 성공시 정보 세션 저장
+		if (isSnsLoing) {
+
+		}
+
+		// RememberMe 값이 있고 true이면
+		if (StringUtils.isNotBlank(TsfSession.getAttribute("rememberMe")) && Boolean.valueOf(TsfSession.getAttribute("rememberMe"))) {
+			userInfo.setBoolean("rememberMe", true);
+		}
+
+		mav.addObject("userInfo", userInfo);
+
+		mav.addObject("snsType", snsType);
+
+		mav.setViewName(super.getDeviceViewName("SnsCallBackForm"));
+
+		return mav;
+	}
+
 }

+ 14 - 14
src/main/resources/config/application.yml

@@ -48,20 +48,20 @@ naver:
 
 #카카오 API
 kakao:
-#    appId: 442702
-#    appName: 아이스타일24
-#    companyName: 예스이십사
-#    nativeAppKey: 5d97db2ee36fa0e121d962b2531ae0c1
-#    restApiKey: 46d601394bd887cbada3cf00fdddef54
-#    javascriptKey: b3c9ee69171042c3637e8d714a4c8a75
-#    adminKey: 7cc33b2ef96d785c4caf3376f9dc9254
-    appId : 399207
-    appName : 구축용 테스트앱
-    companyName : 예스이십사
-    nativeAppKey : f961e612e07b47aa2d1884714518a194
-    restApiKey: b3955cef0328a09156c7e25f18552164
-    javascriptKey : 06cab652ad5d25be2190388d11a88fa4
-    adminKey : a25ca74dde640f3a63a8d8442fe35fcd
+    appId: 442702
+    appName: 아이스타일24
+    companyName: 예스이십사
+    nativeAppKey: 5d97db2ee36fa0e121d962b2531ae0c1
+    restApiKey: 46d601394bd887cbada3cf00fdddef54
+    javascriptKey: b3c9ee69171042c3637e8d714a4c8a75
+    adminKey: 7cc33b2ef96d785c4caf3376f9dc9254
+#    appId : 399207
+#    appName : 구축용 테스트앱
+#    companyName : 예스이십사
+#    nativeAppKey : f961e612e07b47aa2d1884714518a194
+#    restApiKey: b3955cef0328a09156c7e25f18552164
+#    javascriptKey : 06cab652ad5d25be2190388d11a88fa4
+#    adminKey : a25ca74dde640f3a63a8d8442fe35fcd
     addressApiRequestUrl : https://dapi.kakao.com/v2/local/search/address.json?page=1&query=
     login.callbackUrl: /signin/snsLoginCallback?snsType=KK
     tokenUrl: https://kauth.kakao.com/oauth/token

+ 31 - 16
src/main/webapp/WEB-INF/views/web/SigninFormWeb.html

@@ -95,13 +95,13 @@
 							<h5 class="sr-only">간편로그인</h5>
 							<ul>
 								<li>
-									<a href="javascript:void(0)">
+									<a href="javascript:void(0)" onclick="cfnLoginKakao();">
 										<i class="ico ico_snslogin kakao"></i>
 										<span>카카오로 시작하기</span>
 									</a>
 								</li>
 								<li>
-									<a href="javascript:void(0)">
+									<a href="javascript:void(0)" onclick="cfnLoginNaver();">
 										<i class="ico ico_snslogin naver"></i>
 										<span>네이버로 시작하기</span>
 									</a>
@@ -230,23 +230,38 @@
 	let fnReloadCaptchaImage = function() {
 		$('#imgCaptcha').attr('src', '/common/captcha.do?dummy=' + new Date());
 	}
-	
-	// 카카오 로그인
-	var fnLoginKakao = function() {
-		document.location.href = _frontUrl + '/signin/kakologin';
-	};
-	
-	// 네이버 로그인
-	var fnLoginNaver = function() {
-		document.location.href = _frontUrl + '/signin/naverlogin';
+
+	// SNS 로그인 콜백함수
+	var fnSnsSigninCallback = function(userInfo) {
+		console.log('userInfo', userInfo);
+		let params = {};
+		params.snsType = userInfo.snsType;
+		params.snsJoinId = [[${snsLoginPrefix}]] + userInfo.snsId;
+		// $.post(_frontUrl + '/login'
+		// 	, $.param(params)
+		// 	, function(result) {
+		// 		fnReloadAfterLogin(result);
+		// 	}
+		// 	, "json");
 	};
-	
-	// YES24 로그인
-	var fnLoginYes24 = function() {
-		document.location.href = _frontUrl + '/signin/yes24login';
+
+	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() {
+
+
+$(document).ready(function() {
 		$('#loginForm input[name=loginId]').val(gagajf.getCookie(ckLoginId));
 		if (gagajf.isNull($('#loginForm input[name=loginId]').val())) {
 			$('#loginForm input[name=loginId]').focus();

+ 53 - 0
src/main/webapp/ux/style24_link.js

@@ -129,3 +129,56 @@ var cfnOpenIpinCertify = function (redirectUrl) {
 		}
 	}
 };
+
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   :  네이버 로그인
+ * <pre>
+ *     cfnLoginNaver();
+ *     호출된 페이지에서
+ *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *     MO :
+ * </pre>
+ * @since  : 2021/02/23
+ * @author : jsshin
+ */
+var cfnLoginNaver = function (requestGb, chkRememberMe) {
+	var actionUrl = _frontUrl + '/signin/naverlogin?rememberMe=' + chkRememberMe;
+	var popupHeight = 800;
+	var popupWidth = 600;
+	var popupX = (window.screen.width / 2) - (popupWidth / 2);
+	var popupY = (window.screen.height / 3) - (popupHeight / 3);
+	if ('P' === _frontGb) {
+		window.open(actionUrl, 'naverLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
+	} else {
+		document.location.href = actionUrl + '&requestGb=' + requestGb;
+	}
+};
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 카카오 로그인
+ * <pre>
+ *     cfnLoginKakao();
+ *     호출된 페이지에서
+ *     PC: fnSnsSigninCallback(userInfo) 콜백 함수 생성 후 가지고 호출 처리
+ *     MO :
+ * </pre>
+ * @since  : 2021/02/23
+ * @author : jsshin
+ */
+var cfnLoginKakao = function (requestGb, chkRememberMe) {
+	var actionUrl = _frontUrl + '/signin/kakologin?rememberMe=' + chkRememberMe;
+	var popupWidth = 450;
+	var popupHeight = 700;
+	var popupX = (window.screen.width / 2) - (popupWidth / 2);
+	var popupY = (window.screen.height / 3) - (popupHeight / 3);
+	if ('P' === _frontGb) {
+		window.open(actionUrl, 'kakaoLogin', 'top=' + popupY + ',left=' + popupX + ',height=' + popupHeight + ',width=' + popupWidth + ', fullscreen=no,menubar=no,status=no,toolbar=no,titlebar=yes,location=no,scrollbars=yes', '');
+	} else {
+		document.location.href = actionUrl + '&requestGb=' + requestGb;
+	}
+};