diff --git a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java index f0ed2d97..81b2c601 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java @@ -171,6 +171,7 @@ public class EgovMypageController { @RequestMapping(value="/web/user/mberInfoIndex.do") public String mberInfoIndex( ModelMap model + , HttpServletRequest request , RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 @@ -448,6 +449,27 @@ public class EgovMypageController { } + + { + /** + * 보안인증 본인인증 기능추가 + * 20241120 원영현 과장 추가 + * */ + KmcCertChecker kmcCertCheck = new KmcCertChecker(); + + //kmc 본인인증 실/개발 서버 구분 + String serverNm = ""; + if(request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) { + serverNm = request.getScheme() + "://219.240.88.15:8095"; + }else{ + serverNm = request.getScheme() + "://www.munjaon.co.kr"; + } + + AuthCertVO certVO = kmcCertCheck.authCertCheckNine(serverNm + "/web/user/selectSecurityAuthn.do", loginVO.getId()); + model.addAttribute("certVO", certVO); + } + + return "web/user/mberInfoIndex"; } @@ -3494,4 +3516,254 @@ public class EgovMypageController { } return modelAndView; } + + + /** + * 회원정보 조회 휴대폰 인증 + */ + @RequestMapping("/web/user/selectSecurityAuthn.do") + public String selectSecurityAuthn( + HttpServletRequest request, ModelMap model + , @RequestParam Map commandMap + , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { + + //개인회원일 시 mblDn 비교 후 본인 명의 휴대폰만 변경 가능하게끔 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String mblDn = userManageService.selectUserMblDnById(loginVO.getId()); + model.addAttribute("loginVO", loginVO); + + String errMessage = ""; //에러메세지 + + String rec_cert = ""; // 결과값(암호화) + String certNum = ""; // certNum + + rec_cert = request.getParameter("rec_cert").trim(); + certNum = request.getParameter("certNum").trim(); + + kmcVO.setRecCert(rec_cert); + kmcVO.setCertNum(certNum); + // 파라미터 유효성 검증 + if( rec_cert.length() == 0 || certNum.length() == 0 ){ + errMessage = "비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + + // 변수선언 -------------------------------------------------------------------------------------------------------- + String k_certNum = ""; // 파라미터로 수신한 요청번호 + k_certNum = certNum; + String date = ""; // 요청일시 + String CI = ""; // 연계정보(CI) + String DI = ""; // 중복가입확인정보(DI) + String phoneNo = ""; // 휴대폰번호 + String phoneCorp = ""; // 이동통신사 + String birthDay = ""; // 생년월일 + String gender = ""; // 성별 + String nation = ""; // 내국인 + String name = ""; // 성명 + String M_name = ""; // 미성년자 성명 + String M_birthDay = ""; // 미성년자 생년월일 + String M_Gender = ""; // 미성년자 성별 + String M_nation = ""; // 미성년자 내외국인 + String result = ""; // 결과값 + + String certMet = ""; // 인증방법 + String ip = ""; // ip주소 + String plusInfo = ""; + + String encPara = ""; + String encMsg1 = ""; + String encMsg2 = ""; + String msgChk = ""; + + com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager(); + + //02. 1차 복호화 + //수신된 certNum를 이용하여 복호화 + rec_cert = seed.getDec(rec_cert, k_certNum); + + //03. 1차 파싱 + int inf1 = rec_cert.indexOf("/",0); + int inf2 = rec_cert.indexOf("/",inf1+1); + + encPara = rec_cert.substring(0,inf1); //암호화된 통합 파라미터 + encMsg1 = rec_cert.substring(inf1+1,inf2); //암호화된 통합 파라미터의 Hash값 + + //04. 위변조 검증 + encMsg2 = seed.getMsg(encPara); + kmcVO.setEncMsg2(encMsg2); + if(encMsg2.equals(encMsg1)){ + msgChk="Y"; + } + + if(!"Y".equals(msgChk)) { + errMessage = "비정상접근입니다."; + return returnPage(model , errMessage , kmcVO) ; + } + + //05. 2차 복호화 + rec_cert = seed.getDec(encPara, k_certNum); + kmcVO.setRecCert(rec_cert); + //06. 2차 파싱 + int info1 = rec_cert.indexOf("/",0); + int info2 = rec_cert.indexOf("/",info1+1); + int info3 = rec_cert.indexOf("/",info2+1); + int info4 = rec_cert.indexOf("/",info3+1); + int info5 = rec_cert.indexOf("/",info4+1); + int info6 = rec_cert.indexOf("/",info5+1); + int info7 = rec_cert.indexOf("/",info6+1); + int info8 = rec_cert.indexOf("/",info7+1); + int info9 = rec_cert.indexOf("/",info8+1); + int info10 = rec_cert.indexOf("/",info9+1); + int info11 = rec_cert.indexOf("/",info10+1); + int info12 = rec_cert.indexOf("/",info11+1); + int info13 = rec_cert.indexOf("/",info12+1); + int info14 = rec_cert.indexOf("/",info13+1); + int info15 = rec_cert.indexOf("/",info14+1); + int info16 = rec_cert.indexOf("/",info15+1); + int info17 = rec_cert.indexOf("/",info16+1); + int info18 = rec_cert.indexOf("/",info17+1); + + certNum = rec_cert.substring(0,info1); kmcVO.setCertNum(certNum); + date = rec_cert.substring(info1+1,info2); kmcVO.setDate(date); + CI = rec_cert.substring(info2+1,info3); kmcVO.setCI(CI); + phoneNo = rec_cert.substring(info3+1,info4); kmcVO.setPhoneNo(phoneNo); + phoneCorp = rec_cert.substring(info4+1,info5); kmcVO.setPhoneCorp(phoneCorp); + birthDay = rec_cert.substring(info5+1,info6); kmcVO.setBirthDay(birthDay); + gender = rec_cert.substring(info6+1,info7); kmcVO.setGender(gender); + nation = rec_cert.substring(info7+1,info8); kmcVO.setNation(nation); + name = rec_cert.substring(info8+1,info9); kmcVO.setName(name); + result = rec_cert.substring(info9+1,info10); kmcVO.setResult(result); + certMet = rec_cert.substring(info10+1,info11); kmcVO.setCertMet(certMet); + ip = rec_cert.substring(info11+1,info12); kmcVO.setIp(ip); + M_name = rec_cert.substring(info12+1,info13); kmcVO.setMName(M_name); + M_birthDay = rec_cert.substring(info13+1,info14); kmcVO.setMBirthDay(M_birthDay); + M_Gender = rec_cert.substring(info14+1,info15); kmcVO.setMGender(M_Gender); + M_nation = rec_cert.substring(info15+1,info16); kmcVO.setMNation(M_nation); + plusInfo = rec_cert.substring(info16+1,info17); kmcVO.setPlusInfo(plusInfo); + DI = rec_cert.substring(info17+1,info18); kmcVO.setDI(DI); + + //07. CI, DI 복호화 + CI = seed.getDec(CI, k_certNum); kmcVO.setCI(CI); + DI = seed.getDec(DI, k_certNum); kmcVO.setDI(DI); + + if("Y".equals(result)) { + + } + + //-------------------------------------------------------------- + String regex = ""; + if( certNum.length() == 0 || certNum.length() > 40){ + errMessage = "요청번호 비정상."; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( date.length() != 14 || !paramChk(regex, date) ){ + errMessage = "요청일시"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[A-Z]*"; + if( certMet.length() != 1 || !paramChk(regex, certMet) ){ + errMessage = "본인인증방법 비정상" + certMet; + return returnPage(model , errMessage , kmcVO) ; + } + + + regex = "[0-9]*"; + if( (phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo) ){ + errMessage = "휴대폰번호 비정상" ; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[A-Z]*"; + if( phoneCorp.length() != 3 || !paramChk(regex, phoneCorp) ){ + errMessage = "이동통신사 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( birthDay.length() != 8 || !paramChk(regex, birthDay) ){ + errMessage = "생년월일 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( gender.length() != 1 || !paramChk(regex, gender) ){ + errMessage = "성별 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( nation.length() != 1 || !paramChk(regex, nation) ){ + errMessage = "내/외국인 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[\\sA-Za-z가-�R.,-]*"; + if( name.length() > 60 || !paramChk(regex, name) ){ + errMessage = "성명 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[A-Z]*"; + if( result.length() != 1 || !paramChk(regex, result) ){ + errMessage = "결과값 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[\\sA-Za-z가-?.,-]*"; + if( M_name.length() != 0 ){ + if( M_name.length() > 60 || !paramChk(regex, M_name) ){ + errMessage = "미성년자 성명 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + regex = "[0-9]*"; + if( M_birthDay.length() != 0 ){ + if( M_birthDay.length() != 8 || !paramChk(regex, M_birthDay) ){ + errMessage = "미성년자 생년월일 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + regex = "[0-9]*"; + if( M_Gender.length() != 0 ){ + if( M_Gender.length() != 1 || !paramChk(regex, M_Gender) ){ + errMessage = "미성년자 성별 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + regex = "[0-9]*"; + if( M_nation.length() != 0 ){ + if( M_nation.length() != 1 || !paramChk(regex, M_nation) ){ + errMessage = "미성년자 내/외국인 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + + //KMC 본인인증 로그 + AuthCertVO certVO = new AuthCertVO(); + certVO.setMberId(kmcVO.getPlusInfo()); + certVO.setCertNum(kmcVO.getCertNum()); + certVO.setCertDate(kmcVO.getDate()); + certVO.setCertDi(kmcVO.getDI()); + certVO.setCertPhone(kmcVO.getPhoneNo()); + certVO.setCertNation(kmcVO.getNation()); + certVO.setCertName(kmcVO.getName()); + certVO.setCertResult(kmcVO.getResult()); + certVO.setCertType("KMC_회원정보 변경"); + certVO.setCertIpaddr(kmcVO.getIp()); + certVO.setBirthDay(kmcVO.getBirthDay()); + certVO.setSexdstnCode(kmcVO.getGender()); + + model.addAttribute("kmcVO", kmcVO); + + return "web/user/securityAuthnPage"; + } + } diff --git a/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java b/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java index a70402b9..92de19f6 100644 --- a/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java +++ b/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java @@ -586,4 +586,77 @@ public class KmcCertChecker { return certVO; } + + + + // 마이페이지 보안인증 + public AuthCertVO authCertCheckNine(String trUrl, String id) { + + AuthCertVO certVO = new AuthCertVO(); + + //kmc step 01 데이터 + //날짜 생성 + Calendar today = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String day = sdf.format(today.getTime()); + + Random ran = new Random(); + //랜덤 문자 길이 + int numLength = 6; + String randomStr = ""; + + for (int i = 0; i < numLength; i++) { + //0 ~ 9 랜덤 숫자 생성 + randomStr += ran.nextInt(10); + } + + //reqNum은 최대 40byte 까지 사용 가능 + String reqNum = day + randomStr; //요청번호 + + String tr_cert = ""; + String cpId = "MJOM1001"; // 회원사ID + String urlCode = "001014"; // URL코드 + //kmc 본인인증 실/개발 서버 구분 + if(trUrl.contains("119.193.215.98") || trUrl.contains("localhost")) { + urlCode = "005005"; + } + String certNum = reqNum; // 요청번호 ( 본인인증 요청시 중복되지 않게 생성해야함. (예-시퀀스번호) ) + String date = day; // 요청일시 + String certMet = "M"; // 본인인증방법 - M:휴대폰 본인인증, C:신용카드인증, P:공인인증서 인증 + String name = ""; // 성명 + String phoneNo = ""; // 휴대폰번호 + String phoneCorp = ""; // 이동통신사 + if(phoneCorp == null) phoneCorp = ""; + String birthDay = ""; // 생년월일 + String gender = ""; // 성별 + if(gender == null) gender = ""; + String nation = ""; // 내외국인 구분 - 0:내국인, 1:외국인 + String plusInfo = id; // 추가DATA정보 + String extendVar = "0000000000000000"; // 확장변수 + //End-tr_cert 데이터 변수 선언 --------------------------------------------------------------- + + String tr_url = trUrl;//"http://www.munjaon.co.kr/web/cop/kmc/authRequestAjax.do"; // 본인인증서비스 결과수신 POPUP URL + String tr_add = "N"; // IFrame사용여부 + + //01. 한국모바일인증(주) 암호화 모듈 선언 + IcertSecuManager seed = new IcertSecuManager(); + + //02. 1차 암호화 (tr_cert 데이터변수 조합 후 암호화) + String enc_tr_cert = ""; + tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar; + enc_tr_cert = seed.getEnc(tr_cert, ""); + + //03. 1차 암호화 데이터에 대한 위변조 검증값 생성 (HMAC) + String hmacMsg = ""; + hmacMsg = seed.getMsg(enc_tr_cert); + + //04. 2차 암호화 (1차 암호화 데이터, HMAC 데이터, extendVar 조합 후 암호화) + tr_cert = seed.getEnc(enc_tr_cert + "/" + hmacMsg + "/" + extendVar, ""); + + certVO.setTr_cert(tr_cert); + certVO.setTr_url(tr_url); + certVO.setTr_add(tr_add); + + return certVO; + } } diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp index 6d3f660d..36e384b2 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp @@ -408,8 +408,47 @@ function getMberGrdChk() { }); } +//휴대푠 번호 등록 [시작]-------------------------------------------------------------------------------------------- +window.name = "kmcis_web_sample"; +var KMCIS_window; +//휴대폰 인증팝업 열기 +function openKMCISWindow(){ + var UserAgent = navigator.userAgent; + /* 모바일 접근 체크*/ + // 모바일일 경우 (변동사항 있을경우 추가 필요) + if (UserAgent.match(/iPhone|iPod|Android|Windows CE|BlackBerry|Symbian|Windows Phone|webOS|Opera Mini|Opera Mobi|POLARIS|IEMobile|lgtelecom|nokia|SonyEricsson/i) != null || UserAgent.match(/LG|SAMSUNG|Samsung/) != null) { + document.reqKMCISForm.target = 'KMCISWindow'; // 모바일 + } else { // 모바일이 아닐 경우 + KMCIS_window = window.open('', 'KMCISWindow', 'width=425, height=550, resizable=0, scrollbars=no, status=0, titlebar=0, toolbar=0, left=435, top=250' ); + + if(KMCIS_window == null){ + alert(" ※ 윈도우 XP SP2 또는 인터넷 익스플로러 7 사용자일 경우에는 \n 화면 상단에 있는 팝업 차단 알림줄을 클릭하여 팝업을 허용해 주시기 바랍니다. \n\n※ MSN,야후,구글 팝업 차단 툴바가 설치된 경우 팝업허용을 해주시기 바랍니다."); + } + + document.reqKMCISForm.target = 'KMCISWindow'; + } + + document.reqKMCISForm.action = 'https://www.kmcert.com/kmcis/web/kmcisReq.jsp'; + document.reqKMCISForm.submit(); +} + +// /web/user/selectSecurityAuthn.do 리다이렉트 URL + +//자식창에서 호출 +function callTo() { + alert("호출입니다."); +} + +//휴대푠 번호 등록 [끝]-------------------------------------------------------------------------------------------- + +
+ + + +
+
@@ -657,7 +696,7 @@ function getMberGrdChk() {

최근 변경일시 : 2024-11-01 12:49

- ON + ON OFF
diff --git a/src/main/webapp/WEB-INF/jsp/web/user/securityAuthnPage.jsp b/src/main/webapp/WEB-INF/jsp/web/user/securityAuthnPage.jsp new file mode 100644 index 00000000..ccc2e722 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/user/securityAuthnPage.jsp @@ -0,0 +1,29 @@ +<%@ page contentType="text/html; charset=utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<% + //************************************************************************ + // // + // 본 샘플소스는 개발 및 테스트를 위한 목적으로 만들어졌으며, // + // // + // 실제 서비스에 그대로 사용하는 것을 금합니다. // + // // + //************************************************************************ +%> + + + + + + + + + + + \ No newline at end of file