From 7374d2b65da8995b5d858a6fc1f1b10f5a8153a3 Mon Sep 17 00:00:00 2001 From: ijunho Date: Mon, 25 Aug 2025 11:03:20 +0900 Subject: [PATCH 01/14] =?UTF-8?q?kmc=20=EB=B3=B8=EC=9D=B8=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EC=95=94=ED=98=B8=ED=99=94=20=EB=AA=A8=EB=93=88=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 9 +- .../phone/web/CertPhoneWebController.java | 13 +- .../java/itn/let/mjo/pay/service/KmcVO.java | 2 - .../let/mjo/pay/web/MjonPayController.java | 549 ++++++++++-------- .../itn/let/uat/uia/web/KmcCertChecker.java | 316 +++++++++- .../jsp/web/cop/kmc/certResultError.jsp | 22 + .../WEB-INF/jsp/web/login/usrCheckTerms.jsp | 1 + 7 files changed, 648 insertions(+), 264 deletions(-) create mode 100644 src/main/webapp/WEB-INF/jsp/web/cop/kmc/certResultError.jsp diff --git a/pom.xml b/pom.xml index fd1e0201..c7ddbe01 100644 --- a/pom.xml +++ b/pom.xml @@ -477,12 +477,19 @@ - + + + + + kmc + ICERTSecu + JDK18_v2 diff --git a/src/main/java/itn/let/cert/phone/web/CertPhoneWebController.java b/src/main/java/itn/let/cert/phone/web/CertPhoneWebController.java index 3aeccb1f..b35fa156 100644 --- a/src/main/java/itn/let/cert/phone/web/CertPhoneWebController.java +++ b/src/main/java/itn/let/cert/phone/web/CertPhoneWebController.java @@ -34,12 +34,11 @@ public class CertPhoneWebController { @RequestMapping(value = {"/web/cert/log/insertCertLog.do"}) public ResponseEntity insertCertLog(HttpServletRequest request) throws Exception { - - - - - - return ResponseEntity.ok().body(new StatusResponse(HttpStatus.OK, certPhoneService.insertCertLog(request), LocalDateTime.now())); - } + } + + @RequestMapping(value = {"/web/cert/log/kmcErrorPage.do"}) + public String kmcErrorPage() throws Exception { + return "web/cop/kmc/certResultError"; + } } \ No newline at end of file diff --git a/src/main/java/itn/let/mjo/pay/service/KmcVO.java b/src/main/java/itn/let/mjo/pay/service/KmcVO.java index 2eecca4e..3a662cd2 100644 --- a/src/main/java/itn/let/mjo/pay/service/KmcVO.java +++ b/src/main/java/itn/let/mjo/pay/service/KmcVO.java @@ -226,6 +226,4 @@ public class KmcVO extends ComDefaultVO{ this.certType = certType; } - - } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index e4a4e305..b65e7b3c 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -91,6 +91,7 @@ import itn.let.sym.grd.service.MberGrdVO; import itn.let.sym.site.service.EgovSiteManagerService; import itn.let.sym.site.service.JoinSettingVO; import itn.let.uat.uia.service.AuthCertVO; +import itn.let.uat.uia.web.KmcCertChecker; import itn.let.uss.umt.service.EgovMberManageService; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageVO; @@ -165,7 +166,10 @@ public class MjonPayController { EgovSiteManagerService egovSiteManagerService; @Resource(name = "mberGrdService") - MberGrdService mberGrdService; + MberGrdService mberGrdService; + + @Resource(name = "KmcCertChecker") + KmcCertChecker kmcCertChecker; //배열 정의{"컬럼순차번호, 컬럼이름, 컬럼내용, 컬럼이름에 붙여야할 내용(엑셀코드양식다운로드시 필요)"} private String[][] sendPayExcelValue ={ @@ -930,7 +934,7 @@ public class MjonPayController { } /** - * 나이스페이(PG사 전송화면) + * 회원가입 본인인증 * * @param * @return @@ -941,253 +945,7 @@ public class MjonPayController { ModelMap model , @RequestParam Map commandMap, @ModelAttribute("searchVO") KmcVO kmcVO) throws Exception { - //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 - response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); - - System.out.println("++++++++++++ 세션체크 ::: "+ session.getAttribute("mberSession")); - - 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) ; - } - } - - //본인인증 결과 내용 저장하기. - /*System.out.println("+++++++++++++ getCertNum ::: "+kmcVO.getCertNum()); - System.out.println("+++++++++++++ getDate ::: "+kmcVO.getDate()); - System.out.println("+++++++++++++ getDI ::: "+kmcVO.getDI()); - System.out.println("+++++++++++++ getPhoneNo ::: "+kmcVO.getPhoneNo()); - System.out.println("+++++++++++++ getNation ::: "+kmcVO.getNation()); - System.out.println("+++++++++++++ getName ::: "+kmcVO.getName()); - System.out.println("+++++++++++++ getResult ::: "+kmcVO.getResult()); - System.out.println("+++++++++++++ getCertMet ::: "+kmcVO.getCertMet()); - System.out.println("+++++++++++++ getIp ::: "+kmcVO.getIp());*/ - - //KMC 본인인증 정보를 세션에 담아준다. - /*AuthCertVO certVO = new AuthCertVO(); - 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());*/ - - /*request.getSession().setAttribute("AuthKmcCertVO", certVO);*/ - - /*System.out.println("++++++++++++ 세션체크22 ::: "+(MberManageVO) session.getAttribute("mberSession"));*/ - + kmcVO = kmcCertChecker.authCertResult(request, response, model); //KMC 본인인증 로그 insert AuthCertVO certVO = new AuthCertVO(); certVO.setMberId(kmcVO.getPlusInfo()); @@ -6178,5 +5936,298 @@ public class MjonPayController { return p_response; } + + + + + /** + * 회원가입 본인인증 + * + * @param + * @return + * @throws Exception + */ + @RequestMapping("/web/cop/kmc/authRequestAjax_back.do") + public String authRequestAjax_back(HttpServletRequest request, HttpSession session, HttpServletResponse response, + ModelMap model , @RequestParam Map commandMap, + @ModelAttribute("searchVO") KmcVO kmcVO) throws Exception { + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + System.out.println("++++++++++++ 세션체크 ::: "+ session.getAttribute("mberSession")); + + 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) ; + } + } + + //본인인증 결과 내용 저장하기. + /*System.out.println("+++++++++++++ getCertNum ::: "+kmcVO.getCertNum()); + System.out.println("+++++++++++++ getDate ::: "+kmcVO.getDate()); + System.out.println("+++++++++++++ getDI ::: "+kmcVO.getDI()); + System.out.println("+++++++++++++ getPhoneNo ::: "+kmcVO.getPhoneNo()); + System.out.println("+++++++++++++ getNation ::: "+kmcVO.getNation()); + System.out.println("+++++++++++++ getName ::: "+kmcVO.getName()); + System.out.println("+++++++++++++ getResult ::: "+kmcVO.getResult()); + System.out.println("+++++++++++++ getCertMet ::: "+kmcVO.getCertMet()); + System.out.println("+++++++++++++ getIp ::: "+kmcVO.getIp());*/ + + //KMC 본인인증 정보를 세션에 담아준다. + /*AuthCertVO certVO = new AuthCertVO(); + 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());*/ + + /*request.getSession().setAttribute("AuthKmcCertVO", certVO);*/ + + /*System.out.println("++++++++++++ 세션체크22 ::: "+(MberManageVO) session.getAttribute("mberSession"));*/ + + //KMC 본인인증 로그 insert + 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()); + + //디비 테이블에 저장하기 + mberManageService.insertCertInfoLog(certVO); + + kmcVO.setIdx(certVO.getIdx()); //본인인증 로그 Idx - 로그 insert 후 idx selectKey + model.addAttribute("kmcVO", kmcVO); + return "web/cop/kmc/authRequestAjax"; + } + + + + + + + + } 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 16c2aace..b2c56693 100644 --- a/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java +++ b/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java @@ -1,23 +1,34 @@ package itn.let.uat.uia.web; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; import java.text.SimpleDateFormat; import java.util.Calendar; -import java.util.Map; import java.util.Random; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; -import org.apache.commons.lang3.StringUtils; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; import org.springframework.stereotype.Component; import org.springframework.ui.ModelMap; +import org.springframework.web.servlet.FlashMap; +import org.springframework.web.servlet.FlashMapManager; +import org.springframework.web.servlet.support.RequestContextUtils; import com.icert.comm.secu.IcertSecuManager; import itn.let.cert.phone.service.CertPhoneService; import itn.let.cert.phone.service.MberCertPhoneVO; +import itn.let.mjo.pay.service.KmcVO; import itn.let.uat.uia.service.AuthCertVO; -import itn.let.uss.umt.service.MberManageVO; @Component("KmcCertChecker") public class KmcCertChecker { @@ -64,11 +75,13 @@ public class KmcCertChecker { String tr_add = "N"; // IFrame사용여부 //01. 한국모바일인증(주) 암호화 모듈 선언 - IcertSecuManager seed = new IcertSecuManager(); +// IcertSecuManager seed = new IcertSecuManager(); + com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager(); //02. 1차 암호화 (tr_cert 데이터변수 조합 후 암호화) String enc_tr_cert = ""; - tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar; +// tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar; + tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"///////"+ plusInfo +"/"+ extendVar; enc_tr_cert = seed.getEnc(tr_cert, ""); //03. 1차 암호화 데이터에 대한 위변조 검증값 생성 (HMAC) @@ -87,6 +100,292 @@ public class KmcCertChecker { return authCertVO; } + public KmcVO authCertResult( + HttpServletRequest request + , HttpServletResponse response + , ModelMap model + ) throws IOException { + + //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 + response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); + + KmcVO kmcVO = new KmcVO(); //return VO + + // 변수 ------------------------------------------------------------------------------------------------------------- + String api_token = ""; // 토큰값(암호화) + String api_certNum = ""; // 요청번호(암호화) + + String message = ""; // JSON 전문 + String result_cd = ""; // JSON 결과코드 + String result_msg = ""; // JSON 결과-상세 + String strResult = ""; // JSON 결과 + String apiRecCert = ""; // JSON 전송 데이터 + String apiCertNum = ""; // JSON 전송 데이터 + + String rec_cert = ""; // 결과수신DATA + String k_certNum = ""; // 파라미터로 수신한 요청번호 + String certNum = ""; // 요청번호 + String date = ""; // 요청일시 + String CI = ""; // 연계정보(CI) + String DI = ""; // 중복가입확인정보(DI) + String phoneNo = ""; // 휴대폰번호 + String phoneCorp = ""; // 이동통신사 + String birth = ""; // 생년월일 + String gender = ""; // 성별 + String nation = ""; // 내국인 + String name = ""; // 성명 + String reserve1 = ""; // 예비필드 + String reserve2 = ""; // 예비필드 + String reserve3 = ""; // 예비필드 + String reserve4 = ""; // 예비필드 + String result = ""; // 결과값 + + String certMet = ""; // 인증방법 + String ip = ""; // ip주소 + String plusInfo = ""; + + String encPara = ""; + String encMsg1 = ""; + String encMsg2 = ""; + String msgChk = ""; + //----------------------------------------------------------------------------------------------------------------- + try{ + // Parameter 수신 -------------------------------------------------------------------- + api_token = request.getParameter("apiToken").trim(); + api_certNum = request.getParameter("certNum"); + + // 파라미터 유효성 검증 + if( api_token.length() == 0 ){ + goErrorPage("토큰값 비정상", request, response); + return kmcVO; + } + if( api_certNum.length() == 0 ){ + goErrorPage("요청번호 비정상", request, response); + return kmcVO; + } + + //현재시각 세팅(YYYYMMDDHI24MISS) + Calendar today = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String api_date = sdf.format(today.getTime()); + + //01. 암호화 모듈 (jar) Loading + com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager(); + + //api_token, api_certNum 복호화 + api_token = seed.getDec(api_token, ""); + api_certNum = seed.getDec(api_certNum, ""); + + // 파라미터 유효성 검증 + if( api_token.length() == 0 ){ + goErrorPage("토큰값 비정상(복호화 후)", request, response); + return kmcVO; + } + if( api_certNum.length() == 0 ){ + goErrorPage("요청번호 비정상(복호화 후)", request, response); + return kmcVO; + } + + // 1. URL 설정 + String serverURL = "https://www.kmcert.com/kmcis/api/kmcisToken_api.jsp"; + + // 2. 연결 생성 + URL url = new URL(serverURL); + + // 3. HttpURLConnection 객체 생성. + HttpURLConnection con = null; + OutputStream wr = null; + BufferedReader bufferedReader = null; + + // 4. URL 연결 (웹페이지 URL 연결.) + con = (HttpURLConnection)url.openConnection(); + + con.setConnectTimeout(20000); // TimeOut 시간 (서버 접속시 연결 시간 - 20초) + con.setReadTimeout(20000); // TimeOut 시간 (Read시 연결 시간 - 20초) + con.setDoOutput(true); // OutputStream으로 POST 데이터를 넘겨주겠다는 옵션. + + con.setRequestProperty("Content-Type", "application/json;charset=utf-8"); // 타입설정(application/json) 형식으로 전송 (Request Body 전달시 application/json로 서버에 전달.) + con.setRequestProperty("Accept", "application/json"); // 서버 Response Data를 JSON 형식의 타입으로 요청. + con.setRequestMethod("POST"); // 요청 방식 선택 (POST) + + // 5. JSON 전문 구성 + + JSONObject jsonData = new JSONObject(); + + jsonData.put("apiToken", api_token); + jsonData.put("apiDate", api_date); + + message = jsonData.toString(); + + // 6. 전송 + // Request Body에 Data를 담기위해 OutputStream 객체를 생성. + wr = con.getOutputStream(); + + // Request Body에 Data 셋팅.(한글깨짐 방지를 위해 utf-8인코딩 처리 + wr.write(message.getBytes("utf-8")); + wr.flush(); + wr.close(); + + // 실제 서버로 Request 요청 하는 부분. (응답 코드를 받는다. 200 성공, 나머지 에러) + int responseCode = con.getResponseCode(); + + // 4. 결과 수신 + if(responseCode == 200){ + bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); + }else{ + bufferedReader = new BufferedReader(new InputStreamReader(con.getErrorStream(), "UTF-8")); + } + + if(bufferedReader != null){ + + StringBuilder stringBuilder = new StringBuilder(); + String line = ""; + + while((line = bufferedReader.readLine()) != null){ + stringBuilder.append(line); + } + bufferedReader.close(); + + String stringRet = stringBuilder.toString(); + + // 5. 넘어온 문자열을 JSON 객체로 변환 + JSONParser jsonParser = new JSONParser(); + + //JSON데이터를 넣어 JSON Object 로 만들어 준다. + JSONObject jsonObj = (JSONObject)jsonParser.parse(stringRet); + + // 6. JSON 객체에서 데이터 가져오기 + + if(jsonObj.get("result_cd") != null){ + result_cd = jsonObj.get("result_cd").toString(); + if("APR01".equals(result_cd)){ + //통신성공 + strResult = "Y"; + rec_cert = jsonObj.get("apiRecCert").toString(); + k_certNum = jsonObj.get("apiCertNum").toString(); + }else if("APR02".equals(result_cd)){ + //실패 - Token Expire + strResult = "N"; + result_msg = "실패 - Token Expire"; + }else if("APR03".equals(result_cd)){ + //실패 - Token Not Found + strResult = "N"; + result_msg = "실패 - Token Not Found"; + }else if("APR04".equals(result_cd)){ + //실패 - API 요청일시 길이 오류 + strResult = "N"; + result_msg = "실패 - API 요청일시 길이 오류"; + }else if("APR05".equals(result_cd)){ + //실패 - API 토큰 길이 오류 + strResult = "N"; + result_msg = "실패 - API 토큰 길이 오류"; + }else if("APR06".equals(result_cd)){ + //실패 - 결과전송 재요청(3회 제한) + strResult = "N"; + result_msg = "실패 - 결과전송 재요청(3회 제한)"; + } + }else{ + //JSON 결과코드 에러 + strResult = "F"; + } + }else{ //timeout except 처리 + strResult = "F"; + } + + // 파라미터 유효성 검증 + if(!strResult.equals("Y")){ + goErrorPage("결과값 비정상, 결과코드["+result_cd+"], "+"상세내용["+result_msg+"]", request, response); + return kmcVO; + } + + //02. 1차 복호화 + 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); + + if(encMsg2.equals(encMsg1)){ + msgChk="Y"; + } + + if(msgChk.equals("N")){ + goErrorPage("비정상적인 접근입니다.!!", request, response); + return kmcVO; + } + + //05. 2차 복호화 + rec_cert = seed.getDec(encPara, ""); + + //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); + date = rec_cert.substring(info1+1,info2); + CI = rec_cert.substring(info2+1,info3); + phoneNo = rec_cert.substring(info3+1,info4); + phoneCorp = rec_cert.substring(info4+1,info5); + birth = rec_cert.substring(info5+1,info6); + gender = rec_cert.substring(info6+1,info7); + nation = rec_cert.substring(info7+1,info8); + name = rec_cert.substring(info8+1,info9); + result = rec_cert.substring(info9+1,info10); + certMet = rec_cert.substring(info10+1,info11); + ip = rec_cert.substring(info11+1,info12); + reserve1 = rec_cert.substring(info12+1,info13); + reserve2 = rec_cert.substring(info13+1,info14); + reserve3 = rec_cert.substring(info14+1,info15); + reserve4 = rec_cert.substring(info15+1,info16); + plusInfo = rec_cert.substring(info16+1,info17); + DI = rec_cert.substring(info17+1,info18); + + //07. CI, DI 복호화 + CI = seed.getDec(CI, ""); + DI = seed.getDec(DI, ""); + + // ---------------------------------------------------------------------------------- + + }catch(StringIndexOutOfBoundsException ex){ + goErrorPage("StringIndexOutOfBoundsException", request, response); + }catch(NullPointerException ex){ + goErrorPage("NullPointerException", request, response); + }catch(NumberFormatException ex){ + goErrorPage("NumberFormatException", request, response); + }catch(IllegalStateException ex){ + goErrorPage("IllegalStateException", request, response); + }catch(IndexOutOfBoundsException ex){ + goErrorPage("IndexOutOfBoundsException", request, response); + } catch (IOException e) { + goErrorPage("IOException", request, response); + } catch (ParseException e) { + goErrorPage("ParseException", request, response); + } + return kmcVO; + } + private String getDomain(HttpServletRequest request) { @@ -144,5 +443,12 @@ public class KmcCertChecker { return mberCertPhoneVO; } + private void goErrorPage(String msg, HttpServletRequest request, HttpServletResponse response) throws IOException { + FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request); + flashMap.put("msg", msg); + FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request); + flashMapManager.saveOutputFlashMap(flashMap, request, response); + response.sendRedirect("/web/cert/log/kmcErrorPage.do"); + } } diff --git a/src/main/webapp/WEB-INF/jsp/web/cop/kmc/certResultError.jsp b/src/main/webapp/WEB-INF/jsp/web/cop/kmc/certResultError.jsp new file mode 100644 index 00000000..565fdcd6 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/cop/kmc/certResultError.jsp @@ -0,0 +1,22 @@ +<%@ 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 diff --git a/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms.jsp b/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms.jsp index 0e17e4ed..87a80317 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms.jsp @@ -634,6 +634,7 @@ +
From b63aad38d2e8d1e18a551a766102957c3d231f87 Mon Sep 17 00:00:00 2001 From: ijunho Date: Mon, 25 Aug 2025 11:07:42 +0900 Subject: [PATCH 02/14] =?UTF-8?q?=EA=B8=B0=EC=A1=B4=20jar=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/webapp/WEB-INF/lib/ICERTSecu_JDK18.jar | Bin 28821 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/webapp/WEB-INF/lib/ICERTSecu_JDK18.jar diff --git a/src/main/webapp/WEB-INF/lib/ICERTSecu_JDK18.jar b/src/main/webapp/WEB-INF/lib/ICERTSecu_JDK18.jar deleted file mode 100644 index 7fde5742396ec61bb38854bd4a6f68279c4698b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28821 zcma&N1CVCR(k?tbZBE;^ZQGo-ZTH)@ZQHhO+uhT)?Vk3Xz0ZyRoNq^*`~B;Uidd^6 zpF-A~S(#Z`@>0Mc$loCT{MtBaMZf*W1NjZ)n~aE(0F8vKDBb7yw{O7TRNM{psef z^4CD1{vK4^KV|{)r`FKcn(n_-{Du3A!raiyV1Xi z0mg<-|IvKGKM)xI1z~2bZ}>OtU#pby4;c0T3nuZ`lmztw#^U+_Gg?C{eE`5qY25}( z8CiP-U~fe#A;D=aanWclRXdV*1^b-b+-I%`0|_~(8xR~MO`zira4VdI;JsS@6XRAvp1y43+N+5$isFL zX%pj}MbZ>90FkQd@}(x`>iu918ghVQn&$Y1tN}wTyduj`=59xA=%*Qw$MP{bb)X0(kSmp941 zw;KYJk|aJknNm6d==)Tc*`7VyRT4dC%bbzeQ-?n)geDFpY@b>%ZAPhiR8`2wHUjS8 zXRI1E86lP=bdvObGsfyWUUySA?LWf#)-2(UxtFHH7?r3;RWp4dHMbqIj@yfsCByI~ z3iJ#pQVD9`x#zvduPdE&bmgADXrtyzDrlX;)?EKObkKBSQYe$+qwetY4B^aH+(0d+ zH{Dg1R!bdJfNo|ayGb8%IqYM=Zn1+KB2K2>=+lM<&1|xRDxsOISUOKdO0DqNG|==z zYdb>)R=-AL>#*tijabkd_wfNW`SrCqUJmoUh2(lLyxX_74ks{vs#t5=rR98Ux!E^? zi`@J$7Jg{Xl*4TwpBUyu^1E*~rSMiX4@xLEOCH|71=K=k(yk3G z+zi1ac`0S;;F!?QCcNjOa^kmHB`=>dj5Wp7C`G;^TFej7Vp8ST{h6MQQ_o46H5_3C zA|~yrQlze19%?a>M(xOpM=lXPd~j$ts8f2CUM%d)`%DTEC(h#62sgn2a&D++7yWR@AQgqKU+Sv3Pk4B-);X;O)YjMMppwAD8*C=so}9+Mg+wgy1f8^I$d zzsQkxVE`drG2oh#B|M^iejSYyMqMKqW%N(DaxY0k zW)*{yvoo9&h!|Y$*1N6H-jXht zcY+eoVzRqN!z%D3fFync>3jfvLe=bbf)Y~_xTm@BX0N8XnLJIz%z)eJ!{1YC%pLZj zfNoN{wRf5c#Dwc;J?8!R6?md*ryYc*P3agYLQOacq%Ru8K|V=9U;q`2vY~f_>DFMR zDO=r3pE#Zf#XvP+O(v>Apt750L9I&9SXXFAisn{ikm@h3s`fy_i zX5O552s1@dF`7~y#N2|1amwxH2^}G7(w$mYRX;FWQ?eX|CQ5CKJhf79s3`)Vd~b;m z(56+sgz2#jvt?e=RLeC922m2?qNVrEyM8ZD0Su42Y6)TaLy0m+8c6rG2D95(r1qi< zz2y`kEj6*&P_-86BPwDR+iMQMT$!~}HF}6c091sJ(cNci=r~Poa+Y0Vb&fHP*?uXg zgT;(x4N8TmhDz~trt5`%&WM^3EIBOOh0=)V$`B_QP&hoXqq0|}P;+h^u%b9hk~OV6 z_2)E!+7_i(V+Z)ZuA;A!r?@dleS9w1#6T2t=O}9IV3E;`y6G@yX?Je855Cy0>Ux z{)}7X)sl0@_ws)u+5l!5r6quS$`!|-!R3aDc)LLq*LD~xvUdC-8ZdA6EhGad*wp)r z*7GN<25b~n4KZqBKDcJcb~F>|W_4?46nS2OfSV%#O(sE7yev=M9b9+x60f?i2hjl< zt!RRpJmR5-zy;Rtxo23sS8iS^pww<4#Kde+oQSY6O5W-_5O?7-h5bNS*74vZnEib^ zn77c=`s+=~d8N}Q$X`Z95M;lg{y0ea+MA2#z~MwD@Rn^GDKtqtw(Zl}0cI1N* zWq}~n7uTm>+rMvLp5UNM*q!Z9_C|*?`>I8X(4PWs+(~pm=tQz^3oRo!xlC^y^6m>= zi(sfA48izluwEXj*gx)nIwG$KAa60X_7R5f6F4M`6g#r9?-ClIw@6k@Kj8mbDEI7S z;)VQSG*MsnMQxu^op@muCNcj|rKBn%!Evuv-W*|@xJ;;+VlurdKWImo5snrxMN!_W zQh)45Li|+{tpDnPJa8e_j;?}eUWN@8jKBl!Yr7zW4lE2_o!3$vGnS4OoUy{VF&w>% z+!5@NszBDB{D}b9{kO8&LC+?H1^V_a`A_*bv-AGJY|8(Y*@|ZRj4Z7GVsccnhn>PF@TtlJ%9Jou^%YmAI*!W8g#zi*Icp)pqRB#<`su~zuvzUcf!KUo%4 zkQK7?&1k}bsE~uEeVx`$AAV?BW<~q3<5-)n)ip2FU5fYgbU+JVG|C)#dv62oxQ^ea zUp}td+`i6R=;H9%wC!hGB{v=Ui;P}vxNng6JtD7}vQ4m!xCdO5?a6V8vJJ6SPTk!5 zWW`*6D{$c$dTdC}AVA>KLPiR;INeZLb8R-ZwYHfK%HQ{zM-B}E;;ha zIi*GT!}EjF)Ie($lzIz@AWs%lk+j22$UvT6?hjo1%^?`NfGO>&q$~st9y@E zcS2|sM7Ni7?;fi%|TX-{L;G zwt7OXJ!k@lxA>FDJruL2cpJ3@D>1WocbXq3XHcTcAmCs^2tkdXJN)$i_Yoi=vyLzz zLRjemzz6`g^FF_;Z|%n}fd&~$8T|ntIDPH7Tk*UUHb2Ay4M)DQrDMV_U`66!ijWu1 z;Tu95QW=KUMcv{Xa_v)hmCb?R)GcsCIWOQ&x9ApJ&z1^ue9f%hx)WhOF8GQbpVCBm z3mZDSYZgE|D&!s58ms3GeU^ty*39Uts;gd9RaaC|-tV=v7B_bmmp2y{7B1>)X`S7x zBu(GCQBjs3DZNc}4mmmT+G7tydKon1q~y%6F}G#<6^piX$bJRR8vV{-x{6qv5h8Cm7@XrC0` zdf}6^u`VPFBo^zR3qp|;c|7P$E$r!}F&+#>2ND@jRUq_A?9#sG#65|ftU3;9W# zh*fYy=MHludbV<;jW88j_1sxad=#(t?%&))UD3sY9g`&cyLTzP{!0lJ-vK_7D( zcDa1LrwpSsd}z&c5cSnH($V2%UIFLkXh?_JsGMBa<};8oDP@j?2V3GQKIaRIWy`N!N8jSc1FgA zde{hk7OP;MP5r?hk=L}0ij_&l(r>q)L!#5YtZi(c-$`2ZD(;-0-5@OJc(4I{k;c@u ze&4YnaH(*yaJg{7vt79 zIbA91w{h(*uOg>%X$m)#LY3@}s4EebVwP%@mvCx`NS)YdNLrhzpCDjH1ieD4*Ma7j zz(*hDCr%mOGd+$Q7M>-gWtEIp|1fr@9i7LqM#G`n6vQ((;ahKpir})8%Z#^}qjHIi zV%s)Dma{pKv60T%5YO0{C1b;$6D<##suIeUlC1^u(DI9{5hke4=hg_&Vw?MJQEc3p ze3kFC2x&9S>+%ztC-@yN*Q0h_%=SWMHE5GiTQY_BBfmhz&i$cr_x1=ig2E|TMUhj@ zVVb%&lg)B*PG53Cp(SnYVNnJR^+GS=_3XAdnzQ0hA*(gXvsW0*M3TXAa!%(w%N$G( znqEQz$g(;us{i%fpB@x3L49PE`sdx^tn?mvnR>nz*Kqpu57_jt%CU42R5Y7Oj`c-_ z{&Ue$1`!#+0f(nf*g_3$0JaoGIOtJL4&7TF;E< zSjv16dwsmpc*9Y(VZ`-0!Rz*vS0mUP(V(pu5%yG+rNJL{#^CTEUjdCLu;bmLhwq~M zR~D&N;L~%9tL`0Ra7P^JPpC4w_I@UfqiI3MC(-wbfaH3HE9}jevnhO&c;Jm-d|cr) zn~^5w$O?CGnGpxKo6+{WLy~N@8>W%>8Dbocjl|z!UKB%OcmXD{rl74 z%@k_SJLIKKfd-f{w#97MA|*Mjc7lY{S6OX5%oox1+o>npAvRVpiDL2?0EAD71UTHUw7Y^GQd?@DK}uL~0u z!H!h!wjz0^=e;6EA`dJbDcTN4JU{2J5i-IwRn-l}n-lk{HNe0QCtDNuuiWn1^>g05 zi2E;D{|-N)z6jnFx3TP0e$XVx@&s984c>D_ZfgIb{EB{BDuM<@7==4x%^Llk(^u6H zd;6(Gp$A++aArsGj@m2mspNO+yI-~{_k;hugjk{tXL;aBYJFHVmF8(+eU|K=iig6g zOi7}bqncZ|Yymc2&uu&fT?QWEPuwN6`(Y#8W|I3l3UyzavDKAW>Oq^rj21$k&L8R^ zoJI`jbX~cWQoSJRP!{zt(us$;im$!I>Og1ph|q}yORg=oP6M!>EmT0qnB zRDD{j5JzLmdfi&EsG}@9R;wVW<0i8-zx;9A;HcwW{D$sqW~nrL5!-O7ldAO6I>D(^ zp8a{<@YD#d!Kp}&J)>cK0mfYHa?ZZ@#$>JhV0}Rjz^&rWEZId`vc2l*PUm+H>Azx? z-9qaV8SV!j0$*lU6TZOy@&aUN2KNR2gyXLMgxdaXm}dRMFs1tcW0)#Cnp^!}%Tx{8 zPID>kQ`WKOswsc4-hd>I1oRLz`ald33pjdTj|)!005KGYY?z-~s=i7oIg+MC7E2mR zC$~{E{bw#DvR!WJ0}BO=EL2(E=Bl~No7$STv)S`p9+$Q0I^)1qqB)mW>2{lH{ec*I z{3Oru`!V02^3`+y(Q`NB<7JGBszhWs&~(z2hue~J0|*J`vX-}#mV7m$qvrc?K%awO zf^X30aCd?kb(Z%IJ|MFRfE`gz^^q+43~?lOggF;K6PL(Bz;PLKRvJl#HIF=JCvf?y zjfQO7DU6O8eJYrbSH!$pW+>am#VN6F1siell(yKe*yn{+WPQiEYS{(iCQtFy^2VLN zg)F<3fc2@_Rs7!Ebtx8e3Ac%Sc809ByiTfTYkg{ETgtcG+;RwSJRQBii?q8Y%+8^< zo`xGm2JQk;X(mN7GQVro&XtKC16fI}v#>>?XB|$qe`*3Gb(m}eR78VPq+u?`jlo6F zyMc#w3H3}yKDR&tQ1n|$>Z;OA=Cqhk-H`u7M zxOljD7qX42PIYhQt8QO{LX9-0TlqFE_Srb*4tesKLR66SIhjWBDNh{uVPr=y_#fY@1O?V@a5dE&T(7T9i+- zsEh^-C$Kq|qG~rTPK}XLz6rU98Zk|e@PNlCfodjMRmV>*!k+6 zJwL2g;BQW@?;XFJ6d={ch}FUoyQ`8j+jGFhop|&hCw2Pkp#fBt!5d?jV>}#}F@izE z&ONF)?UlH-%;d>nECE$OF;Zzig>|(9n%0VB%l1Unv{Wt=3moe|?cxT}JCLs(pQ2Rr z9+Y$gHQ4R4>K-j{JA*~54?i|a_gcdCRb0)T*OMljX_?n&nydjPKGdd9RmH2gwmFDX zY2DiCTSOsvi>@;-7e8u@-c4|QSXAoBZwnCD>w-wNqPigFe{Y)2q}{Vm#evS%^};lg z#>|(H(w?(vrk~2jaOQIdEK?3-0c|IWO!D^x#xrSSC@E+V&y!9&rn$HLLb1%|T{yg# zHr=kIM0a6{0k?2FQK{@@1#{y1P!y8@=5fb~Ml^SU*CbhCGCe3MtE%N`?-gI@*H*q8 z>`feXhXMmD_q-<#hKr&aHDj8(_vC$BCOmh(>on15iKy#|BR9)ia7H@6WFHiFX39w# z%}j2v32z=_cTr|MEX>DYDtP-Osu+ zOILvdXKe~rotx5IMsKH>m$k;wM1AhX_!bQ!XNT)b34sL&A*%F`xqISC#M#xnVwqks z%_eZP5TBaxTP2MVB1@K8G`ex@Rb9wUw~N(N#?e9Q8Om>p5IKwxi5?<+Gl=UJFQie4 zHx%UWuhZRXx7ez}k`VI*dCs;U3#9hluE z_4%FPIx^1ks$VqnJ~5h#LH0#(m}3lWDb5sI0F|xwUJ%ZJqrB321%jz0!j&t&Pq+!t zbb-=fitsFdFaC&qKRO4lLTo&S9+fHN)&zi^A?N&+yA56uzM?5wDLgNTxNX@b=py?g79xwE7Dq;9es5M3HzkMBQyGWajn_81us|W;MnD2?Xl^W9>ztSCnb)fTKe;~MEw7-9 zKZ{Cv&?Nz3IiJ!O)cpWvQqqv87e^Ox@3{(_()Y~SWiX(QIEDnWl5kUtxe;0d@mP{J zn3GphEYW)$XOzY!d%ZbhaAnUO1M}4#iAEnmx2xNFCF6-=yKnh$IRy~*;yzv%l~_EJ zPY|1LJP4ElO3BY8yk)(YspoQooAByauoCg!J-E^%O*~2e zgobgSqVDM#a9n>dJ;Xc(kk}A}^aQtbuqTOE;rw++)P--Xb3QB5iiJ`$@P)nHjw0lz z)G^Nm9J4^>HEOky>rU4vc8|rJQk*q{wmP=cSy##{H-BC_$=vS~En3l*uzuF;kR%l` zy+hg7plf4hKFf5|iqehRHPhGFAT2s#EBy19cKd)2Zqab&^6}4-2HUiJNknHGg-w#m z6fT+5{>%ocvPG};s#N=IMDG~njZ>8)k$2gj=r=O2CdqN$S#(F5k#{W|&oO_bT7RQE zLiQaA^7E~*8xKDUk8!EH@A;01I~Xrv$9oXvOSFpZmgk+zd;AIK9pu{nLG?WZ!H=5+ z6d+-TLX^w(%S10_<6y%M5(}+C3Qk;+MjCo9t0* zyzfZI0YgvzYZZW^F6gJ*q{(CbnqgcSeF~9#Vq51*9XnQf(V6XNe-B9s?zpaMXMcmW zmFmQWDbA{SA#Z&7^Tg2?%@Vp31B_5-+h?(Fk!-RXl~Dx}uH&=zuXAf`Wn2vd}t&5DEyr;F@J=JF`EHAwG zIy20b7*_P;b=9j@X5FjhX&2qY@h}*Yd=ZE*-?7m$Rdsi|zEX;Mf>6RwM?z}-wq0IQ zzhYRHz8aE0ai~(Be|PLXSL%H7=X{2tEa{5Rt2@q{yU<$>4KWf2`YQ?!ee{RVK)}X? zBYG;V+~li8tLu-n3`%;cChm>&`+cDryJ}YU(}{4%=?1tAX}k-x28p-^(!Lu6snMx~ zMMWB#X4ek-AfQgR^;@eXAJ^_FYc1?oc81c_)J-#&Pr{s4cuw>C7Us_2lUGRj6i`0i zIm!=#pD~^C(@rK~@ZFHlnZy|JK}*z(tNt=3_CB3LLf+63i%Z%~W2b?nw>)D{5A|aL zor>-xB`Tl#wIPX&Y;H4ZSq{n)!I9OK!WwIi6~;@|mdxa2+Tb&pTd1H+dybYmUT{|* zRc`^PKm~Y0ve@u~LZ`KcS9YX3 zVQs@-x@uqa@r8D|3I*QO7~pLozTGm-`Q-p=bVCDvC!Gw|h@frhzj@e$_#p5IBDI7q z<)`Fb_3vT>Z%pw|Y&0h1RbN6(Bi0B=ZK{{{LHDg@Nj5k}iGX-Hc|!0elU%!bDYOei zzHWpEd7Z))^}?`7OTv%1Uh=YoP>CY=NeS194$2dN?HFoO1fTe`V-DG;&reZu>h^?b zeK>hcM{ZWP)@TsbDD=Tdg>-tw1@nN9mtA2>&gD|94h^;-72;8GV~SXC)5*@{^j9)UEy`1_Xae z?4{K)O)-|O%Sx;@I!as+PiHSm05eOBozb2qBWhrq?y);vEJ~sE0i$rsmnsq9euE_N zqZG0FNmZ(-0g0O{B1oMCzn9mEPYh2-z2^rmzuVK?(D74aj=bCDXtM2i>-zmU`|ahj z0*?SIiQPN^XoAglZ2_D)M!W_2p zuF6dytY*-NiYp2X)s2Ka8IgX^2$#O(?Ave`S!Z=F+kp%0AfaDukBC1ai`T8reIrO4 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 Date: Tue, 26 Aug 2025 09:28:44 +0900 Subject: [PATCH 03/14] =?UTF-8?q?kmc=20=EC=95=94=ED=98=B8=ED=99=94?= =?UTF-8?q?=EB=AA=A8=EB=93=88=20=EA=B0=9C=EB=B0=9C=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit http://pms.iten.co.kr:9999/issues/4608 --- .gitignore | 3 + .../let/mjo/addr/web/AddrGroupController.java | 247 +--- .../java/itn/let/mjo/pay/service/KmcVO.java | 62 +- .../let/mjo/pay/web/MjonPayController.java | 312 +---- .../let/uat/uia/service/EgovLoginService.java | 1 - .../service/impl/EgovLoginServiceImpl.java | 235 +--- .../let/uat/uia/web/EgovLoginController.java | 312 +---- .../let/uat/uia/web/EgovMypageController.java | 1196 +---------------- .../itn/let/uat/uia/web/KmcCertChecker.java | 74 +- .../sample/kmc/kmcis_web_sample_step02.jsp | 1 + .../jsp/web/addr/AddrGroupListAjax.jsp | 1 + .../WEB-INF/jsp/web/com/webCommonHeader.jsp | 1 + .../jsp/web/cop/bbs/include/mberSecession.jsp | 1 + .../jsp/web/fax/addr/FaxAddrGroupListAjax.jsp | 1 + .../WEB-INF/jsp/web/login/findUserId.jsp | 1 + .../web/login/humanPageAuthenticatedPage.jsp | 1 + .../jsp/web/login/test_usrCheckTerms.jsp | 1 + .../jsp/web/login/usrCheckTerms_back2.jsp | 1 + .../jsp/web/user/mberCompanyInfoChange.jsp | 1 + .../WEB-INF/jsp/web/user/mberInfoChange.jsp | 1 + .../WEB-INF/jsp/web/user/mberInfoIndex.jsp | 1 + .../WEB-INF/jsp/web/user/mberSecession.jsp | 1 + .../WEB-INF/jsp/web/user/mberSecureLogin.jsp | 1 + .../jsp/web/user/sendNumberKmcReqPage.jsp | 4 +- .../jsp/web/user/sendNumberManageRegister.jsp | 1 + .../web/user/sendNumberManage_bak220502.jsp | 1 + 26 files changed, 214 insertions(+), 2248 deletions(-) diff --git a/.gitignore b/.gitignore index 5512880c..a8209c63 100644 --- a/.gitignore +++ b/.gitignore @@ -202,3 +202,6 @@ rebel.xml /mvnw /mvnw.cmd /.gemini.zip + +### MAC OS ### +.DS_Store \ No newline at end of file diff --git a/src/main/java/itn/let/mjo/addr/web/AddrGroupController.java b/src/main/java/itn/let/mjo/addr/web/AddrGroupController.java index 4ecb759b..2753f7b4 100644 --- a/src/main/java/itn/let/mjo/addr/web/AddrGroupController.java +++ b/src/main/java/itn/let/mjo/addr/web/AddrGroupController.java @@ -74,7 +74,7 @@ public class AddrGroupController { private EgovMberManageService mberManageService; @Resource(name = "KmcCertChecker") - private KmcCertChecker kmcCertCheck; + private KmcCertChecker kmcCertChecker; /** * 주소록 그룹 리스트 @@ -954,7 +954,7 @@ public class AddrGroupController { mberCertPhoneVO.setTrUrl("/web/cop/kmc/authRequestAddrSubmitAjax.do"); mberCertPhoneVO.setPlusInfo(mberManageVO.getMberId()); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); modelAndView.addObject("tr_cert", certVO.getTr_cert()); modelAndView.addObject("tr_url", certVO.getTr_url()); @@ -979,241 +979,16 @@ public class AddrGroupController { */ @RequestMapping("/web/cop/kmc/authRequestAddrSubmitAjax.do") - public String authRequestFindIdPwAjax(HttpServletRequest request, ModelMap model, - @RequestParam Map commandMap, @ModelAttribute("searchVO") KmcVO kmcVO, - RedirectAttributes redirectAttributes) throws Exception { + public String authRequestFindIdPwAjax( + HttpServletRequest request + , HttpServletResponse response + , ModelMap model + , @RequestParam Map commandMap + , @ModelAttribute("searchVO") KmcVO kmcVO + , RedirectAttributes redirectAttributes + ) throws Exception { - 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); - } - } + kmcVO = kmcCertChecker.authCertResult(request, response, model); // KMC 본인인증 로그 AuthCertVO certVO = new AuthCertVO(); diff --git a/src/main/java/itn/let/mjo/pay/service/KmcVO.java b/src/main/java/itn/let/mjo/pay/service/KmcVO.java index 3a662cd2..374d03ad 100644 --- a/src/main/java/itn/let/mjo/pay/service/KmcVO.java +++ b/src/main/java/itn/let/mjo/pay/service/KmcVO.java @@ -18,10 +18,10 @@ public class KmcVO extends ComDefaultVO{ private String gender = ""; // 성별 private String nation = ""; // 내국인 private String name = ""; // 성명 - private String MName = ""; // 미성년자 성명 - private String MBirthDay = ""; // 미성년자 생년월일 - private String MGender = ""; // 미성년자 성별 - private String MNation = ""; // 미성년자 내외국인 +// private String MName = ""; // 미성년자 성명 +// private String MBirthDay = ""; // 미성년자 생년월일 +// private String MGender = ""; // 미성년자 성별 +// private String MNation = ""; // 미성년자 내외국인 private String result = ""; // 결과값 private String certMet = ""; // 인증방법 @@ -41,6 +41,11 @@ public class KmcVO extends ComDefaultVO{ private String idx = ""; //본인인증 로그 idx private String dnChk = ""; //본인명의 DN 체크 + private String reserve1 = ""; + private String reserve2 = ""; + private String reserve3 = ""; + private String reserve4 = ""; + public String getUserId() { return userId; } @@ -177,30 +182,6 @@ public class KmcVO extends ComDefaultVO{ public void setCertNum(String certNum) { this.certNum = certNum; } - public String getMName() { - return MName; - } - public void setMName(String mName) { - MName = mName; - } - public String getMBirthDay() { - return MBirthDay; - } - public void setMBirthDay(String mBirthDay) { - MBirthDay = mBirthDay; - } - public String getMGender() { - return MGender; - } - public void setMGender(String mGender) { - MGender = mGender; - } - public String getMNation() { - return MNation; - } - public void setMNation(String mNation) { - MNation = mNation; - } public String getRecCert() { return recCert; } @@ -225,5 +206,30 @@ public class KmcVO extends ComDefaultVO{ public void setCertType(String certType) { this.certType = certType; } + public String getReserve1() { + return reserve1; + } + public void setReserve1(String reserve1) { + this.reserve1 = reserve1; + } + public String getReserve2() { + return reserve2; + } + public void setReserve2(String reserve2) { + this.reserve2 = reserve2; + } + public String getReserve3() { + return reserve3; + } + public void setReserve3(String reserve3) { + this.reserve3 = reserve3; + } + public String getReserve4() { + return reserve4; + } + public void setReserve4(String reserve4) { + this.reserve4 = reserve4; + } + } diff --git a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java index b65e7b3c..52b9d57d 100644 --- a/src/main/java/itn/let/mjo/pay/web/MjonPayController.java +++ b/src/main/java/itn/let/mjo/pay/web/MjonPayController.java @@ -945,24 +945,10 @@ public class MjonPayController { ModelMap model , @RequestParam Map commandMap, @ModelAttribute("searchVO") KmcVO kmcVO) throws Exception { + //kmc 본인인증 결과처리 kmcVO = kmcCertChecker.authCertResult(request, response, model); - //KMC 본인인증 로그 insert - 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()); - - //디비 테이블에 저장하기 - mberManageService.insertCertInfoLog(certVO); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_회원가입 인증"); kmcVO.setIdx(certVO.getIdx()); //본인인증 로그 Idx - 로그 insert 후 idx selectKey model.addAttribute("kmcVO", kmcVO); @@ -5937,297 +5923,5 @@ public class MjonPayController { return p_response; } - - - - /** - * 회원가입 본인인증 - * - * @param - * @return - * @throws Exception - */ - @RequestMapping("/web/cop/kmc/authRequestAjax_back.do") - public String authRequestAjax_back(HttpServletRequest request, HttpSession session, HttpServletResponse response, - ModelMap model , @RequestParam Map commandMap, - @ModelAttribute("searchVO") KmcVO kmcVO) throws Exception { - - //크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해 samesite 보안을 none처리 - response.setHeader("Set-Cookie", "mberSession=mberSession; Secure; SameSite=None"); - - System.out.println("++++++++++++ 세션체크 ::: "+ session.getAttribute("mberSession")); - - 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) ; - } - } - - //본인인증 결과 내용 저장하기. - /*System.out.println("+++++++++++++ getCertNum ::: "+kmcVO.getCertNum()); - System.out.println("+++++++++++++ getDate ::: "+kmcVO.getDate()); - System.out.println("+++++++++++++ getDI ::: "+kmcVO.getDI()); - System.out.println("+++++++++++++ getPhoneNo ::: "+kmcVO.getPhoneNo()); - System.out.println("+++++++++++++ getNation ::: "+kmcVO.getNation()); - System.out.println("+++++++++++++ getName ::: "+kmcVO.getName()); - System.out.println("+++++++++++++ getResult ::: "+kmcVO.getResult()); - System.out.println("+++++++++++++ getCertMet ::: "+kmcVO.getCertMet()); - System.out.println("+++++++++++++ getIp ::: "+kmcVO.getIp());*/ - - //KMC 본인인증 정보를 세션에 담아준다. - /*AuthCertVO certVO = new AuthCertVO(); - 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());*/ - - /*request.getSession().setAttribute("AuthKmcCertVO", certVO);*/ - - /*System.out.println("++++++++++++ 세션체크22 ::: "+(MberManageVO) session.getAttribute("mberSession"));*/ - - //KMC 본인인증 로그 insert - 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()); - - //디비 테이블에 저장하기 - mberManageService.insertCertInfoLog(certVO); - - kmcVO.setIdx(certVO.getIdx()); //본인인증 로그 Idx - 로그 insert 후 idx selectKey - model.addAttribute("kmcVO", kmcVO); - return "web/cop/kmc/authRequestAjax"; - } - - - - - - - - } diff --git a/src/main/java/itn/let/uat/uia/service/EgovLoginService.java b/src/main/java/itn/let/uat/uia/service/EgovLoginService.java index ccb85055..ab45a78a 100644 --- a/src/main/java/itn/let/uat/uia/service/EgovLoginService.java +++ b/src/main/java/itn/let/uat/uia/service/EgovLoginService.java @@ -121,5 +121,4 @@ public interface EgovLoginService { //비밀번호 실패 횟수 조회 public LoginVO selectPassMiss(LoginVO vo) throws Exception; - public KmcVO kmcDecryption(HttpServletRequest request, KmcVO kmcVO); } diff --git a/src/main/java/itn/let/uat/uia/service/impl/EgovLoginServiceImpl.java b/src/main/java/itn/let/uat/uia/service/impl/EgovLoginServiceImpl.java index b30fb473..a5fa09d2 100644 --- a/src/main/java/itn/let/uat/uia/service/impl/EgovLoginServiceImpl.java +++ b/src/main/java/itn/let/uat/uia/service/impl/EgovLoginServiceImpl.java @@ -17,6 +17,7 @@ import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.psl.dataaccess.util.EgovMap; import itn.com.cmm.LoginVO; import itn.let.mjo.pay.service.KmcVO; +import itn.let.uat.uia.service.AuthCertVO; import itn.let.uat.uia.service.EgovLoginService; import itn.let.uss.umt.service.UserManageVO; import itn.let.utl.fcc.service.EgovNumberUtil; @@ -318,240 +319,6 @@ public class EgovLoginServiceImpl extends EgovAbstractServiceImpl implements return loginDAO.selectPassMiss(vo); } - - @Override - public KmcVO kmcDecryption(HttpServletRequest request, KmcVO kmcVO) { - - - - String rec_cert = request.getParameter("rec_cert").trim(); - String certNum = request.getParameter("certNum").trim(); - - kmcVO.setRecCert(rec_cert); - kmcVO.setCertNum(certNum); - // 파라미터 유효성 검증 - if (rec_cert.length() == 0 || certNum.length() == 0) { - kmcVO.setErrMessage("비정상"); - return 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 = ""; - - IcertSecuManager seed = new 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)) { - kmcVO.setErrMessage("비정상접근입니다."); - return 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) { - kmcVO.setErrMessage("요청번호 비정상."); - return kmcVO; - } - - regex = "[0-9]*"; - if (date.length() != 14 || !this.paramChk(regex, date)) { - kmcVO.setErrMessage("요청일시"); - return kmcVO; - } - - regex = "[A-Z]*"; - if (certMet.length() != 1 || !this.paramChk(regex, certMet)) { - kmcVO.setErrMessage("본인인증방법 비정상" + certMet); - return kmcVO; - } - - regex = "[0-9]*"; - if ((phoneNo.length() != 10 && phoneNo.length() != 11) || !this.paramChk(regex, phoneNo)) { - kmcVO.setErrMessage("휴대폰번호 비정상"); - return kmcVO; - } - - regex = "[A-Z]*"; - if (phoneCorp.length() != 3 || !this.paramChk(regex, phoneCorp)) { - kmcVO.setErrMessage("이동통신사 비정상"); - return kmcVO; - } - - regex = "[0-9]*"; - if (birthDay.length() != 8 || !this.paramChk(regex, birthDay)) { - kmcVO.setErrMessage("생년월일 비정상"); - return kmcVO; - } - - regex = "[0-9]*"; - if (gender.length() != 1 || !this.paramChk(regex, gender)) { - kmcVO.setErrMessage("성별 비정상"); - return kmcVO; - } - - regex = "[0-9]*"; - if (nation.length() != 1 || !this.paramChk(regex, nation)) { - kmcVO.setErrMessage("내/외국인 비정상"); - return kmcVO; - } - - regex = "[\\sA-Za-z가-�R.,-]*"; - if (name.length() > 60 || !this.paramChk(regex, name)) { - kmcVO.setErrMessage("성명 비정상"); - return kmcVO; - } - - regex = "[A-Z]*"; - if (result.length() != 1 || !this.paramChk(regex, result)) { - kmcVO.setErrMessage("결과값 비정상"); - return kmcVO; - } - - regex = "[\\sA-Za-z가-?.,-]*"; - if (M_name.length() != 0) { - if (M_name.length() > 60 || !this.paramChk(regex, M_name)) { - kmcVO.setErrMessage("미성년자 성명 비정상"); - return kmcVO; - } - } - - regex = "[0-9]*"; - if (M_birthDay.length() != 0) { - if (M_birthDay.length() != 8 || !this.paramChk(regex, M_birthDay)) { - kmcVO.setErrMessage("미성년자 생년월일 비정상"); - } - } - - regex = "[0-9]*"; - if (M_Gender.length() != 0) { - if (M_Gender.length() != 1 || !paramChk(regex, M_Gender)) { - kmcVO.setErrMessage("미성년자 성별 비정상"); - } - } - - regex = "[0-9]*"; - if (M_nation.length() != 0) { - if (M_nation.length() != 1 || !this.paramChk(regex, M_nation)) { - kmcVO.setErrMessage("미성년자 내/외국인 비정상"); - } - } - - - return kmcVO; - } - - public Boolean paramChk(String patn, String param) { Pattern pattern = Pattern.compile(patn); Matcher matcher = pattern.matcher(param); diff --git a/src/main/java/itn/let/uat/uia/web/EgovLoginController.java b/src/main/java/itn/let/uat/uia/web/EgovLoginController.java index fdc173c5..4b65961a 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovLoginController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovLoginController.java @@ -253,7 +253,7 @@ public class EgovLoginController { private CertIpService certIpService; @Resource(name = "KmcCertChecker") - private KmcCertChecker kmcCertCheck; + private KmcCertChecker kmcCertChecker; private static final Logger logger = LoggerFactory.getLogger(MjonMsgDataController.class); @@ -336,7 +336,7 @@ public class EgovLoginController { MberCertPhoneVO mberCertPhoneVO = new MberCertPhoneVO(); mberCertPhoneVO.setTrUrl("/web/cop/kmc/authRequestAjax.do"); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); model.addAttribute("tr_cert", certVO.getTr_cert()); model.addAttribute("tr_url", certVO.getTr_url()); @@ -385,7 +385,7 @@ public class EgovLoginController { mberCertPhoneVO.setNation(mberManageVO.getNationality()); mberCertPhoneVO.setBirthDay(mberManageVO.getBirth()); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); // AuthCertVO certVO = kmcCertCheck.authCertCheckTwo(serverNm + "/web/cop/kmc/authRequestAjax.do", // mberManageVO.getMberNm(), mberManageVO.getMoblphonNo(), mberManageVO.getSexdstnCode(), @@ -4035,7 +4035,7 @@ public class EgovLoginController { } mberCertPhoneVO.setPlusInfo(plusInfo); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); modelAndView.addObject("tr_cert", certVO.getTr_cert()); modelAndView.addObject("tr_url", certVO.getTr_url()); @@ -4060,22 +4060,26 @@ public class EgovLoginController { */ @RequestMapping("/web/cop/kmc/authRequestFindIdPwAjax.do") - public String authRequestFindIdPwAjax(HttpServletRequest request, ModelMap model, + public String authRequestFindIdPwAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model, @RequestParam Map commandMap, @ModelAttribute("searchVO") KmcVO kmcVO, RedirectAttributes redirectAttributes) throws Exception { - KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO); +// KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO); + //kmc 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_아이디패스워드찾기"); String msg = ""; - if (!findIdKmcCheck(kmcRVO.getDI(), kmcRVO.getName(), kmcRVO.getPhoneNo())) { + if (!findIdKmcCheck(kmcVO.getDI(), kmcVO.getName(), kmcVO.getPhoneNo())) { msg = "일치하는 정보가 없습니다."; redirectAttributes.addFlashAttribute("message", msg); return "redirect:/web/user/findUserId.do"; } - kmcRVO.setCertType("KMC_아이디패스워드찾기"); - // 디비 테이블에 저장하기 - mberManageService.insertCertInfoLogBn(kmcRVO); +// kmcRVO.setCertType("KMC_아이디패스워드찾기"); +// // 디비 테이블에 저장하기 +// mberManageService.insertCertInfoLogBn(kmcRVO); model.addAttribute("kmcVO", kmcVO); return "web/login/findUserIdKmcReqPage"; @@ -4092,18 +4096,24 @@ public class EgovLoginController { * @discription 관리자 로그인 DN 값 최초 등록 */ @RequestMapping("/web/cop/kmc/authRequestSelfLoginAjax.do") - public String authRequestSelfLoginAjax(HttpServletRequest request, ModelMap model, + public String authRequestSelfLoginAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model, @RequestParam Map commandMap, @ModelAttribute("searchVO") KmcVO kmcVO, RedirectAttributes redirectAttributes, HttpSession session) throws Exception { UserManageVO userManageVO = new UserManageVO(); - KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO); +// KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO); + + //kmc 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_아이디패스워드찾기"); + - userManageVO.setCrtfcDnValue(kmcRVO.getDI()); - userManageVO.setEmplyrNm(kmcRVO.getName()); - userManageVO.setEmplyrId(kmcRVO.getPlusInfo().split(",,,")[0]); - userManageVO.setPassword(kmcRVO.getPlusInfo().split(",,,")[1]); + userManageVO.setCrtfcDnValue(kmcVO.getDI()); + userManageVO.setEmplyrNm(kmcVO.getName()); + userManageVO.setEmplyrId(kmcVO.getPlusInfo().split(",,,")[0]); + userManageVO.setPassword(kmcVO.getPlusInfo().split(",,,")[1]); userManageService.updateCrtfcDnValue(userManageVO); @@ -4121,20 +4131,20 @@ public class EgovLoginController { e.printStackTrace(); // TODO: handle exception } - kmcRVO.setCertType("KMC_관리자미인증IP접속인증"); - // 디비 테이블에 저장하기 - - try { - mberManageService.insertCertInfoLogBn(kmcRVO); - - } catch (Exception e) { - System.out.println("!!!!!!!!!!!!!!!!!"); - e.printStackTrace(); - // TODO: handle exception - } +// kmcRVO.setCertType("KMC_관리자미인증IP접속인증"); +// // 디비 테이블에 저장하기 +// +// try { +// mberManageService.insertCertInfoLogBn(kmcRVO); +// +// } catch (Exception e) { +// System.out.println("!!!!!!!!!!!!!!!!!"); +// e.printStackTrace(); +// // TODO: handle exception +// } - model.addAttribute("kmcVO", kmcRVO); + model.addAttribute("kmcVO", kmcVO); System.out.println("======================================"); model.addAttribute("userManageVO", userManageVO); @@ -5425,7 +5435,7 @@ public class EgovLoginController { mberCertPhoneVO.setNation(KMCInfoVO.getNationality()); mberCertPhoneVO.setPlusInfo(loginVO.getId()); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); modelAndView.addObject("tr_cert", certVO.getTr_cert()); modelAndView.addObject("tr_url", certVO.getTr_url()); @@ -5446,245 +5456,19 @@ public class EgovLoginController { * */ @RequestMapping("/web/cop/kmc/insertIPAjax.do") - public String insertIPAjax(HttpServletRequest request, ModelMap model, @RequestParam Map commandMap, + public String insertIPAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model, @RequestParam Map commandMap, @ModelAttribute("searchVO") KmcVO kmcVO) throws Exception { - 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 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "IP등록"); + LoginVO loginVO = new LoginVO(); - loginVO.setId(plusInfo); + loginVO.setId(kmcVO.getPlusInfo()); + loginVO = loginService.selectKMCInfo(loginVO); - String userIp = EgovClntInfo.getClntIP(request); - loginVO.setIp(ip); + loginVO.setIp(kmcVO.getIp()); loginService.insertMberIp(loginVO); 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 997caab0..47adc9a6 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java @@ -183,7 +183,7 @@ public class EgovMypageController { private CertIpService certIpService; @Resource(name = "KmcCertChecker") - private KmcCertChecker kmcCertCheck; + private KmcCertChecker kmcCertChecker; /** * 마이페이지 비밀번호 변경 탭 @@ -717,7 +717,7 @@ public class EgovMypageController { */ @RequestMapping("/web/user/selectKmcMberInfoAjax.do") public String selectKmcMberInfoAjax( - HttpServletRequest request, ModelMap model + HttpServletRequest request, HttpServletResponse response, ModelMap model , @RequestParam Map commandMap , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { @@ -726,241 +726,14 @@ public class EgovMypageController { 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()); - - //디비 테이블에 저장하기 - mberManageService.insertCertInfoLog(certVO); + //kmc 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_회원정보 변경"); //개인회원일 시 기존 DN가 본인인증 DN비고하여 본인 명의만 번호 변경 가능하게 if("p".equals(loginVO.getDept())) { - if(!mblDn.equals(DI)) { + if(!mblDn.equals(kmcVO.getDI())) { kmcVO.setDnChk("N"); } } @@ -1465,7 +1238,7 @@ public class EgovMypageController { mberCertPhoneVO.setTrUrl("/web/user/selectKmcMberInfoAjax.do"); mberCertPhoneVO.setPlusInfo(loginVO.getId()); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); modelAndView.addObject("certVO", certVO); } @@ -1938,7 +1711,7 @@ public class EgovMypageController { mberCertPhoneVO.setPhoneNo(mjonMsgVO.getCallFrom()); mberCertPhoneVO.setPlusInfo(mjonMsgVO.getUserId()+ "§" + mjonMsgVO.getMyNameFlag()); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); modelAndView.addObject("certVO", certVO); @@ -1962,223 +1735,12 @@ public class EgovMypageController { */ @RequestMapping("/web/user/selectPhoneNumberCertChkAjax.do") public String selectPhoneNumberCertChk( - HttpServletRequest request, ModelMap model + HttpServletRequest request, HttpServletResponse response, ModelMap model , @RequestParam Map commandMap , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { - - 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 = ""; - - IcertSecuManager seed = new 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 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); /* * plusInfo(본인인증 추가파라미터) * 구분지 "§" @@ -2188,32 +1750,17 @@ public class EgovMypageController { * */ String tmp = kmcVO.getPlusInfo(); String[] tmpResult = tmp.split("§"); + kmcVO.setPlusInfo(tmpResult[0]); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "KMC_발신번호 등록 인증"); - //KMC 본인인증 로그 - AuthCertVO certVO = new AuthCertVO(); - - certVO.setMberId(tmpResult[0]); - 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()); - - //디비 테이블에 저장하기 - mberManageService.insertCertInfoLog(certVO); LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; String mblDn = userManageService.selectUserMblDnById(loginVO.getId()); String resultDnFlag = "N"; - if(DI.equals(mblDn)) { + if((kmcVO.getDI()).equals(mblDn)) { resultDnFlag = "Y"; } @@ -2295,14 +1842,8 @@ public class EgovMypageController { model.addAttribute("resultNameChk", resultNameChk); //=======================끝========================= - String birthDay_tmp = ""; - try { - birthDay_tmp = kmcVO.getMBirthDay().length() != 0 ? kmcVO.getMBirthDay() : kmcVO.getBirthDay(); - } catch (Exception e) { - birthDay_tmp = birthDay; - } model.addAttribute("CI", kmcVO.getCI()); - model.addAttribute("birthDay", birthDay_tmp); + model.addAttribute("birthDay", kmcVO.getBirthDay()); return "web/user/selectPhoneNumberCertChkReq"; } @@ -2326,232 +1867,25 @@ public class EgovMypageController { */ @RequestMapping("/web/user/insertPhoneSendNumber.do") public String insertPhoneSendNumber( - HttpServletRequest request, ModelMap model + HttpServletRequest request, HttpServletResponse response, ModelMap model , @RequestParam Map commandMap , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { - - 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 = ""; - - IcertSecuManager seed = new 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 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "휴대폰 인증 발신번호 등록"); MjPhoneMemberVO mjPhoneMemberVO = new MjPhoneMemberVO(); - mjPhoneMemberVO.setUserId(plusInfo); + mjPhoneMemberVO.setUserId(kmcVO.getPlusInfo()); mjPhoneMemberVO.setPhmType("01"); mjPhoneMemberVO.setPhmAuthType("01"); - mjPhoneMemberVO.setFrstRegisterId(plusInfo); - mjPhoneMemberVO.setLastUpdusrId(plusInfo); - mjPhoneMemberVO.setPhoneNumber(phoneNo); - mjPhoneMemberVO.setUserName(name); + mjPhoneMemberVO.setFrstRegisterId(kmcVO.getPlusInfo()); + mjPhoneMemberVO.setLastUpdusrId(kmcVO.getPlusInfo()); + mjPhoneMemberVO.setPhoneNumber(kmcVO.getPhoneNo()); + mjPhoneMemberVO.setUserName(kmcVO.getName()); mjPhoneMemberVO.setAuthYn("Y"); mjonMsgService.insertSendNumber(mjPhoneMemberVO); @@ -2953,7 +2287,7 @@ public class EgovMypageController { mberCertPhoneVO.setTrUrl("/web/user/selectMberSecessionAjax.do"); mberCertPhoneVO.setName(name); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); model.addAttribute("certVO", certVO); return "web/user/mberSecession"; @@ -3054,7 +2388,7 @@ public class EgovMypageController { mberCertPhoneVO.setTrUrl("/web/user/selectSecurityAuthn.do"); mberCertPhoneVO.setPlusInfo(loginVO.getId()); - AuthCertVO certVO = kmcCertCheck.authCertCheck(mberCertPhoneVO, request); + AuthCertVO certVO = kmcCertChecker.authCertCheck(mberCertPhoneVO, request); model.addAttribute("certVO", certVO); } @@ -3132,232 +2466,24 @@ public class EgovMypageController { */ @RequestMapping("/web/user/selectMberSecessionAjax.do") public String selectMberSecessionAjax( - HttpServletRequest request, ModelMap model + HttpServletRequest request, HttpServletResponse response, ModelMap model , @RequestParam Map commandMap , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { - 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 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "회원탈퇴 본인인증"); MjPhoneMemberVO mjPhoneMemberVO = new MjPhoneMemberVO(); - mjPhoneMemberVO.setUserId(plusInfo); + mjPhoneMemberVO.setUserId(kmcVO.getPlusInfo()); mjPhoneMemberVO.setPhmType("01"); mjPhoneMemberVO.setPhmAuthType("01"); - mjPhoneMemberVO.setFrstRegisterId(plusInfo); - mjPhoneMemberVO.setLastUpdusrId(plusInfo); - mjPhoneMemberVO.setPhoneNumber(phoneNo); - mjPhoneMemberVO.setUserName(name); + mjPhoneMemberVO.setFrstRegisterId(kmcVO.getPlusInfo()); + mjPhoneMemberVO.setLastUpdusrId(kmcVO.getPlusInfo()); + mjPhoneMemberVO.setPhoneNumber(kmcVO.getPhoneNo()); + mjPhoneMemberVO.setUserName(kmcVO.getName()); mjPhoneMemberVO.setAuthYn("Y"); mjonMsgService.insertSendNumber(mjPhoneMemberVO); @@ -3662,7 +2788,7 @@ public class EgovMypageController { */ @RequestMapping("/web/user/selectSecurityAuthn.do") public String selectSecurityAuthn( - HttpServletRequest request, ModelMap model + HttpServletRequest request, HttpServletResponse response, ModelMap model , @RequestParam Map commandMap , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { @@ -3671,243 +2797,13 @@ public class EgovMypageController { 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("secureLoginOFF"); - certVO.setCertIpaddr(kmcVO.getIp()); - certVO.setBirthDay(kmcVO.getBirthDay()); - certVO.setSexdstnCode(kmcVO.getGender()); - - - //디비 테이블에 저장하기 - mberManageService.insertCertInfoLog(certVO); - - + //kmc 본인인증 결과처리 + kmcVO = kmcCertChecker.authCertResult(request, response, model); + //kmc 본인인증 로그 처리 + AuthCertVO certVO = kmcCertChecker.insertCertLog(kmcVO, "secureLoginOFF"); //본인 명의만 번호 변경 가능하게 - if(mblDn.equals(DI)) { + if(mblDn.equals(kmcVO.getDI())) { String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); MberManageVO mberManageVO = new MberManageVO(); mberManageVO.setSecuLoginFlag("N"); 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 b2c56693..b627f605 100644 --- a/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java +++ b/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java @@ -29,12 +29,16 @@ import itn.let.cert.phone.service.CertPhoneService; import itn.let.cert.phone.service.MberCertPhoneVO; import itn.let.mjo.pay.service.KmcVO; import itn.let.uat.uia.service.AuthCertVO; +import itn.let.uss.umt.service.EgovMberManageService; @Component("KmcCertChecker") public class KmcCertChecker { @Resource(name = "CertPhoneService") private CertPhoneService certPhoneService; + + @Resource(name = "mberManageService") + private EgovMberManageService mberManageService; //회원가입 시 인증수단을 휴대폰 본인인증만 했을 경우 사용 public AuthCertVO authCertCheck( @@ -80,8 +84,8 @@ public class KmcCertChecker { //02. 1차 암호화 (tr_cert 데이터변수 조합 후 암호화) String enc_tr_cert = ""; -// tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar; - tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"///////"+ plusInfo +"/"+ extendVar; + tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar; +// tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"///////"+ plusInfo +"/"+ extendVar; enc_tr_cert = seed.getEnc(tr_cert, ""); //03. 1차 암호화 데이터에 대한 위변조 검증값 생성 (HMAC) @@ -299,7 +303,7 @@ public class KmcCertChecker { } //02. 1차 복호화 - rec_cert = seed.getDec(rec_cert, k_certNum); + rec_cert = seed.getDec(rec_cert, ""); //03. 1차 파싱 int inf1 = rec_cert.indexOf("/",0); @@ -343,28 +347,30 @@ public class KmcCertChecker { int info17 = rec_cert.indexOf("/",info16+1); int info18 = rec_cert.indexOf("/",info17+1); - certNum = rec_cert.substring(0,info1); - date = rec_cert.substring(info1+1,info2); - CI = rec_cert.substring(info2+1,info3); - phoneNo = rec_cert.substring(info3+1,info4); - phoneCorp = rec_cert.substring(info4+1,info5); - birth = rec_cert.substring(info5+1,info6); - gender = rec_cert.substring(info6+1,info7); - nation = rec_cert.substring(info7+1,info8); - name = rec_cert.substring(info8+1,info9); - result = rec_cert.substring(info9+1,info10); - certMet = rec_cert.substring(info10+1,info11); - ip = rec_cert.substring(info11+1,info12); - reserve1 = rec_cert.substring(info12+1,info13); - reserve2 = rec_cert.substring(info13+1,info14); - reserve3 = rec_cert.substring(info14+1,info15); - reserve4 = rec_cert.substring(info15+1,info16); - plusInfo = rec_cert.substring(info16+1,info17); - DI = rec_cert.substring(info17+1,info18); + kmcVO.setCertNum (rec_cert.substring(0,info1)); + kmcVO.setDate (rec_cert.substring(info1+1,info2)); + //CI 복호화 + kmcVO.setCI (seed.getDec(rec_cert.substring(info2+1,info3), "")); + kmcVO.setPhoneNo (rec_cert.substring(info3+1,info4)); + kmcVO.setPhoneCorp (rec_cert.substring(info4+1,info5)); + kmcVO.setBirthDay (rec_cert.substring(info5+1,info6)); + kmcVO.setGender (rec_cert.substring(info6+1,info7)); + kmcVO.setNation (rec_cert.substring(info7+1,info8)); + kmcVO.setName (rec_cert.substring(info8+1,info9)); + kmcVO.setResult (rec_cert.substring(info9+1,info10)); + kmcVO.setCertMet (rec_cert.substring(info10+1,info11)); + kmcVO.setIp (rec_cert.substring(info11+1,info12)); + kmcVO.setReserve1 (rec_cert.substring(info12+1,info13)); + kmcVO.setReserve2 (rec_cert.substring(info13+1,info14)); + kmcVO.setReserve3 (rec_cert.substring(info14+1,info15)); + kmcVO.setReserve4 (rec_cert.substring(info15+1,info16)); + kmcVO.setPlusInfo (rec_cert.substring(info16+1,info17)); + //DI 복호화 + kmcVO.setDI (seed.getDec(rec_cert.substring(info17+1,info18), "")); //07. CI, DI 복호화 - CI = seed.getDec(CI, ""); - DI = seed.getDec(DI, ""); +// CI = seed.getDec(CI, ""); +// DI = seed.getDec(DI, ""); // ---------------------------------------------------------------------------------- @@ -386,7 +392,27 @@ public class KmcCertChecker { return kmcVO; } - + public AuthCertVO insertCertLog(KmcVO kmcVO, String msg) throws Exception { + //KMC 본인인증 로그 insert + 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(msg); + certVO.setCertIpaddr(kmcVO.getIp()); + certVO.setBirthDay(kmcVO.getBirthDay()); + certVO.setSexdstnCode(kmcVO.getGender()); + + //디비 테이블에 저장하기 + mberManageService.insertCertInfoLog(certVO); + + return certVO; + } private String getDomain(HttpServletRequest request) { String serverNm = request.getScheme() + "://" + request.getServerName(); diff --git a/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step02.jsp b/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step02.jsp index bfb40e06..fe0ea7a2 100644 --- a/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step02.jsp +++ b/src/main/webapp/WEB-INF/jsp/sample/kmc/kmcis_web_sample_step02.jsp @@ -344,6 +344,7 @@ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/addr/AddrGroupListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/addr/AddrGroupListAjax.jsp index 90887669..99981aa2 100644 --- a/src/main/webapp/WEB-INF/jsp/web/addr/AddrGroupListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/addr/AddrGroupListAjax.jsp @@ -904,5 +904,6 @@ function listAddrTransHistAjax(pageNo) { + diff --git a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp index 9cf41d7a..b250df27 100644 --- a/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp @@ -1883,6 +1883,7 @@ function actionLogin_end(){ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/cop/bbs/include/mberSecession.jsp b/src/main/webapp/WEB-INF/jsp/web/cop/bbs/include/mberSecession.jsp index 9072a7b0..09125047 100644 --- a/src/main/webapp/WEB-INF/jsp/web/cop/bbs/include/mberSecession.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/cop/bbs/include/mberSecession.jsp @@ -90,6 +90,7 @@ function openMberSecessionInfo(key){ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp index d0de8555..117cfb1e 100644 --- a/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/fax/addr/FaxAddrGroupListAjax.jsp @@ -821,5 +821,6 @@ function listAddrTransHistAjax(pageNo) { + diff --git a/src/main/webapp/WEB-INF/jsp/web/login/findUserId.jsp b/src/main/webapp/WEB-INF/jsp/web/login/findUserId.jsp index f4e2265e..e52bbd18 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/findUserId.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/findUserId.jsp @@ -860,6 +860,7 @@ function fnAddUserView() { + diff --git a/src/main/webapp/WEB-INF/jsp/web/login/humanPageAuthenticatedPage.jsp b/src/main/webapp/WEB-INF/jsp/web/login/humanPageAuthenticatedPage.jsp index 020d8983..2f9bbee3 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/humanPageAuthenticatedPage.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/humanPageAuthenticatedPage.jsp @@ -129,6 +129,7 @@ function fnAddUserView() { + diff --git a/src/main/webapp/WEB-INF/jsp/web/login/test_usrCheckTerms.jsp b/src/main/webapp/WEB-INF/jsp/web/login/test_usrCheckTerms.jsp index 5e8c9229..b953cd01 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/test_usrCheckTerms.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/test_usrCheckTerms.jsp @@ -644,6 +644,7 @@ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms_back2.jsp b/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms_back2.jsp index 4fde2d3c..afcc2ad8 100644 --- a/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms_back2.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/login/usrCheckTerms_back2.jsp @@ -707,6 +707,7 @@ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp index 87e70649..c0af9af3 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberCompanyInfoChange.jsp @@ -505,6 +505,7 @@ function changeValueWork(obj){ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoChange.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoChange.jsp index eb6e25a3..d0471fd4 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoChange.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoChange.jsp @@ -218,6 +218,7 @@ function updateUserInfo(){ + 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 b2e0e58b..563f5775 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp @@ -304,6 +304,7 @@ function callTo() { +
diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberSecession.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberSecession.jsp index 532579b6..75bde8cf 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberSecession.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberSecession.jsp @@ -97,6 +97,7 @@ function openMberSecessionInfo(key){ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp index 86677aef..829833c2 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp @@ -704,6 +704,7 @@ function linkPage(pageNo){ +
diff --git a/src/main/webapp/WEB-INF/jsp/web/user/sendNumberKmcReqPage.jsp b/src/main/webapp/WEB-INF/jsp/web/user/sendNumberKmcReqPage.jsp index e8dc2e0a..cc40d7ff 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/sendNumberKmcReqPage.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/sendNumberKmcReqPage.jsp @@ -27,7 +27,7 @@ -

+ <%--

[복호화 후 수신값]

@@ -120,6 +120,6 @@ rec_cert : ${kmcVO.recCert}


- [다시 테스트] + [다시 테스트] --%> \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManageRegister.jsp b/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManageRegister.jsp index 6483f195..6c21fdfe 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManageRegister.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManageRegister.jsp @@ -863,6 +863,7 @@ function nameChk(target){ + diff --git a/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManage_bak220502.jsp b/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManage_bak220502.jsp index 95439b24..632a653a 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManage_bak220502.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/sendNumberManage_bak220502.jsp @@ -408,6 +408,7 @@ function guideTab(obj){ + From c664e67c5941168f34063b3889de3d589634affe Mon Sep 17 00:00:00 2001 From: ijunho Date: Fri, 29 Aug 2025 18:03:47 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[KISA]=20=EC=A0=84=ED=99=94=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B1=B0=EC=A7=93=ED=91=9C=EC=8B=9C=20=EA=B8=88?= =?UTF-8?q?=EC=A7=80=20=EA=B3=A0=EC=8B=9C=20=EA=B0=9C=EC=A0=95=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20"=EB=8C=80=EB=9F=89=EB=AC=B8=EC=9E=90=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EC=95=88=EB=82=B4=20=EC=84=9C=EB=B9=84=EC=8A=A4"=20?= =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=A0=81=EC=9A=A9=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit http://pms.iten.co.kr:9999/issues/5419 --- .gitignore | 3 + .../itn/let/mjo/mjocommon/MjonCommon.java | 123 +++++++++++++++++- .../msgdata/service/MjonMsgDataService.java | 2 +- .../msgdata/service/impl/MjonMsgDataDAO.java | 4 + .../service/impl/MjonMsgDataServiceImpl.java | 11 ++ .../java/itn/let/uat/uia/web/SendLogVO.java | 10 ++ .../spring/com/context-security.xml | 2 +- .../sqlmap/let/msg/MjonMsgData_SQL_mysql.xml | 20 ++- 8 files changed, 168 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index f1e66539..28a7b2d1 100644 --- a/.gitignore +++ b/.gitignore @@ -203,3 +203,6 @@ rebel.xml /mvnw.cmd /.gemini.zip /CLAUDE.md + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index e6792d0c..fe8a32c2 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -3,6 +3,8 @@ package itn.let.mjo.mjocommon; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -16,10 +18,8 @@ import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods.PostMethod; import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; - -import com.mysql.jdbc.StringUtils; +import org.springframework.transaction.annotation.Transactional; import egovframework.com.idgen.CustomIdGnrService; import egovframework.rte.fdl.cmmn.exception.FdlException; @@ -33,11 +33,15 @@ import itn.let.mail.service.StatusResponse; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.mjo.msg.service.impl.MjonMsgDAO; +import itn.let.mjo.msgdata.service.MjonMsgDataService; +import itn.let.mjo.msgdata.service.MjonMsgReturnVO; import itn.let.mjo.msgholiday.service.MsgAlarmSetVO; import itn.let.mjo.msgholiday.service.MsgHolidayService; import itn.let.mjo.msgholiday.service.MsgHolidayVO; import itn.let.sym.site.service.EgovSiteManagerService; import itn.let.sym.site.service.JoinSettingVO; +import itn.let.uat.uia.web.SendLogVO; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.UserManageVO; import lombok.extern.slf4j.Slf4j; @@ -70,6 +74,12 @@ public class MjonCommon { @Resource(name = "egovMjonMsgIdCGnrService") private CustomIdGnrService idgenMsgCId; + + @Resource(name = "mjonMsgDAO") + private MjonMsgDAO mjonMsgDAO; + + @Resource(name = "MjonMsgDataService") + private MjonMsgDataService mjonMsgDataService; @@ -784,7 +794,114 @@ private int parseIntOrDefault(String value, int defaultValue) { return result; } + public void sendMessagesIfOverFifty(int cnt, String callTo) throws Exception { + //대량문자 발송 안내 = 01 + + //50건 이상일 경우만 발송 + if(cnt >= 50) { + // 금일 1회 이상 보낸 이력없을 경우만 발송 + if(!sysMsgTodaySendYn(callTo)) { + String sendMsgType = "01"; + String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String contents = "[인터넷 대량문자발송안내] 문자온에서 "+ callTo + " 번호로 " + today + "에 인터넷 대량 문자(50통 이상)가 발송되었습니다." + + "\n※ 번호도용이 의심되는 경우, 이용 중인 이동통신사의 휴대전화 번호도용 문자차단 부가서비스(무료)에 가입하여 피해를 예방할 수 있습니다."; + this.sendSysMsg( + "15518011" + , callTo + , contents + , sendMsgType + ); + } + } + } + /** + * Method Name : sendSysMsg + * Description : 관리자 안내 문자 공통 + * + * @param callFrom : 발신번호 + * @param callTo : 수신번호 + * @param contents : 내용 + * @param sendMsgType : 발신내용 타입 - 01: 대량문자발송안내 + * @return + * @throws Exception + * @return MjonMsgReturnVO 설명 + */ + @Transactional(rollbackFor = Exception.class) + public MjonMsgReturnVO sendSysMsg( + String callFrom + , String callTo + , String contents + , String sendMsgType + ) throws Exception { + + //결과 vo + MjonMsgReturnVO returnVO = new MjonMsgReturnVO(); + + MjonMsgVO mjonMsgVO = new MjonMsgVO(); + mjonMsgVO.setSmsTxt(contents); + mjonMsgVO.setReserveYn("N"); + // 시스템 문자발송 번호 +// mjonMsgVO.setCallFrom("15518011"); + mjonMsgVO.setCallFrom(callFrom); + mjonMsgVO.setCallTo(callTo); + + mjonMsgVO.setUserId("system"); + + /* + * 본문길이에 따른 단문/장문 구분 + * 단문 4 + * 장문 6 + * 2000자 이상 invalid + */ + String msgType = MsgSendUtils.getMsgTypeWithByteValidation(new MjonMsgSendVO(), contents);// + mjonMsgVO.setMsgType(msgType); + + // MsgDiv - S: 단문, L: 장문, P: 그림 + if("4".equalsIgnoreCase(msgType)) { + mjonMsgVO.setMsgDiv("S"); + }else if("6".equalsIgnoreCase(msgType)) { + mjonMsgVO.setMsgDiv("L"); + } + else { // invalid + returnVO.setMsgGroupId(""); + returnVO.setSendMsgCnt("0"); // 발송 건수 저장 + returnVO.setSendMsgBlockCnt("0"); // 수신차단 건수 저장 + return returnVO; + } + + // 문자타입별 대표전송사 정보 + MjonMsgVO mjonMsgVO2 = new MjonMsgVO(); + mjonMsgVO2 = mjonMsgDAO.selectRepMsgAgetnInfo(mjonMsgVO); + // 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술 + mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택 + // 전송금액 + mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString()); //총금액 + mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString()); //한건 금액 + + returnVO = mjonMsgDataService.insertSysMsgDataInfo(mjonMsgVO); + + // 시스템 발송 로그 + SendLogVO sendLogVO = new SendLogVO(); + // SendType 1:문자로 발송 2:이메일로 발송 + sendLogVO.setSendId(returnVO.getMsgGroupId()); + sendLogVO.setSendType("1"); + sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom()); + sendLogVO.setReceive(mjonMsgVO.getCallTo()); + sendLogVO.setContents(contents); + sendLogVO.setSendMsgType(sendMsgType); + + mjonMsgDataService.insertSysMsgLog(sendLogVO); + + return returnVO; + } + + private Boolean sysMsgTodaySendYn(String callTo) throws Exception { + SendLogVO sendLogVO = new SendLogVO(); + sendLogVO.setReceive(callTo); + + return mjonMsgDataService.selectSysMsgTodaySendYn(sendLogVO); + } diff --git a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java index d5e4c1a5..8ef8d3ef 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java +++ b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java @@ -190,7 +190,7 @@ public interface MjonMsgDataService { public MjonMsgReturnVO sendSysMsgData(MjonMsgVO mjonMsgVO, HttpServletRequest request) throws Exception; - + public Boolean selectSysMsgTodaySendYn(SendLogVO sendLogVO) throws Exception; } diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java index b28a2b52..a3100f2f 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java @@ -403,6 +403,10 @@ public class MjonMsgDataDAO extends EgovAbstractDAO { return result; } + public Boolean selectSysMsgTodaySendYn(SendLogVO sendLogVO) throws Exception{ + return (Boolean) select("mjonMsgDataDAO.selectSysMsgTodaySendYn",sendLogVO); + } + /** * 다량 데이터를 Batch 처리로 MJ_MSG_DATA 테이블에 INSERT diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index bde8f50c..95861b0d 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -4187,6 +4187,12 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M // 총 발송 건수 returnMap.put("resultSts", instTotalCnt); + try { + mjonCommon.sendMessagesIfOverFifty(instTotalCnt, mjonMsgVO.getCallFrom()); + } catch (Exception e) { + System.out.println("sendMessagesIfOverFifty method exception."); + } + // TEST발송 시 발송 후 캐시가 있어야함. returnMap.put("afterCash", priceAndPoint.getBefCash(userId)); // @@ -5148,4 +5154,9 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M return returnVO; } + @Override + public Boolean selectSysMsgTodaySendYn(SendLogVO sendLogVO) throws Exception{ + return mjonMsgDataDAO.selectSysMsgTodaySendYn(sendLogVO); + } + } diff --git a/src/main/java/itn/let/uat/uia/web/SendLogVO.java b/src/main/java/itn/let/uat/uia/web/SendLogVO.java index a26fd6e2..43a77053 100644 --- a/src/main/java/itn/let/uat/uia/web/SendLogVO.java +++ b/src/main/java/itn/let/uat/uia/web/SendLogVO.java @@ -19,6 +19,8 @@ public class SendLogVO { /*내용*/ private String contents; + private String sendMsgType; + public String getSendId() { return sendId; @@ -62,5 +64,13 @@ public class SendLogVO { public void setContents(String contents) { this.contents = contents; } + public String getSendMsgType() { + return sendMsgType; + } + public void setSendMsgType(String sendMsgType) { + this.sendMsgType = sendMsgType; + } + + } diff --git a/src/main/resources/egovframework/spring/com/context-security.xml b/src/main/resources/egovframework/spring/com/context-security.xml index 069661d3..a255a542 100644 --- a/src/main/resources/egovframework/spring/com/context-security.xml +++ b/src/main/resources/egovframework/spring/com/context-security.xml @@ -4,7 +4,7 @@ xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd - http://www.egovframe.go.kr/schema/egov-security http://www.egovframe.go.kr/schema/egov-security/egov-security-3.7.xsd"> + http://www.egovframe.go.kr/schema/egov-security http://maven.egovframe.go.kr/schema/egov-security/egov-security-3.7.xsd"> diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index 08ef7a37..c50b6b93 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -3733,7 +3733,8 @@ RECEIVE, FRST_SEND_PNTTM, CHECK_NO, - CONTENTS + CONTENTS, + SEND_MSG_TYPE ) @@ -3746,7 +3747,8 @@ #receive#, now(), #checkNo#, - #contents# + #contents#, + #sendMsgType# ) @@ -8294,5 +8296,19 @@ + + From fff68682bd0bccdcede238aa5194f1462ca82702 Mon Sep 17 00:00:00 2001 From: ijunho Date: Wed, 10 Sep 2025 11:03:50 +0900 Subject: [PATCH 05/14] =?UTF-8?q?50=EA=B1=B4=EC=9D=B4=EC=83=81=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=EC=8B=9C=20=EC=95=88=EB=82=B4=EB=AC=B8=EC=9E=90=20?= =?UTF-8?q?=EB=B0=9C=EC=86=A1=20=EA=B4=80=EB=A6=AC=EC=9E=90=20on/off?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../itn/let/mjo/mjocommon/MjonCommon.java | 35 +++++++++++-------- .../service/impl/MjonMsgDataServiceImpl.java | 1 + .../let/sym/site/service/JoinSettingVO.java | 1 + .../let/sym/site/EgovSiteManage_SQL_Mysql.xml | 1 + 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index fe8a32c2..70116607 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -796,22 +796,24 @@ private int parseIntOrDefault(String value, int defaultValue) { public void sendMessagesIfOverFifty(int cnt, String callTo) throws Exception { //대량문자 발송 안내 = 01 - + System.out.println("test"); //50건 이상일 경우만 발송 - if(cnt >= 50) { + if( + cnt >= 50 + && !sysMsgTodaySendYn(callTo) + && "Y".equals(selectSmsNotiIfOverFiftySetting()) + ) { // 금일 1회 이상 보낸 이력없을 경우만 발송 - if(!sysMsgTodaySendYn(callTo)) { - String sendMsgType = "01"; - String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - String contents = "[인터넷 대량문자발송안내] 문자온에서 "+ callTo + " 번호로 " + today + "에 인터넷 대량 문자(50통 이상)가 발송되었습니다." - + "\n※ 번호도용이 의심되는 경우, 이용 중인 이동통신사의 휴대전화 번호도용 문자차단 부가서비스(무료)에 가입하여 피해를 예방할 수 있습니다."; - this.sendSysMsg( - "15518011" - , callTo - , contents - , sendMsgType - ); - } + String sendMsgType = "01"; + String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String contents = "[인터넷 대량문자발송안내] 문자온에서 "+ callTo + " 번호로 " + today + "에 인터넷 대량 문자(50통 이상)가 발송되었습니다." + + "\n※ 번호도용이 의심되는 경우, 이용 중인 이동통신사의 휴대전화 번호도용 문자차단 부가서비스(무료)에 가입하여 피해를 예방할 수 있습니다."; + this.sendSysMsg( + "15518011" + , callTo + , contents + , sendMsgType + ); } } @@ -903,6 +905,9 @@ private int parseIntOrDefault(String value, int defaultValue) { return mjonMsgDataService.selectSysMsgTodaySendYn(sendLogVO); } - + private String selectSmsNotiIfOverFiftySetting() throws Exception { + JoinSettingVO joinSettingVO = egovSiteManagerService.selectAdminNotiDetail(); + return joinSettingVO.getSmsNotiIfOverFifty(); + } } diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index 95861b0d..ac0ecacb 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -4188,6 +4188,7 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M returnMap.put("resultSts", instTotalCnt); try { + //50건이상 문자발송 시 안내메시지 전송 mjonCommon.sendMessagesIfOverFifty(instTotalCnt, mjonMsgVO.getCallFrom()); } catch (Exception e) { System.out.println("sendMessagesIfOverFifty method exception."); diff --git a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java index f64ba44f..d83ad497 100644 --- a/src/main/java/itn/let/sym/site/service/JoinSettingVO.java +++ b/src/main/java/itn/let/sym/site/service/JoinSettingVO.java @@ -65,6 +65,7 @@ public class JoinSettingVO { private String slackNoti; //관리자 SLACK 알림 여부 private String smishingNoti; //첫결제(카드제외) 스미싱의심 알림 여부 private String holiSmishingNoti; //야간 스미싱알림 여부 + private String smsNotiIfOverFifty; //50건이상 문자발송 시 안내문자 발송 } diff --git a/src/main/resources/egovframework/sqlmap/let/sym/site/EgovSiteManage_SQL_Mysql.xml b/src/main/resources/egovframework/sqlmap/let/sym/site/EgovSiteManage_SQL_Mysql.xml index d6a6a6c3..ea5f1a4f 100644 --- a/src/main/resources/egovframework/sqlmap/let/sym/site/EgovSiteManage_SQL_Mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/sym/site/EgovSiteManage_SQL_Mysql.xml @@ -980,6 +980,7 @@ IFNULL(SLACK_NOTI, 'N') AS slackNoti, IFNULL(SMISHING_NOTI, 'N') AS smishingNoti, IFNULL(HOLI_SMISHING_NOTI, 'N') AS holiSmishingNoti, + IFNULL(SMS_NOTI_IF_OVER_FIFTY, 'N') AS smsNotiIfOverFifty, LAST_UPDUSR_ID AS lasUpdusrId, LAST_UPDT_PNTTM AS lastUpdtPnttm FROM MJ_MBER_SETTING From 6f822ffa67d6cf1320750560c90d3b3f5e3b4c43 Mon Sep 17 00:00:00 2001 From: ijunho Date: Wed, 10 Sep 2025 11:13:02 +0900 Subject: [PATCH 06/14] =?UTF-8?q?Merge=20branch=20'master'=20into=205419?= =?UTF-8?q?=5F=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=EA=B1=B0=EC=A7=93?= =?UTF-8?q?=ED=91=9C=EC=8B=9C50=EA=B1=B4=EC=9D=B4=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 개발시 사용한 sysout 삭제 --- src/main/java/itn/let/mjo/mjocommon/MjonCommon.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java index 70116607..dd5895f2 100644 --- a/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java +++ b/src/main/java/itn/let/mjo/mjocommon/MjonCommon.java @@ -796,7 +796,6 @@ private int parseIntOrDefault(String value, int defaultValue) { public void sendMessagesIfOverFifty(int cnt, String callTo) throws Exception { //대량문자 발송 안내 = 01 - System.out.println("test"); //50건 이상일 경우만 발송 if( cnt >= 50 From bfe5f333f91f25091c06f1bf1a7c136e2689622e Mon Sep 17 00:00:00 2001 From: ijunho Date: Wed, 10 Sep 2025 11:19:15 +0900 Subject: [PATCH 07/14] =?UTF-8?q?git=20ignore=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index f1e66539..5070d86a 100644 --- a/.gitignore +++ b/.gitignore @@ -203,3 +203,6 @@ rebel.xml /mvnw.cmd /.gemini.zip /CLAUDE.md + +# Mac OS +.DS_Store \ No newline at end of file From 96583304ec2f19a7fbf73b61201fe6e704a79802 Mon Sep 17 00:00:00 2001 From: ijunho Date: Thu, 11 Sep 2025 17:58:32 +0900 Subject: [PATCH 08/14] =?UTF-8?q?=EB=B0=9C=EC=86=A1=20=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index c50b6b93..8ac6f02d 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -8298,7 +8298,9 @@