본인인증 개발

This commit is contained in:
leejunho 2025-11-18 18:16:25 +09:00
parent b1b012a44e
commit 6fec0efb19
26 changed files with 1931 additions and 799 deletions

33
pom.xml
View File

@ -339,24 +339,6 @@
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/simplecaptcha-1.2.1_exp.jar</systemPath>
</dependency>
<!-- sci 평가 siren24. 본인인증 -->
<dependency>
<groupId>sciSecuPCC</groupId>
<artifactId>sciSecuPCC</artifactId>
<version>2</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/sciSecuPCC.jar</systemPath>
</dependency>
<dependency>
<groupId>sciSecuPIN_v3</groupId>
<artifactId>sciSecuPIN_v3</artifactId>
<version>2</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/sciSecuIPIN_v3.jar</systemPath>
</dependency>
<!-- magicline 공동인증서 시작 -->
<dependency>
<groupId>jcaos</groupId>
@ -560,8 +542,21 @@
<artifactId>spring-security-crypto</artifactId>
<version>4.2.13.RELEASE</version> <!-- 프로젝트와 호환되는 4.x 라인 -->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- sci본인인증 v3 -->
<dependency>
<groupId>com.sci.v3</groupId>
<artifactId>sciSecuPCC_v3</artifactId>
<version>v3</version>
</dependency>
</dependencies>
<build>
<defaultGoal>install</defaultGoal>

View File

@ -1,26 +1,6 @@
package kcc.kccadr.xxx.web;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import kcc.com.cmm.CmmUtil;
@ -30,18 +10,37 @@ import kcc.com.cmm.service.EgovCmmUseService;
import kcc.com.cmm.service.EgovFileMngService;
import kcc.com.cmm.service.EgovFileMngUtil;
import kcc.com.cmm.service.FileVO;
import kcc.com.utl.user.service.CheckLoginUtil;
import kcc.kccadr.xxx.service.XxxService;
import kcc.kccadr.xxx.service.XxxVO;
import kcc.ve.cmm.crt.CertPhoneRequestUtill;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 대국민(사용자)
* XXX에 관한 controller 클래스를 정의한다.
* @author 이준호
* @since 2021.08.09
* @version 1.0
* @see
*
* <pre>
* @author 이준호
* @version 1.0
* @see <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
@ -49,6 +48,7 @@ import kcc.kccadr.xxx.service.XxxVO;
* 2021.08.09 이준호 최초 생성
*
* </pre>
* @since 2021.08.09
*/
@Controller
public class XxxWebController {
@ -66,36 +66,45 @@ public class XxxWebController {
// eGov 공통코드
@Resource(name = "EgovCmmUseService")
private EgovCmmUseService cmmUseService;
// global 프로퍼티
@Resource(name="globalSettings")
@Resource(name = "globalSettings")
protected Properties propertiesService;
//첨부파일 경로, realPath 설정
@Resource(name="EgovFileMngUtil")
@Resource(name = "EgovFileMngUtil")
private EgovFileMngUtil fileUtil;
// 첨부파일 정보
@Resource(name="EgovFileMngService")
private EgovFileMngService fileMngService;
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileMngService;
// 첨부파일 정보
@Resource(name = "certPhoneRequestUtill")
private CertPhoneRequestUtill certPhoneRequestUtill;
//로그인 체크 util
@Resource(name = "checkLoginUtil")
private CheckLoginUtil checkLoginUtil;
/**
* XXX 목록 화면
*/
@RequestMapping("/web/kccadr/xxx/xxxList.do")
public String xxxList(@ModelAttribute("searchVO") XxxVO xxxVO, ModelMap model) throws Exception {
public String xxxList( @ModelAttribute("searchVO") XxxVO xxxVO, ModelMap model ) throws Exception {
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser(); //로그인 정보
model.addAttribute("user", user);
List<XxxVO> xxxList = xxxService.selectXxxList(xxxVO); // 목록 조회
// 페이징 처리 객체
PaginationInfo paginationInfo = CmmUtil.getPageing(xxxVO, xxxVO.getPageUnit());
paginationInfo.setTotalRecordCount(xxxList.size() > 0 ? xxxList.get(0).getTotCnt() : 0);
//최초조회시 최신것 조회List
if("".equals(xxxVO.getSearchSortCnd())){
if("".equals(xxxVO.getSearchSortCnd())) {
xxxVO.setSearchSortCnd("xxxId");
xxxVO.setSearchSortOrd("desc");
}
@ -113,7 +122,7 @@ public class XxxWebController {
* XXX 등록화면
*/
@RequestMapping("/web/kccadr/xxx/xxxRegist.do")
public String xxxRegist(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception {
public String xxxRegist( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception {
return "/web/kccadr/xxx/xxxRegist";
}
@ -122,42 +131,42 @@ public class XxxWebController {
* XXX 등록 처리
*/
@RequestMapping("/web/kccadr/xxx/insertXxx.do")
public String insertXxx(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes) throws Exception {
public String insertXxx( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes ) throws Exception {
xxxService.insertXxx(xxxVO); // 등록
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert")); // 공통메세지
return "redirect:/web/kccadr/xxx/xxxList.do";
}
/**
* XXX 등록 Ajax
*/
@RequestMapping(value = {"/web/kccadr/xxx/insertXxxAjax.do"})
public ModelAndView insertXxxAjax(final MultipartHttpServletRequest multiRequest
* XXX 등록 Ajax
*/
@RequestMapping(value = { "/web/kccadr/xxx/insertXxxAjax.do" })
public ModelAndView insertXxxAjax( final MultipartHttpServletRequest multiRequest
, XxxVO xxxVO
, RedirectAttributes redirectAttributes
, HttpServletRequest request) throws Exception {
, HttpServletRequest request ) throws Exception {
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
String atchFileId = "";
final Map<String, MultipartFile> files = multiRequest.getFileMap();
if (!files.isEmpty()) {
if(!files.isEmpty()) {
//XXX_로 첨부파일 네이밍
List<FileVO> result = fileUtil.parseFileInf(files, "XXX_", 0, "", "", "");
atchFileId = fileMngService.insertFileInfs(result);
//첨부파일Id(atchFileId) 해당 VO atchFileId변수에 저장
xxxVO.setAtchFileId(atchFileId);
}
xxxVO.setFrstRegisterId(user.getId());
//게시글 등록 서비스
xxxService.insertXxx(xxxVO);
modelAndView.addObject("result", "success");
return modelAndView;
}
@ -166,7 +175,7 @@ public class XxxWebController {
* XXX 상세화면
*/
@RequestMapping("/web/kccadr/xxx/xxxDetail.do")
public String xxxDetail(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception {
public String xxxDetail( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception {
XxxVO result = xxxService.selectXxxDetail(xxxVO); // 상세 조회
model.addAttribute("result", result);
@ -178,7 +187,7 @@ public class XxxWebController {
* XXX 수정화면
*/
@RequestMapping("/web/kccadr/xxx/xxxModify.do")
public String xxxModify(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception {
public String xxxModify( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception {
XxxVO result = xxxService.selectXxxDetail(xxxVO); // 상세 조회
model.addAttribute("result", result);
@ -190,34 +199,34 @@ public class XxxWebController {
* XXX 수정 처리
*/
@RequestMapping("/web/kccadr/xxx/updateXxx.do")
public String updateXxx(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes) throws Exception {
public String updateXxx( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes ) throws Exception {
xxxService.updateXxx(xxxVO); // 수정
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.update")); // 공통메세지
return "redirect:/web/kccadr/xxx/xxxDetail.do";
}
/**
* xxx 수정 Ajax
*/
@RequestMapping(value = {"/web/kccadr/xxx/updateXxxAjax.do"})
public ModelAndView updateXxxAjax(final MultipartHttpServletRequest multiRequest
* xxx 수정 Ajax
*/
@RequestMapping(value = { "/web/kccadr/xxx/updateXxxAjax.do" })
public ModelAndView updateXxxAjax( final MultipartHttpServletRequest multiRequest
, XxxVO xxxVO
, RedirectAttributes redirectAttributes
, HttpServletRequest request) throws Exception {
, HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
String atchFileId = "";
final Map<String, MultipartFile> files = multiRequest.getFileMap();
if (!files.isEmpty()) {
if ("".equals(atchFileId)) {
if(!files.isEmpty()) {
if("".equals(atchFileId)) {
//XXX_로 첨부파일 네이밍
List<FileVO> result = fileUtil.parseFileInf(files, "XXX_", 0, atchFileId, "", "");
atchFileId = fileMngService.insertFileInfs(result);
//첨부파일Id(atchFileId) 해당 VO atchFileId변수에 저장
xxxVO.setAtchFileId(atchFileId);
@ -226,13 +235,13 @@ public class XxxWebController {
fvo.setAtchFileId(atchFileId);
int cnt = fileMngService.getMaxFileSN(fvo);
List<FileVO> result = fileUtil.parseFileInf(files, "XXX_", cnt, atchFileId, "", "");
fileMngService.updateFileInfs(result);
}
}
//게시글 수정 서비스
xxxService.updateXxx(xxxVO);
modelAndView.addObject("result", "success");
return modelAndView;
}
@ -241,29 +250,29 @@ public class XxxWebController {
* XXX 삭제 처리
*/
@RequestMapping("/web/kccadr/xxx/deleteXxx.do")
public String deleteXxx(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes) throws Exception {
public String deleteXxx( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap mode, RedirectAttributes redirectAttributes ) throws Exception {
xxxService.deleteXxx(xxxVO); // 삭제
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.delete")); // 공통메세지
return "redirect:/web/kccadr/xxx/xxxList.do";
}
/**
* XXX 삭제 처리(delete가 아닌 useYn컬럼을 상태값으로 'N'처리할때)
* XXX 삭제 처리(delete가 아닌 useYn컬럼을 상태값으로 'N'처리할때)
*/
@RequestMapping("/web/kccadr/xxx/deleteXxx2.do")
public String deleteXxx2(HttpServletRequest request, @ModelAttribute("searchVO") XxxVO xxxVO,
ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
public String deleteXxx2( HttpServletRequest request, @ModelAttribute("searchVO") XxxVO xxxVO,
ModelMap model, RedirectAttributes redirectAttributes ) throws Exception {
LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
xxxVO.setLastUpdusrId(user.getUniqId());
xxxVO.setLastUpdusrNm(user.getName()); // 변경이력에 사용
xxxVO.setLastUpdusrNm(user.getName()); // 변경이력에 사용
xxxService.deleteXxx2(xxxVO);
xxxVO.setPageIndex(1); //삭제후 첫페이지로 로딩
redirectAttributes.addAttribute("pageIndex", xxxVO.getPageIndex());
redirectAttributes.addAttribute("searchCnd", xxxVO.getSearchCnd());
redirectAttributes.addAttribute("searchWrd", xxxVO.getSearchWrd());
@ -271,15 +280,13 @@ public class XxxWebController {
redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.useN"));
return "redirect:/web/kccadr/xxx/xxxList.do";
}
/**
* XXX 팝업화면
*/
@RequestMapping("/web/kccadr/xxx/xxxDetailPop.do")
public String xxxDetailPop(@ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model) throws Exception {
public String xxxDetailPop( @ModelAttribute("xxxVO") XxxVO xxxVO, ModelMap model ) throws Exception {
XxxVO result = xxxService.selectXxxDetail(xxxVO); // 상세 조회
model.addAttribute("result", result);
@ -291,19 +298,19 @@ public class XxxWebController {
* XXX YYYY(처리) Ajax 처리
*/
@RequestMapping("/web/kccadr/xxx/xxxYyyyAjax.do")
public ModelAndView xxxYyyyAjax(@ModelAttribute("xxxVO") XxxVO xxxVO, BindingResult bindingResult) throws Exception {
public ModelAndView xxxYyyyAjax( @ModelAttribute("xxxVO") XxxVO xxxVO, BindingResult bindingResult ) throws Exception {
String result = "success";
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
// YYYY 처리 로직
// YYYY 처리 상태 체크
if (1 == 0) {
if(1 == 0) {
result = "fail";
}
modelAndView.addObject("result", result);
return modelAndView;
}

View File

@ -1,30 +1,31 @@
package kcc.let.cop.bbs.web;
import java.io.OutputStream;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import NiceID.Check.CPClient;
import com.penta.scpdb.ScpDbAgent;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import kcc.com.cmm.*;
import kcc.com.cmm.service.*;
import kcc.com.cmm.util.StringUtil;
import kcc.com.cmm.util.WebUtil;
import kcc.com.uss.ion.cnf.service.ProhibitMngService;
import kcc.com.uss.ion.cnf.service.WordFilterService;
import kcc.com.uss.ion.cnf.service.WordFilterVO;
import kcc.com.utl.fcc.service.EgovStringUtil;
import kcc.com.utl.user.service.CheckLoginUtil;
import kcc.let.cop.bbs.service.*;
import kcc.let.sym.mnu.mpm.service.EgovMenuManageService;
import kcc.let.sym.mnu.mpm.service.MenuManageVO;
import kcc.let.sym.site.service.EgovSiteManagerService;
import kcc.let.sym.site.service.SiteManagerVO;
import kcc.let.uat.uia.service.SsoLoginVO;
import kcc.let.utl.fcc.service.ITNotiUtil;
import kcc.let.utl.sim.service.EgovClntInfo;
import kcc.ve.cmm.VeConstants;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
@ -47,47 +48,15 @@ import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springmodules.validation.commons.DefaultBeanValidator;
import com.penta.scpdb.ScpDbAgent;
import com.sci.v2.pcc.secu.SciSecuManager;
import com.sci.v2.pcc.secu.hmac.SciHmac;
import NiceID.Check.CPClient;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import kcc.com.cmm.ComDefaultCodeVO;
import kcc.com.cmm.EgovMessageSource;
import kcc.com.cmm.EgovMultiPartEmail;
import kcc.com.cmm.LoginVO;
import kcc.com.cmm.ReadVO;
import kcc.com.cmm.UserVO;
import kcc.com.cmm.service.EgovCmmUseService;
import kcc.com.cmm.service.EgovFileMngService;
import kcc.com.cmm.service.EgovFileMngUtil;
import kcc.com.cmm.service.FileVO;
import kcc.com.cmm.service.ReadService;
import kcc.com.cmm.util.StringUtil;
import kcc.com.cmm.util.WebUtil;
import kcc.com.uss.ion.cnf.service.ProhibitMngService;
import kcc.com.uss.ion.cnf.service.WordFilterService;
import kcc.com.uss.ion.cnf.service.WordFilterVO;
import kcc.com.utl.fcc.service.EgovStringUtil;
import kcc.let.cop.bbs.service.Board;
import kcc.let.cop.bbs.service.BoardChgHst;
import kcc.let.cop.bbs.service.BoardMaster;
import kcc.let.cop.bbs.service.BoardMasterVO;
import kcc.let.cop.bbs.service.BoardVO;
import kcc.let.cop.bbs.service.EgovBBSAttributeManageService;
import kcc.let.cop.bbs.service.EgovBBSManageService;
import kcc.let.sym.mnu.mpm.service.EgovMenuManageService;
import kcc.let.sym.mnu.mpm.service.MenuManageVO;
import kcc.let.sym.site.service.EgovSiteManagerService;
import kcc.let.sym.site.service.SiteManagerVO;
import kcc.let.uat.uia.service.SsoLoginVO;
import kcc.let.utl.fcc.service.ITNotiUtil;
import kcc.let.utl.sim.service.EgovClntInfo;
import kcc.ve.cmm.VeConstants;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.OutputStream;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;
/**
* 게시물 관리를 위한 컨트롤러 클래스
@ -2341,21 +2310,21 @@ public class EgovBBSManageController {
request.getSession().setAttribute("reqNum", reqNum); // 결과값 복호화시 필요
//01. 암호화 모듈 선언
SciSecuManager seed = new SciSecuManager();
//02. 1차 암호화
String encStr = "";
String reqInfo = SELFAUTH_SITE_ID+"^"+SELFAUTH_SRV_NO+"^"+reqNum+"^"+certDate+"^"+certGb+"^"+addVar+"^"+exVar; // 데이터 암호화
encStr = seed.getEncPublic(reqInfo);
//03. 위변조 검증 생성
String hmacMsg = SciHmac.HMacEncriptPublic(encStr);
//03. 2차 암호화
reqInfo = seed.getEncPublic(encStr + "^" + hmacMsg + "^" + "0000000000000000"); //2차암호화
request.getSession().setAttribute("reqInfo", reqInfo); // 본인확인 요청 정보
// //01. 암호화 모듈 선언
// SciSecuManager seed = new SciSecuManager();
//
// //02. 1차 암호화
// String encStr = "";
// String reqInfo = SELFAUTH_SITE_ID+"^"+SELFAUTH_SRV_NO+"^"+reqNum+"^"+certDate+"^"+certGb+"^"+addVar+"^"+exVar; // 데이터 암호화
// encStr = seed.getEncPublic(reqInfo);
//
// //03. 위변조 검증 생성
// String hmacMsg = SciHmac.HMacEncriptPublic(encStr);
//
// //03. 2차 암호화
// reqInfo = seed.getEncPublic(encStr + "^" + hmacMsg + "^" + "0000000000000000"); //2차암호화
//
// request.getSession().setAttribute("reqInfo", reqInfo); // 본인확인 요청 정보
request.getSession().setAttribute("SITE_URL", SITE_URL); // 사이트 URL
return "web/cop/selfauth/selfauth";
@ -2371,41 +2340,41 @@ public class EgovBBSManageController {
@RequestMapping("/web/cop/selfauth/resultSeed.do")
public String resultSeed(HttpServletRequest request, ModelMap model, RedirectAttributes redirectAttributes)throws Exception {
String retInfo = request.getParameter("retInfo").trim();
String cookiereqNum = (String)request.getSession().getAttribute("reqNum");
//복화화용 변수
String encPara = "";
String encMsg = "";
String msgChk = "N";
// 1. 암호화 모듈 (jar) Loading
SciSecuManager sciSecuMg = new SciSecuManager();
//쿠키에서 생성한 값을 Key로 생성 한다.
retInfo = sciSecuMg.getDec(retInfo, cookiereqNum);
// 2.1차 파싱---------------------------------------------------------------
String[] aRetInfo1 = retInfo.split("\\^");
encPara = aRetInfo1[0]; //암호화된 통합 파라미터
encMsg = aRetInfo1[1]; //암호화된 통합 파라미터의 Hash값
String encMsg2 = sciSecuMg.getMsg(encPara);
// 3./변조 검증 ---------------------------------------------------------------
if(encMsg2.equals(encMsg)) msgChk="Y";
if(msgChk.equals("N")) {
// 비정상 접근 처리
}
retInfo = sciSecuMg.getDec(encPara, cookiereqNum);
String[] aRetInfo = retInfo.split("\\^");
String name = aRetInfo[0]; //성명
// String retInfo = request.getParameter("retInfo").trim();
// String cookiereqNum = (String)request.getSession().getAttribute("reqNum");
//
// //복화화용 변수
// String encPara = "";
// String encMsg = "";
// String msgChk = "N";
//
// // 1. 암호화 모듈 (jar) Loading
// SciSecuManager sciSecuMg = new SciSecuManager();
// //쿠키에서 생성한 값을 Key로 생성 한다.
// retInfo = sciSecuMg.getDec(retInfo, cookiereqNum);
//
// // 2.1차 파싱---------------------------------------------------------------
// String[] aRetInfo1 = retInfo.split("\\^");
//
// encPara = aRetInfo1[0]; //암호화된 통합 파라미터
// encMsg = aRetInfo1[1]; //암호화된 통합 파라미터의 Hash값
//
// String encMsg2 = sciSecuMg.getMsg(encPara);
// // 3./변조 검증 ---------------------------------------------------------------
// if(encMsg2.equals(encMsg)) msgChk="Y";
//
// if(msgChk.equals("N")) {
// // 비정상 접근 처리
// }
//
// retInfo = sciSecuMg.getDec(encPara, cookiereqNum);
//
// String[] aRetInfo = retInfo.split("\\^");
// String name = aRetInfo[0]; //성명
// String birYMD = aRetInfo[1]; //생년월일
// String sex = aRetInfo[2]; //성별
// String fgnGbn = aRetInfo[3]; //내외국인 구분값
String di = aRetInfo[4]; //DI
// String di = aRetInfo[4]; //DI
// String ci1 = aRetInfo[5]; //CI
// String ci2 = aRetInfo[6]; //CI
// String civersion = aRetInfo[7]; //CI Version
@ -2419,8 +2388,8 @@ public class EgovBBSManageController {
// 사용자 세션생성
UserVO userVO = new UserVO();
userVO.setName(name);
userVO.setMblDn(di);
// userVO.setName(name);
// userVO.setMblDn(di);
request.getSession().setAttribute("userVO", userVO);
String url = (String)request.getSession().getAttribute("url");

View File

@ -66,9 +66,6 @@ public class EgovLoginServiceImpl extends EgovAbstractServiceImpl implements
LoginVO loginVO = null;
String s_password = vo.getPassword();
String s_ci = vo.getMberCi();
System.out.println("======1========================"+s_password);
System.out.println("======1========================"+EgovNewPasswordUtil.hashPassword(s_password));
System.out.println("======1========================"+EgovFileScrty.encryptPassword(s_password, vo.getId()));
//step1.new 로그인인 경우 loginvo ret
//최고관리자를 제외한 사용자 sso 로그인으로 비밀번호 암호화 삭제(210818, 이준호)

View File

@ -5,18 +5,19 @@ import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.URLEncoder;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.script.ScriptEngineManager;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import kcc.ve.cmm.crt.CertPhoneResultUtill;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
@ -25,6 +26,8 @@ import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@ -189,6 +192,9 @@ public class EgovLoginController {
/** 구동 환경 */
@Value("#{property['Globals.prod.islocal']}")
private String environment;
@Resource(name = "certPhoneResultUtill")
private CertPhoneResultUtill certPhoneResultUtill;
/*
*//**
@ -725,28 +731,55 @@ public class EgovLoginController {
//일반 로그인이 아니므로 1로 세팅
loginVO.setPassword("1");
// 로그인 정보 check
// if (loginVO.getId() == null || loginVO.getPassword() == null) {
// SsoLoginVO SsoLoginSessionChk = (SsoLoginVO) session.getAttribute("SSOLoginVO");
// // SSOLoginVO 세션 체크
// if (SsoLoginSessionChk != null) {
//
// loginVO.setId(SsoLoginSessionChk.getMembId());
// loginVO.setPassword("1");
// } else {
// model.addAttribute("message", "로그인을 다시 해주세요.");
// // 로그인 페이지로 이동
// /*return "/web/kccadr/login/SsoLoginUsr";*/
// return "redirect:/web/user/login/ssoLogin.do";
// }
// }
if(StringUtil.isEmpty(loginVO.getMberCi())) {
String retInfo = request.getParameter("retInfo");
if(StringUtil.isEmpty(retInfo)) {
model.addAttribute("message", "로그인을 다시 해주세요.");
redirectAttributes.addAttribute("message", "로그인을 다시 해주세요.");
// 로그인 페이지로 이동
return "redirect:/web/user/login/ssoLogin.do";
}
// AES 복호화 설정 (AES/CBC/PKCS5Padding)
String reqkey = request.getSession().getAttribute("reqkey").toString();
String reqiv = request.getSession().getAttribute("reqiv").toString();
SecretKeySpec secureKey = new SecretKeySpec(reqkey.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(reqiv.getBytes("UTF-8")));
// Base64 디코딩 복호화 수행
byte[] cipherEnc = Base64.getDecoder().decode(retInfo);
String resData = new String(cipher.doFinal(cipherEnc), "UTF-8");
// 복호화된 결과를 다시 JSON으로 파싱
JSONParser parser2 = new JSONParser();
JSONObject jsonData = (JSONObject) parser2.parse(resData);
if(jsonData != null) {
System.out.println("===== 복호화된 결과 =====");
for(Object keyObj : jsonData.keySet()) {
String key2 = (String) keyObj;
Object value = jsonData.get(key2);
System.out.println(key2 + " = " + value);
}
} else {
System.out.println("복호화 실패: jsonData가 null 입니다.");
model.addAttribute("message", "로그인을 다시 해주세요.");
redirectAttributes.addAttribute("message", "로그인을 다시 해주세요.");
// 로그인 페이지로 이동
return "redirect:/web/user/login/ssoLogin.do";
}
loginVO.setMembName(jsonData.get("userName").toString());
loginVO.setMembCelnum(jsonData.get("celNo").toString());
loginVO.setSexCode(jsonData.get("gender").toString());
loginVO.setMembBirth(jsonData.get("birYMD").toString());
loginVO.setMberCi(jsonData.get("ci").toString());
// 기존에 있던 회원이 아니면 DB에 일련번호 저장
UserManageVO userManageVO = new UserManageVO();
userManageVO.setMberCi(loginVO.getMberCi());

View File

@ -0,0 +1,102 @@
package kcc.ve.cmm.crt;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.stereotype.Service;
import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.Base64;
@Service(value = "certPhoneRequestUtill")
public class CertPhoneRequestUtill {
public String getEncReqData( String key, String iv, String reqData ) throws Exception {
String reqInfo = "";
try {
SecretKey secureKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes()));
byte[] encrypted;
encrypted = cipher.doFinal(reqData.trim().getBytes());
reqInfo = Base64.getEncoder().encodeToString(encrypted);
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) getEncReqData Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
}
return reqInfo;
}
public String createSymmetricKey( String req_dtim, String req_no, String token_val ) throws Exception {
String symmetricKey = "";
String value = req_dtim.trim() + req_no.trim() + token_val.trim();
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA-256");
md.update(value.getBytes());
byte[] arrHashValue = md.digest();
symmetricKey = Base64.getEncoder().encodeToString(arrHashValue);
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) createSymmetricKey Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
}
return symmetricKey;
}
public byte[] hmac256( byte[] secretKey, byte[] message ) throws Exception {
byte[] hmac256 = null;
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec sks = new SecretKeySpec(secretKey, "HmacSHA256");
mac.init(sks);
hmac256 = mac.doFinal(message);
return hmac256;
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) hmac256 Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
}
}
public String getReqData( String id, String srvNo, String reqNum, String retUrl, String certDate, String certGb ) {
JSONObject msgMap = new JSONObject();
msgMap.put("id", id);
msgMap.put("srvNo", srvNo);
msgMap.put("reqNum", reqNum);
msgMap.put("retUrl", retUrl);
msgMap.put("certDate", certDate);
msgMap.put("certGb", certGb);
String reqData = msgMap.toJSONString();
return reqData;
}
//복호화
public JSONObject getResData( String req_info, String key, String iv ) throws Exception {
SecretKey secureKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher c;
String resData = "";
try {
c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes()));
/*byte[] cipherEnc = Base64.getDecoder().decode(encData);*/
byte[] cipherEnc = Base64.getDecoder().decode(req_info);
resData = new String(c.doFinal(cipherEnc), "utf-8");
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) getResData Exception : %s", e.getMessage()));
e.printStackTrace();
return null;
}
JSONParser parser = new JSONParser();
JSONObject jsonResData = (JSONObject) parser.parse(resData);
return jsonResData;
}
}

View File

@ -0,0 +1,355 @@
package kcc.ve.cmm.crt;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Service(value = "certPhoneResultUtill")
public class CertPhoneResultUtill {
public String createCryptoTokenUrl = "https://sciapi.siren24.com:52099/authentication/api/v1.0/common/crypto/token";
public String access_token = "994b5d96-3788-4239-a5b0-a0ba2e0cf089 ";
public String client_id = "5a2a72e2-16ce-420c-8816-57b3dda0e231";
public CertPhoneResultUtill() throws Exception {
}
public String certResult( HttpServletRequest request ) throws Exception {
String reqcryptotokenid = request.getParameter("crypto_token_id");
String integrity_value = request.getParameter("integrity_value");
System.out.println("crypto_token_id -> " + reqcryptotokenid);
System.out.println("integrity_value -> " + integrity_value);
String id = "SKIP001";
String url = "https://pcc.siren24.com/servlet/StoS";
// String reqInfo = certPhoneResultUtill.getReqData(id, crypto_token_id);
//
// String key = request.getSession().getAttribute("certPhoneKey").toString();
// String iv = request.getSession().getAttribute("certPhoneIv").toString();
// reqInfo = certPhoneResultUtill.getEncReqData(key, iv, reqInfo);
//암호화키 얻기
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String reqDate = sdf.format(currentDate);
String reqNo = "koipa_edu";
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String cryptoToken = callCreateCryptoTokenAPI(currentDate, reqNo);
JSONParser parser = new JSONParser();
JSONObject cryptoTokenJson = (JSONObject) parser.parse(cryptoToken);
JSONObject dataBody = (JSONObject) cryptoTokenJson.get("dataBody");
String crypto_token_id = (String) dataBody.get("crypto_token_id");
String token_val = (String) dataBody.get("crypto_token");
String reqInfo = getReqData(id, reqcryptotokenid);
String day = formatter.format(currentDate);
String symmetricKey = createSymmetricKey(day, reqNo, token_val);
String key = symmetricKey.substring(0, 16); // 데이터 암호화할 대칭키
String iv = symmetricKey.substring(symmetricKey.length() - 16, symmetricKey.length());// 데이터 암호화할 lnitail Vector
reqInfo = getEncReqData(key, iv, reqInfo);
//복호화
try {
RestTemplate restTemplate = new RestTemplate();
// 1. Header 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// 2. Body 생성
Map<String, Object> dataHeader = new HashMap<>();
dataHeader.put("CNTY_CD", "kr");
dataHeader.put("TRAN_ID", id);
Map<String, Object> dataBody2 = new HashMap<>();
dataBody2.put("crypto_token_id", crypto_token_id);
dataBody2.put("reqInfo", reqInfo);
dataBody2.put("integrity_value", integrity_value);
Map<String, Object> requestJson = new HashMap<>();
requestJson.put("dataHeader", dataHeader);
requestJson.put("dataBody", dataBody2);
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestJson, headers);
// 3. POST 요청 호출
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.POST,
entity,
String.class
);
System.out.println("Response: " + response.getBody());
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> json = mapper.readValue(response.getBody(), Map.class);
Map<String, Object> resDataBody = (Map<String, Object>) json.get("dataBody");
String retInfo = (String) resDataBody.get("RET_INFO");
// AES 복호화 설정 (AES/CBC/PKCS5Padding)
String reqkey = request.getSession().getAttribute("reqkey").toString();
String reqiv = request.getSession().getAttribute("reqiv").toString();
SecretKeySpec secureKey = new SecretKeySpec(reqkey.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(reqiv.getBytes("UTF-8")));
// Base64 디코딩 복호화 수행
byte[] cipherEnc = Base64.getDecoder().decode(retInfo);
String resData = new String(cipher.doFinal(cipherEnc), "UTF-8");
/*
===== 복호화된 결과 =====
Commid = KTM
reqNum = koipa_edu
gender = M
di = MC0GCCqGSIb3DQIJAyEAu7FiVqtM/qf7o/KlCxGNQtWWSEoxUzcLWNtM3gXU/hA=
ci = BWqlL7enYj5t2aDsrbvX97vk5wW2+MD08M6e7NtHI9GVeWfWioe8L2m7mheHWKht4uxDUC3k8xG81YgRnUP2lw==
celNo = 01030266269
fgnGbn = 1
certGb = H
userName = 이준호
ci2 = 00
result = Y
addVar =
certdate = 20251118123928
birYMD = 19890202
ciVersion = 1
utf8Name = %EC%9D%B4%EC%A4%80%ED%98%B8
id = SKIP001
===== 복호화된 결과 =====
Commid = LGT
reqNum = koipa_edu
gender = F
di = MC0GCCqGSIb3DQIJAyEAHq52+k0nurs/FS2kArC2+JTfs+3Xa8KPvSTY2WtgMDY=
ci = vDDZDokeyyUJ3i3jaktyXRVGib2XoZZUvp4Rb9tOOWg1sATqRChD4qRNSCaY78EKpsggJMZ/j6jwcLngkXxZtg==
celNo = 01057058729
fgnGbn = 1
certGb = H
userName = 정수빈
ci2 =
result = Y
addVar =
certdate = 20251118125047
birYMD = 19970829
ciVersion = 1
utf8Name = %EC%A0%95%EC%88%98%EB%B9%88
id = SKIP001
*/
return retInfo;
} catch(Exception e) {
System.out.println(e.getMessage());
return "fail";
}
}
public String callCreateCryptoTokenAPI( Date currentDate, String req_no ) throws Exception {
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
long current_timestamp = currentDate.getTime() / 1000;
String authorization = "bearer " + access_token;
Map<String, String> requestPropertyMap = new HashMap<>();
requestPropertyMap.put("Content-Type", "application/json");
requestPropertyMap.put("Authorization", authorization);
HttpURLConnection connection = getURLConnection(createCryptoTokenUrl, "POST", requestPropertyMap, true, false);
JSONObject dataHeader = new JSONObject();
dataHeader.put("lang_code", "kr");
JSONObject dataBody = new JSONObject();
dataBody.put("client_id", client_id);
dataBody.put("req_date", formatter.format(currentDate));
dataBody.put("req_no", req_no);
dataBody.put("enc_mode", "1");
JSONObject msgMap = new JSONObject();
msgMap.put("dataHeader", dataHeader);
msgMap.put("dataBody", dataBody);
String msg = msgMap.toJSONString();
if(send(connection.getOutputStream(), msg)) return "";
String receiveMsg = receive(connection.getInputStream());
return receiveMsg;
}
public String getEncReqData( String key, String iv, String reqData ) throws Exception {
String req_info = "";
try {
SecretKey secureKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes()));
byte[] encrypted;
encrypted = cipher.doFinal(reqData.trim().getBytes());
req_info = Base64.getEncoder().encodeToString(encrypted);
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) getEncReqData Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
}
return req_info;
}
public byte[] hmac256( byte[] secretKey, byte[] message ) throws Exception {
byte[] hmac256 = null;
try {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec sks = new SecretKeySpec(secretKey, "HmacSHA256");
mac.init(sks);
hmac256 = mac.doFinal(message);
return hmac256;
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) hmac256 Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
}
}
public String createSymmetricKey( String req_dtim, String req_no, String token_val ) throws Exception {
String symmetricKey = "";
String value = req_dtim.trim() + req_no.trim() + token_val.trim();
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA-256");
md.update(value.getBytes());
byte[] arrHashValue = md.digest();
symmetricKey = Base64.getEncoder().encodeToString(arrHashValue);
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) createSymmetricKey Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
}
return symmetricKey;
}
public Boolean send( OutputStream outputStream, String sendMsg ) throws Exception {
Boolean isFail = true;
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
bufferedWriter.write(sendMsg);
bufferedWriter.flush();
isFail = false;
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) send Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
} finally {
if(bufferedWriter != null) {
bufferedWriter.close();
}
}
return isFail;
}
private static HttpsURLConnection openHttps12( String urlStr ) throws Exception {
URL url = new URL(urlStr);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
SSLContext ctx = SSLContext.getInstance("TLSv1.2");
ctx.init(null, null, new SecureRandom());
conn.setSSLSocketFactory(ctx.getSocketFactory());
return conn;
}
public String receive( InputStream inputStream ) throws Exception {
String receiveMsg = "";
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
StringBuilder stringBuilder = new StringBuilder();
String inputLine;
while((inputLine = bufferedReader.readLine()) != null) {
stringBuilder.append(inputLine);
}
receiveMsg = stringBuilder.toString();
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) receive Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
} finally {
if(bufferedReader != null) {
bufferedReader.close();
}
}
return receiveMsg;
}
public HttpURLConnection getURLConnection( String urlStr, String method, Map<String, String> requestPropertyMap, Boolean isNeedOutput, Boolean isHttps ) throws Exception {
try {
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod(method);
connection.setDoInput(true);
if(isNeedOutput) connection.setDoOutput(true);
for(String key : requestPropertyMap.keySet()) {
connection.setRequestProperty(key, requestPropertyMap.get(key));
}
return connection;
} catch(Exception e) {
System.out.println(String.format("(APICERT)(ERR) getURLConnection Exception : %s", e.getMessage()));
e.printStackTrace();
throw e;
} finally {
}
}
public String getReqData( String id, String reqcryptotokenid ) {
JSONObject msgMap = new JSONObject();
msgMap.put("id", id);
msgMap.put("reqcryptotokenid", reqcryptotokenid);
String reqData = msgMap.toJSONString();
return reqData;
}
}

View File

@ -0,0 +1,188 @@
package kcc.ve.cmm.crt;
import com.fasterxml.jackson.databind.ObjectMapper;
import kcc.com.utl.user.service.CheckLoginUtil;
import org.springframework.http.*;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Controller
public class CertPhoneWebController {
// 첨부파일 정보
@Resource(name = "certPhoneRequestUtill")
private CertPhoneRequestUtill certPhoneRequestUtill;
// 첨부파일 정보
@Resource(name = "certPhoneResultUtill")
private CertPhoneResultUtill certPhoneResultUtill;
//로그인 체크 util
@Resource(name = "checkLoginUtil")
private CheckLoginUtil checkLoginUtil;
/**
* 본인인증
*/
@RequestMapping("/web/cmm/crt/certPhoneRequestAjax.do")
public ModelAndView certPhoneRequestAjax( HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
String result = "fail";
try {
String url = "https://sciapi.siren24.com:52099/authentication/api/v1.0/common/crypto/token";
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String reqDate = sdf.format(currentDate);
String reqNo = "koipa_edu";
String id = "SKIP001";
String clientId = "5a2a72e2-16ce-420c-8816-57b3dda0e231";
String srvNo = "001003";
String retUrl = "https://dev-ipedu-cert.iten.co.kr/ipedu/web/cmm/crt/certPhoneReturn.do";
// String retUrl = "https://dev-ipedu-cert.iten.co.kr/ipedu/web/user/login/actionSecurityLogin.do";
String accessToken = "994b5d96-3788-4239-a5b0-a0ba2e0cf089";
RestTemplate restTemplate = new RestTemplate();
// 1. Header 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "bearer " + accessToken);
// 2. Body 생성
Map<String, Object> dataHeader = new HashMap<>();
dataHeader.put("lang_code", "kr");
Map<String, Object> dataBody = new HashMap<>();
dataBody.put("client_id", clientId);
dataBody.put("req_date", reqDate);
dataBody.put("req_no", reqNo);
dataBody.put("enc_mode", "1");
Map<String, Object> requestJson = new HashMap<>();
requestJson.put("dataHeader", dataHeader);
requestJson.put("dataBody", dataBody);
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestJson, headers);
// 3. POST 요청 호출
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.POST,
entity,
String.class
);
System.out.println("Response: " + response.getBody());
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> json = mapper.readValue(response.getBody(), Map.class);
Map<String, Object> resDataBody = (Map<String, Object>) json.get("dataBody");
String cryptoTokenId = (String) resDataBody.get("crypto_token_id");
String cryptoToken = (String) resDataBody.get("crypto_token");
String reqInfo = certPhoneRequestUtill.getReqData(id
, srvNo
, reqNo
, "72" + retUrl
, reqDate
, "H"); //4번시트 5 본인확인 서비스 요청데이터 암호화 항목참조
String symmetricKey = certPhoneRequestUtill.createSymmetricKey(reqDate, reqNo, cryptoToken);
String key = symmetricKey.substring(0, 16);
String iv = symmetricKey.substring(symmetricKey.length() - 16, symmetricKey.length());
request.getSession().setAttribute("reqkey", key);
request.getSession().setAttribute("reqiv", iv);
reqInfo = certPhoneRequestUtill.getEncReqData(key, iv, reqInfo);
String hmacKey = symmetricKey.substring(0, 32);
byte[] hmacSha256 = certPhoneRequestUtill.hmac256(hmacKey.getBytes(), reqInfo.getBytes());
String integrityValue = Base64.getEncoder().encodeToString(hmacSha256);
String baseEncStr = Base64.getEncoder().encodeToString(hmacSha256);
modelAndView.addObject("reqInfo", reqInfo);
modelAndView.addObject("cryptoTokenId", cryptoTokenId);
modelAndView.addObject("integrityValue", integrityValue);
modelAndView.addObject("verSion", "3");
result = "success";
} catch(Exception ex) {
System.out.println(ex.getMessage());
}
modelAndView.addObject("result", result);
return modelAndView;
}
@RequestMapping("/web/cmm/crt/certPhoneReturn.do")
public String certPhoneReturn( HttpServletRequest request, ModelMap model ) throws Exception {
String retInfo = certPhoneResultUtill.certResult(request);
model.addAttribute("retInfo", retInfo);
return "web/kccadr/login/CertPhoneResultPop";
}
@RequestMapping("/web/cmm/crt/certPhoneRequestAjax_dev.do")
public ModelAndView certPhoneRequestAjax_dev( HttpServletRequest request ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("jsonView");
// 1. 클라이언트에서 넘어온 평문 JSON 문자열
String retInfo = request.getParameter("retInfo");
System.out.println("plain retInfo -> " + retInfo);
// 2. 세션에서 /IV 가져오기
String reqkey = request.getSession().getAttribute("reqkey").toString();
String reqiv = request.getSession().getAttribute("reqiv").toString();
// 3. AES 암호화 설정
SecretKeySpec secureKey = new SecretKeySpec(reqkey.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(reqiv.getBytes("UTF-8")));
// 4. 평문 JSON 문자열을 바이트로 변환 암호화
byte[] plainBytes = retInfo.getBytes("UTF-8");
byte[] cipherBytes = cipher.doFinal(plainBytes);
// 5. 암호문을 Base64 인코딩해서 최종 문자열로 변환
String encRetInfo = Base64.getEncoder().encodeToString(cipherBytes);
System.out.println("encrypted retInfo(Base64) -> " + encRetInfo);
// 필요하다면 응답에 포함
modelAndView.addObject("result", "success");
modelAndView.addObject("encRetInfo", encRetInfo);
return modelAndView;
}
}

View File

@ -0,0 +1,121 @@
package kcc.ve.cmm.sendAt;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class PpurioGlobalSet {
private static String id;
private static String pw;
private static String host;
private static String senderKey;
private static String templateCode1;
private static String templateCode2;
private static String templateCode3;
private static String templateCode4;
private static String templateCode5;
private static String templateCode6;
private static String from;
@Value("#{globalSettings['ppurio.id']}")
public void setId(String id) {
PpurioGlobalSet.id = id;
}
public static String getId() {
return id;
}
@Value("#{globalSettings['ppurio.pw']}")
public void setPw(String pw) {
PpurioGlobalSet.pw = pw;
}
public static String getPw() {
return pw;
}
@Value("#{globalSettings['ppurio.host']}")
public void setHost(String host) {
PpurioGlobalSet.host = host;
}
public static String getHost() {
return host;
}
@Value("#{globalSettings['ppurio.senderKey']}")
public void setSenderKey(String senderKey) {
PpurioGlobalSet.senderKey = senderKey;
}
public static String getSenderKey() {
return senderKey;
}
@Value("#{globalSettings['ppurio.templateCode1']}")
public void setTemplateCode1(String templateCode1) {
PpurioGlobalSet.templateCode1 = templateCode1;
}
public static String getTemplateCode1() {
return templateCode1;
}
@Value("#{globalSettings['ppurio.templateCode2']}")
public void setTemplateCode2(String templateCode2) {
PpurioGlobalSet.templateCode2 = templateCode2;
}
public static String getTemplateCode2() {
return templateCode2;
}
@Value("#{globalSettings['ppurio.templateCode3']}")
public void setTemplateCode3(String templateCode3) {
PpurioGlobalSet.templateCode3 = templateCode3;
}
public static String getTemplateCode3() {
return templateCode3;
}
@Value("#{globalSettings['ppurio.templateCode4']}")
public void setTemplateCode4(String templateCode4) {
PpurioGlobalSet.templateCode4 = templateCode4;
}
public static String getTemplateCode4() {
return templateCode4;
}
@Value("#{globalSettings['ppurio.templateCode5']}")
public void setTemplateCode5(String templateCode5) {
PpurioGlobalSet.templateCode5 = templateCode5;
}
public static String getTemplateCode5() {
return templateCode5;
}
@Value("#{globalSettings['ppurio.templateCode6']}")
public void setTemplateCode6(String templateCode6) {
PpurioGlobalSet.templateCode6 = templateCode6;
}
public static String getTemplateCode6() {
return templateCode6;
}
@Value("#{globalSettings['ppurio.from']}")
public void setFrom(String from) {
PpurioGlobalSet.from = from;
}
public static String getFrom() {
return from;
}
}

View File

@ -0,0 +1,89 @@
package kcc.ve.cmm.sendAt;
import java.io.Serializable;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @packageName : kcc.com.snd.service
* @templatecode
* @신청인_접수확인_1 :
* TEMPLATE_APP_JUBSU
* @chihwan : 없음
* @신청인_담당자배정_1 :
* TEMPLATE_APP_BAEJUNG
* @chihwan : "caseNo", "team", "examiner", "tel", "email"
* @양당사자_분쟁조정협의회 안건상정 :
* TEMPLATE_BOTH_SANGJUNG
* @chihwan : "caseNo", "cfrnc", "tel", "email"
* @양당사자_출석요구 n차 :
* TEMPLATE_BOTH_CHULSUK
* @chihwan : "caseNo", "nCha"
* @양당사자_통지 :
* TEMPLATE_BOTH_TONGJI
* @chihwan : "caseNo", "cfrnc"
* @신청인_보완요구 n차 :
* TEMPLATE_APP_BOWAN
* @chihwan : "caseNo", "nCha"
*
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SendAtVO implements Serializable {
private static final long serialVersionUID = 1L;
@JsonIgnore
private String accesstoken;
private String type;
@JsonIgnore
private String expired;
private String account;
private String refkey;
private String from;
private String to;
private Content content;
@JsonIgnore
private Map<String, String> chihwan;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Content {
private At at;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class At {
private String senderkey;
private String templatecode;
private String message;
}
}
public String toJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(this);
}
}

View File

@ -0,0 +1,52 @@
package kcc.ve.cmm.sendAt;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import java.util.List;
import java.util.Map;
public interface SendService {
/**
* @methodName : sendAt
* @author : JunHo Lee
* @date : 2024.12.09
* @description :
* @param to
* @param templateCode
* @param chihwan
*
* @packageName : kcc.com.snd.service
* @templatecode
* @신청인_접수확인_1 :
* TEMPLATE_APP_JUBSU
* @chihwan : 없음
* @신청인_담당자배정_2 :
* TEMPLATE_APP_BAEJUNG
* @chihwan : "respondent", "caseNo", "team", "examiner", "tel", "email"
* @양당사자_분쟁조정협의회 안건상정 :
* TEMPLATE_BOTH_SANGJUNG
* @chihwan : "caseNo", "cfrnc", "tel", "email"
* @양당사자_출석요구 n차 :
* TEMPLATE_BOTH_CHULSUK
* @chihwan : "caseNo", "nCha"
* @양당사자_통지 :
* TEMPLATE_BOTH_TONGJI
* @chihwan : "caseNo", "cfrnc"
* @신청인_보완요구 n차 :
* TEMPLATE_APP_BOWAN
* @chihwan : "caseNo", "nCha"
*
*/
void sendAt(String to, String templateCode, Map<String, String> chihwan) throws Exception;
Map<String, Object> sendSms(String to, String subject, String smsContent, String type) throws Exception;
SendSmsVO selectSendSet() throws Exception;
void updateSendSet(SendSmsVO sendSmsVO) throws Exception;
EgovMap selectTEMPLATE_APP_BAEJUNG(EgovMap egovMap) throws Exception;
List<EgovMap> selectTEMPLATE_BOTH_CHULSUK(EgovMap egovMap) throws Exception;
}

View File

@ -0,0 +1,24 @@
package kcc.ve.cmm.sendAt;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
public class SendSmsVO extends SendAtVO implements Serializable {
private static final long serialVersionUID = 1L;
private String subject;
private String smsContent;
private String atYn;
private String smsYn;
private String emailYn;
}

View File

@ -0,0 +1,38 @@
package kcc.ve.cmm.sendAt.impl;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import kcc.com.cmm.service.impl.EgovComAbstractDAO;
import kcc.ve.cmm.sendAt.SendAtVO;
import kcc.ve.cmm.sendAt.SendSmsVO;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository("sendDAO")
public class SendDAO extends EgovComAbstractDAO {
public SendAtVO selectToken() throws Exception{
return (SendAtVO) select("sendDAO.selectToken");
}
public void updateToken(SendAtVO SendAtVO) throws Exception{
update("sendDAO.updateToken", SendAtVO);
}
public SendSmsVO selectSendSet() throws Exception{
return (SendSmsVO) select("sendDAO.selectSendSet");
}
public void updateSendSet(SendSmsVO sendSmsVO) throws Exception{
update("sendDAO.updateSendSet", sendSmsVO);
}
public EgovMap selectTEMPLATE_APP_BAEJUNG(EgovMap egovMap) {
return (EgovMap) select("sendDAO.selectTEMPLATE_APP_BAEJUNG", egovMap);
}
public List<EgovMap> selectTEMPLATE_BOTH_CHULSUK(EgovMap egovMap) {
return (List<EgovMap>) list("sendDAO.selectTEMPLATE_BOTH_CHULSUK", egovMap);
}
}

View File

@ -0,0 +1,548 @@
package kcc.ve.cmm.sendAt.impl;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
import egovframework.rte.psl.dataaccess.util.EgovMap;
import kcc.ve.cmm.sendAt.SendAtVO.Content;
import kcc.ve.cmm.sendAt.SendAtVO.Content.At;
import kcc.ve.cmm.sendAt.PpurioGlobalSet;
import kcc.ve.cmm.sendAt.SendAtVO;
import kcc.ve.cmm.sendAt.SendService;
import kcc.ve.cmm.sendAt.SendSmsVO;
import org.apache.commons.beanutils.BeanUtils;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
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.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.*;
@Service("SendService")
public class SendServiceImpl extends EgovAbstractServiceImpl implements SendService {
@Resource(name="sendDAO")
private SendDAO sendDAO;
@Override
public void sendAt(
String to
, String templateCode
, Map<String, String> chihwan
) throws Exception{
SendAtVO vo = new SendAtVO();
vo = sendDAO.selectToken();
//이전 발급 토큰이 만료되었는지 시간비교
if(timeDiffBefore(vo.getExpired())) {
//토큰 발급
if(this.getPpurioToken(vo)) {
//토큰 갱신
sendDAO.updateToken(vo);
}else {
System.out.println("토큰 갱신 실패");
throw new Exception();
}
}
vo = vo.builder()
.accesstoken(vo.getAccesstoken())
.expired(vo.getExpired())
.refkey("test1234")
.type(vo.getType())
.to(to)
.content(Content.builder()
.at(SendAtVO.Content.At.builder()
.templatecode(templateCode)
.build()
)
.build()
)
.chihwan(chihwan)
.build()
;
this.sendAt(vo);
}
@Override
public Map<String, Object> sendSms(
String to
, String subject
, String smsContent
, String type
) throws Exception{
Boolean success = true;
int successCnt = 0;
SendAtVO vo = new SendAtVO();
vo = sendDAO.selectToken();
//이전 발급 토큰이 만료되었는지 시간비교
if(timeDiffBefore(vo.getExpired())) {
//토큰 발급
if(this.getPpurioToken(vo)) {
//토큰 갱신
sendDAO.updateToken(vo);
}else {
System.out.println("토큰 갱신 실패");
throw new Exception();
}
}
SendSmsVO smsVO = new SendSmsVO();
BeanUtils.copyProperties(smsVO, vo);
smsVO.setSubject(subject);
smsVO.setSmsContent(smsContent);
smsVO.setType(type);
String[] phoneNums = to.split(",");
for(String phone : phoneNums) {
smsVO.setTo(phone);
boolean result = this.sendSmsPrcs(smsVO);
if(result) {
successCnt++;
}else {
success = false;
System.out.println("문자 발송 실패: " + phone);
}
}
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("success" , success);
resultMap.put("successCnt" , successCnt);
return resultMap;
}
@Override
public SendSmsVO selectSendSet() throws Exception{
return sendDAO.selectSendSet();
}
@Override
public void updateSendSet(SendSmsVO sendSmsVO) throws Exception{
sendDAO.updateSendSet(sendSmsVO);
}
@Override
public EgovMap selectTEMPLATE_APP_BAEJUNG( EgovMap egovMap) throws Exception{
return sendDAO.selectTEMPLATE_APP_BAEJUNG(egovMap);
}
@Override
public List<EgovMap> selectTEMPLATE_BOTH_CHULSUK(EgovMap egovMap) throws Exception{
return sendDAO.selectTEMPLATE_BOTH_CHULSUK(egovMap);
}
/**
* @methodName : timeDiffBefore
* @author : JunHo Lee
* @date : 2024.12.09
* @description :
* @param str
* @return :
* !str이 현재 시간보다 이전이면 true
* !str이 현재 시간보다 이후이면 false
*/
private Boolean timeDiffBefore(String str) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date diffDate = sdf.parse(str);
Date currentDate = new Date();
if (diffDate.before(currentDate)) {
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
public static String sendAt(SendAtVO sendAtVO) {
StringBuffer result = new StringBuffer();
String input = null;
PpurioGlobalSet ppurioGlobalSet = new PpurioGlobalSet();
try {
/** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/
if(!ppurioGlobalSet.getHost().contains("https://api.bizppurio.com")) {
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[] chain, String authType) { }
public void checkServerTrusted(X509Certificate[] chain, String authType) { } } };
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
URL url = new URL(ppurioGlobalSet.getHost() + "/v3/message");
/** Connection 설정 **/
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("Accept-Charset", "UTF-8");
connection.addRequestProperty("Authorization", "Bearer " + sendAtVO.getAccesstoken());
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setConnectTimeout(15000);
/** Request **/
At at = sendAtVO.getContent().getAt();
at = messageSet(at, sendAtVO.getChihwan());
sendAtVO = sendAtVO.builder()
.account(ppurioGlobalSet.getId())
.refkey(sendAtVO.getRefkey())
.type("at")
.from(ppurioGlobalSet.getFrom())
.to(sendAtVO.getTo())
.content(Content.builder()
.at(At.builder()
.senderkey(ppurioGlobalSet.getSenderKey())
.templatecode(at.getTemplatecode())
.message(at.getMessage())
.build()
)
.build()
)
.build();
// Request body 전송
try (OutputStream os = connection.getOutputStream()) {
os.write(sendAtVO.toJson().getBytes("UTF-8"));
os.flush();
}
// 서버 응답 처리
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
while ((input = reader.readLine()) != null) {
result.append(input);
}
}
} else {
// 오류 응답 처리
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
StringBuilder errorResponse = new StringBuilder();
while ((input = reader.readLine()) != null) {
errorResponse.append(input);
}
System.out.println("Error Response: " + errorResponse.toString());
return "Error: " + errorResponse.toString();
}
}
connection.disconnect();
System.out.println("Response : " + result.toString());
JSONObject jObject = new JSONObject(result.toString());
// status = jObject.getString("description");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
// return status;
}
public static Boolean sendSmsPrcs(SendSmsVO sendSmsVO) {
Boolean success = true;
StringBuffer result = new StringBuffer();
String input = null;
PpurioGlobalSet ppurioGlobalSet = new PpurioGlobalSet();
try {
/** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/
if(ppurioGlobalSet.getHost().contains("https://api.bizppurio.com")) {
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[] chain, String authType) { }
public void checkServerTrusted(X509Certificate[] chain, String authType) { } } };
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
URL url = new URL(ppurioGlobalSet.getHost() + "/v3/message");
/** Connection 설정 **/
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("Accept-Charset", "UTF-8");
connection.addRequestProperty("Authorization", "Bearer " + sendSmsVO.getAccesstoken());
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setConnectTimeout(15000);
/*SMS LMS 구분처리*/
JSONObject sms = new JSONObject();
sms.put("message", sendSmsVO.getSmsContent());
if("LMS".equals(sendSmsVO.getType())) {
sms.put("subject", sendSmsVO.getSubject());
}
JSONObject content = new JSONObject();
if("SMS".equals(sendSmsVO.getType())) {
content.put("sms", sms);
}else {
content.put("lms", sms);
}
JSONObject json = new JSONObject();
json.put("account", ppurioGlobalSet.getId());
json.put("type", sendSmsVO.getType().toLowerCase());
json.put("from", "15881490");
json.put("to", sendSmsVO.getTo());
json.put("content", content);
json.put("refkey", "test1234");
String body = json.toString();
// Request body 전송
try (OutputStream os = connection.getOutputStream()) {
os.write(body.getBytes("UTF-8"));
os.flush();
}
// 서버 응답 처리
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"))) {
while ((input = reader.readLine()) != null) {
result.append(input);
}
}
} else {
// 오류 응답 처리
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), "UTF-8"))) {
StringBuilder errorResponse = new StringBuilder();
while ((input = reader.readLine()) != null) {
errorResponse.append(input);
}
System.out.println("Error Response: " + errorResponse.toString());
success = false;
//return "Error: " + errorResponse.toString();
}
}
connection.disconnect();
System.out.println("Response : " + result.toString());
JSONObject jObject = new JSONObject(result.toString());
// status = jObject.getString("description");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
success = false;
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
success = false;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
success = false;
}
return success;
// return status;
}
public static Boolean getPpurioToken(SendAtVO sendAtVO) {
StringBuffer result = new StringBuffer();
String input = null;
PpurioGlobalSet ppurioGlobalSet = new PpurioGlobalSet();
try {
/** SSL 인증서 무시 : 비즈뿌리오 API 운영을 접속하는 경우 해당 코드 필요 없음 **/
if(ppurioGlobalSet.getHost().contains("https://api.bizppurio.com")) {
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[] chain, String authType) { }
public void checkServerTrusted(X509Certificate[] chain, String authType) { } } };
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
URL url = new URL(ppurioGlobalSet.getHost() + "/v1/token");
/** Connection 설정 **/
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("Accept-Charset", "UTF-8");
//Base64 인코딩
String idpw = ppurioGlobalSet.getId() + ":" + ppurioGlobalSet.getPw();
String authData = Base64.getEncoder().encodeToString(idpw.getBytes());
connection.addRequestProperty("Authorization", "Basic " + authData);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setConnectTimeout(15000);
/** Request **/
OutputStream os = connection.getOutputStream();
os.flush();
/** Response **/
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
while ((input = in.readLine()) != null) {
result.append(input);
}
connection.disconnect();
if (result.length() > 0) {
JSONObject jObject = new JSONObject(result.toString());
if (
jObject.has("accesstoken")
&& !jObject.isNull("accesstoken")
&& jObject.has("type")
&& !jObject.isNull("type")
&& jObject.has("expired")
&& !jObject.isNull("expired")
) {
sendAtVO.setAccesstoken(jObject.getString("accesstoken"));
sendAtVO.setType(jObject.getString("type"));
sendAtVO.setExpired(jObject.getString("expired"));
} else {
System.out.println("response data not found or is null");
return false;
}
} else {
System.out.println("Empty response");
return false;
}
} catch (IOException e) {
System.out.println(e.getMessage());
return false;
} catch (KeyManagementException e) {
System.out.println(e.getMessage());
return false;
} catch (NoSuchAlgorithmException e) {
System.out.println(e.getMessage());
return false;
}
return true;
}
private static At messageSet(
At at,
Map<String, String> chihwan
) {
String content = "";
Map<String, String[]> requiredPlaceholders = new HashMap<>();
switch (at.getTemplatecode()) {
case "TEMPLATE_APP_JUBSU": // 신청인_접수확인_1
at.setTemplatecode("bizp_2024112810423519814410026");
content = "[한국공정거래조정원] \r\n"
+ "귀사(하)의 조정신청이 접수 완료되었습니다.\r\n"
+ "향후 담당부서 및 담당자가 배정될 예정입니다.";
break;
case "TEMPLATE_APP_BAEJUNG": // 신청인_담당자배정_2
// at.setTemplatecode("bizp_2024112810423516931294012");
at.setTemplatecode("bizp_2024121915475924487679960");
content = "[한국공정거래조정원]\r\n"
+ "귀사(하)가 #{respondent}을(를) 상대로 신청한 사건의 사건번호는 #{caseNo}, 담당자는 #{team}팀 #{examiner} 조사관(유선전화:#{tel}, 메일주소 #{email})입니다.\r\n"
+ "향후 담당 조사관이 공문 등을 통해 연락드릴 예정입니다.";
requiredPlaceholders.put(at.getTemplatecode(), new String[]{"respondent","caseNo", "team", "examiner", "tel", "email"});
break;
case "TEMPLATE_BOTH_SANGJUNG": // 양당사자_분쟁조정협의회 안건상정
at.setTemplatecode("bizp_2024112810492919814837182");
content = "[한국공정거래조정원]\r\n"
+ "귀사(하)가 진행 중인 분쟁조정 사건 [사건번호 #{caseNo}]이 향후 개최될 #{cfrnc}분쟁조정협의회에 상정될 예정입니다.\r\n"
+ "#{cfrnc}분쟁조정협의회 기일은 담당 조사관(유선전화:#{tel}, 메일주소 #{email})에게 문의주시면 안내드리겠습니다.";
requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "cfrnc", "tel", "email"});
break;
case "TEMPLATE_BOTH_CHULSUK": // 양당사자_출석요구 n차
// at.setTemplatecode("bizp_2024112810492916931760451");
at.setTemplatecode("bizp_2025011515420924487914030");
content = "[한국공정거래조정원]\r\n"
+ "귀사(하)가 진행 중인 분쟁조정 사건 [사건번호 #{caseNo}]의 출석조사(#{nCha}차) 기일이 확정되었습니다. \r\n"
+ "향후 담당 조사관이 공문 등을 통해 연락드릴 예정입니다. \r\n"
+ "https://fairnet.kofair.or.kr";
requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "nCha"});
break;
case "TEMPLATE_BOTH_TONGJI": // 양당사자_통지
// at.setTemplatecode("bizp_2024112810492916931854671");
at.setTemplatecode("bizp_2025011515425124487733149");
content = "[한국공정거래조정원]\r\n"
+ "귀사(하)가 진행 중인 분쟁조정 사건 [사건번호 #{caseNo}]에 대한 #{cfrnc}분쟁조정협의회 의결이 완료되었습니다.\r\n"
+ "한국공정거래조정원 분쟁조정사건처리시스템에서 확인해주시기 바랍니다.\r\n"
+ "https://fairnet.kofair.or.kr";
requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "cfrnc"});
break;
case "TEMPLATE_APP_BOWAN": // 신청인_보완요구 n차
// at.setTemplatecode("bizp_2024112810522719814540186");
at.setTemplatecode("bizp_2025011515404892092190436");
content =
"[한국공정거래조정원]\r\n"
+ "귀사(하)가 신청한 분쟁조정 신청사건(사건번호 #{caseNo})에 대한 보완(#{nCha}차)이 필요합니다.\r\n"
+ "향후 담당 조사관이 공문 등을 통해 연락드릴 예정입니다. \r\n"
+ "https://fairnet.kofair.or.kr";
requiredPlaceholders.put(at.getTemplatecode(), new String[]{"caseNo", "nCha"});
break;
}
String[] placeholders = requiredPlaceholders.get(at.getTemplatecode());
if (placeholders != null) {
for (String placeholder : placeholders) {
String value = chihwan.get(placeholder);
if (value == null || value.isEmpty()) {
throw new IllegalArgumentException(placeholder + " 값이 없습니다.");
}
content = content.replace("#{" + placeholder + "}", value);
}
}
at.setMessage(content);
return at;
}
}

View File

@ -6,16 +6,7 @@ import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.*;
import java.util.stream.Collectors;
import javax.activation.DataHandler;
@ -394,8 +385,18 @@ public class MainController {
@RequestMapping(value = "/web/main/mainPage.do")
public String siteMainPage(HttpServletRequest request, ModelMap model, HttpSession session) throws Exception{
//메인이미지
try {
// 문자열을 바이트로 변환하고 Base64로 인코딩합니다.
byte[] encodedBytes = Base64.getEncoder().encode("5a2a72e2-16ce-420c-8816-57b3dda0e231:75f6288bae324cd6bd112e82d693aa01".getBytes());
// 바이트 배열을 다시 문자열로 변환하여 출력합니다.
String encodedString = new String(encodedBytes);
System.out.println("encodedString :: " + encodedString);
/** 메인존 */
model.addAttribute("mainzoneList", mainZone()); //PC

View File

@ -896,7 +896,7 @@ function set_bbs(){
<span id="BBSNameSpan" style="color: blue"></span>
<span id="showUrl" style="display: none;" >
<br>
URL <input type="text" name="url" id="url" size="90"/>
URL <input type="text" name="url" id="url" size="50"/>
<input type="hidden" id="url_tmp" name="url_tmp"/>
</span>
</td>

View File

@ -108,14 +108,14 @@ function fn_popupzone_update(method_parm) {
frm = document.writeForm;
frm.action = "<c:url value='/uss/ion/pwm/popupzoneInsert.do'/>";
if(fn_checkForm(1))
goSave(method_parm)
goSave(method_parm);
}
/* 글 등록 function */
function fn_popupzone_insert(method_parm) {
frm = document.writeForm;
frm.action = "<c:url value='/uss/ion/pwm/popupzoneInsert.do'/>";
if(fn_checkForm(1))
goSave(method_parm)
goSave(method_parm);
}
/* 배너 삭제 function */

View File

@ -1,47 +1,7 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- <script type="text/javaScript" language="javascript" defer="defer">
function footerSiteLinkPageGo (){
/* var site = $('#footerSite').val();
if(site == ""){
alert("사이트를 선택해 주세요")
}else{
window.open(site);
} */
var url = $("#site_select").val();
if (url == ""){
alert("사이트를 선택해 주세요");
}
else if (url == "SITE005" ) {
// 디지털 저작권 거래소
$('#usrModifyForm').attr("action","https://www.kdce.or.kr/user/main.do");
$('#usrModifyForm').submit();
} else if (url == "SITE006" ) {
// 권리자 찾기
$('#usrModifyForm').attr("action","https://www.findcopyright.or.kr/ssoMain.do");
$('#usrModifyForm').submit();
} else if (url == "SITE007" ) {
// OLIS 오픈소스SW 라이선스
$('#usrModifyForm').attr("action","https://www.olis.or.kr/membership/ssoOlisLogin.do");
$('#usrModifyForm').submit();
} else if (url == "SITE008" ) {
// 공유마당
$('#usrModifyForm').attr("action","https://gongu.copyright.or.kr/gongu/member/user/ssoLogin.do");
$('#usrModifyForm').submit();
} else if (url == "SITE009" ) {
// 저작권 인증
$('#usrModifyForm').attr("action","https://cras.copyright.or.kr/front/right/comm/ssoLoginMain.do");
$('#usrModifyForm').submit();
} else {
window.open(url);
}
}
</script> -->
<footer>
<div class="area_top">
<div class="inner">
<ul>
@ -51,11 +11,11 @@ function footerSiteLinkPageGo (){
<li><a href="https://www.koipa.re.kr/home/content.do?menu_cd=000008" target="_blank" title="새창열림">찾아오시는 길 <i></i></a></li>
</ul>
<ul class="sns">
<li><a href="https://www.youtube.com/user/kipracafe" target="_blank" title="새창열림"><img src="/ipedu/visitEdu/usr/publish/images/common/sns_youtube.png" alt=""></a></li>
<li><a href="https://blog.naver.com/koipa_ip" target="_blank" title="새창열림"><img src="/ipedu/visitEdu/usr/publish/images/common/sns_blog.png" alt=""></a></li>
<li><a href="https://www.instagram.com/koipa_ip/" target="_blank" title="새창열림"><img src="/ipedu/visitEdu/usr/publish/images/common/sns_insta.png" alt=""></a></li>
<li><a href="https://www.facebook.com/koipa.ip/" target="_blank" title="새창열림"><img src="/ipedu/visitEdu/usr/publish/images/common/sns_facebook.png" alt=""></a></li>
<li><a href="https://twitter.com/ip_protection" target="_blank" title="새창열림"><img src="/ipedu/visitEdu/usr/publish/images/common/sns_twitter.png" alt=""></a></li>
<li><a href="https://www.youtube.com/user/kipracafe" target="_blank" title="새창열림"><img src="${pageContext.request.contextPath}/visitEdu/usr/publish/images/common/sns_youtube.png" alt=""></a></li>
<li><a href="https://blog.naver.com/koipa_ip" target="_blank" title="새창열림"><img src="${pageContext.request.contextPath}/visitEdu/usr/publish/images/common/sns_blog.png" alt=""></a></li>
<li><a href="https://www.instagram.com/koipa_ip/" target="_blank" title="새창열림"><img src="${pageContext.request.contextPath}/visitEdu/usr/publish/images/common/sns_insta.png" alt=""></a></li>
<li><a href="https://www.facebook.com/koipa.ip/" target="_blank" title="새창열림"><img src="${pageContext.request.contextPath}/visitEdu/usr/publish/images/common/sns_facebook.png" alt=""></a></li>
<li><a href="https://twitter.com/ip_protection" target="_blank" title="새창열림"><img src="${pageContext.request.contextPath}/visitEdu/usr/publish/images/common/sns_twitter.png" alt=""></a></li>
</ul>
</div>
</div>

View File

@ -89,7 +89,7 @@
if (event.persisted || (window.performance && window.performance.navigation.type == 2)) {
} else { // 새 페이지 열릴 시
// 등록, 수정, 삭제, 실패 등 페이지 처리 완료 후 메세지
<c:if test="${!empty message}">alert("${message}");</c:if>
<%-- <c:if test="${!empty message}">alert("${message}");</c:if>--%>
}
}
function isMobile(){

View File

@ -0,0 +1,11 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<script type="text/javascript">
$(document).ready(function(){
opener.document.loginForm.retInfo.value = '<c:out value="${retInfo}"/>';
opener.actionLogin();
self.close();
});
</script>

View File

@ -1,90 +0,0 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<script type="text/javascript">
function press(event) {
if (event.keyCode == 13)
actionLogin();
}
function sessionRegist() {
/* if (document.loginForm.id_text.value =="") {
alert("아이디를 입력하세요");
return;
} else if (document.loginForm.password_text.value =="") {
alert("비밀번호를 입력하세요");
return;
} else { */
//개발 완료시 삭제영역
/* const str = $("#devIdSelect").val();
const arr = str.split("/");
$("#id_text").val(arr[0]);
$("#password_text").val(arr[1]);
//개발완료시 삭제 영역 끝
var id = $("#id_text").val();
var pw = $("#password_text").val();
$("#id").val(id);
$("#password").val(pw); */
document.ssoLoginVO.action = "<c:url value='/web/user/login/ssoSessionRegist.do'/>";
document.ssoLoginVO.submit();
}
</script>
<form:form id="ssoLoginVO" name="ssoLoginVO" method="post" action="/web/user/login/ssoSessionRegist.do">
<input type="hidden" name="membSeq" id="membSeq" value="<c:out value='${membSeq}'/>">
<input type="hidden" name="membSmsRecpYn" id="membSmsRecpYn" value="Y">
<input type="hidden" name="error" id="error" value="0000">
<input type="hidden" name="membCi" id="BWqlL7enYj5t2aDsrbvX97vk5wW2+MD08M6e7NtHI9GVeWfWioe8L2m7mheHWKht4uxDUC3k8xG81YgRnasdlw==">
<input type="hidden" name="membEmailRecpYn" id="membEmailRecpYn" value="Y">
<!-- cont -->
<div class="cont_wrap login_cont" id="sub">
<div class="inner">
<div class="cont_tit">
<h2>로그인</h2>
</div>
<fieldset>
<div class="login_wrap">
<p class="login_tit">
<span>세션등록</span> 해주세요
</p>
<p class="login_tit">
<span>외부개발자용 세션등록은 <br>세션에서 SSO로그인과 같이 개인정보를 가져오기 위함입니다.<br>모든 입력은 필수입니다.<br></span>
</p>
<div class="login_form">
이름 :
<input type="text" name="membName" id="membName" value="김고객" style="width: 50%;">
</br>
아이디(XXXX@XXXX.XXX) :
<input type="text" name="membId" id="membId" value="daeneg" style="width: 50%;">
</br>
성별(M,W) :
<input type="text" name="sexCode" id="sexCode" value="M" style="width: 50%;">
</br>
이메일(XXXXX@XXX.XXX) :
<input type="text" name="membEmail" id="membEmail" value="daenge@daenge.com" style="width: 50%;">
</br>
휴대폰번호(XXX-XXXX-XXXX) :
<input type="text" name="membCelnum" id="membCelnum" value="010-1231-1212" style="width: 50%;">
</br>
생년월일(YYYY-MM-DD) :
<input type="text" name="membBirth" id="membBirth" value="19881210" style="width: 50%;">
</br>
<div class="btn_wrap">
<button type="button" onclick="javascript:sessionRegist();" class="btn_login">SSO로그인 세션 등록</button>
</div>
<div class="login_util"></div>
</div>
</div>
</fieldset>
</div>
</div>
<!-- //cont -->
</form:form>

View File

@ -4,6 +4,11 @@
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%>
<%
String profile = System.getProperty("spring.profiles.active");
request.setAttribute("profile", profile);
%>
<style>
.snb {width:0px}
</style>
@ -14,21 +19,85 @@ $(document).ready(function(){
}
});
function login() {
if($('#devIdSelect').val() != ""){
const str = $("#devIdSelect").val();
const arr = str.split(":");
$("#membName").val(arr[0]);
$("#membCelnum").val(arr[1]);
$("#sexCode").val(arr[2]);
$("#membBirth").val(arr[3]);
$("#mberCi").val(arr[4]);
$("#isSelect").val("Y");
actionLogin();
<c:if test="${profile eq 'tLocal'}">
function devLogin() {
if ($('#devIdSelect').val() != "") {
const str = $("#devIdSelect").val();
const arr = str.split(":");
// ➊ retInfo 평문 문자열 생성
let retInfoStr =
'{' +
'"Commid":"KTM",' +
'"reqNum":"koipa_edu",' +
'"gender":"' + arr[2] + '",' +
'"di":"MC0GCCqGSIb3DQIJAyEAu7FiVqtM/qf7o/KlCxGNQtWWSEoxUzcLWNtM3gXU/hA=",' +
'"ci":"' + arr[4] + '",' +
'"celNo":"' + arr[1] + '",' +
'"fgnGbn":"1",' +
'"certGb":"H",' +
'"userName":"' + arr[0] + '",' +
'"ci2":"00",' +
'"result":"Y",' +
'"addVar":"",' +
'"certdate":"20251118141526",' +
'"birYMD":"' + arr[3] + '",' +
'"ciVersion":"1",' +
'"utf8Name":"' + encodeURIComponent(arr[0]) + '",' +
'"id":"SKIP001"' +
'}';
// loginForm에 우선 평문 retInfo 세팅
document.loginForm.retInfo.value = retInfoStr;
// ➋ 첫 번째 AJAX: reqInfo, crypto_token_id 등 세팅
$.ajax({
type: "POST",
url: "<c:url value='/web/cmm/crt/certPhoneRequestAjax.do'/>",
dataType: 'json',
success: function (returnData) {
if (returnData.result === 'success') {
document.reqPCCForm.reqInfo.value = returnData.reqInfo;
document.reqPCCForm.crypto_token_id.value = returnData.cryptoTokenId;
document.reqPCCForm.integrity_value.value = returnData.integrityValue;
document.reqPCCForm.verSion.value = returnData.verSion;
// ➌ 첫 번째 AJAX 성공 후, 두 번째 AJAX 호출
$.ajax({
type: "POST",
url: "<c:url value='/web/cmm/crt/certPhoneRequestAjax_dev.do'/>",
data: $("#loginForm").serialize(), // retInfo 포함해서 전송
dataType: "json",
success: function (devData) {
console.log("응답:", devData.result);
console.log("encRetInfo:", devData.encRetInfo);
// 서버에서 암호화한 문자열로 다시 세팅
document.loginForm.retInfo.value = devData.encRetInfo;
// ➍ 모든 준비 끝났으니 이제 실제 로그인 submit
actionLogin();
},
error: function (e) {
console.log("오류:", e);
alert("retInfo 암호화 중 오류가 발생했습니다.");
}
});
} else {
alert("f5를 눌러 다시 시도해주세요.");
}
},
error: function (e) {
alert("요청 오류가 발생했습니다.");
console.log("ERROR: ", e);
}
});
}
}
</c:if>
@ -36,18 +105,56 @@ function actionLogin() {
document.loginForm.action="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
document.loginForm.submit();
}
function certPhone() {
$.ajax({
type: "POST",
url: "<c:url value='/web/cmm/crt/certPhoneRequestAjax.do'/>",
dataType: 'json',
success: function (returnData) {
if (returnData.result === 'success') {
document.reqPCCForm.reqInfo.value = returnData.reqInfo;
document.reqPCCForm.crypto_token_id.value = returnData.cryptoTokenId;
document.reqPCCForm.integrity_value.value = returnData.integrityValue;
document.reqPCCForm.verSion.value = returnData.verSion;
openPCCWindow();
} else {
alert("f5를 눌러 다시 시도해주세요.");
}
},
error: function (e) {
alert("요청 오류가 발생했습니다.");
console.log("ERROR: ", e);
}
});
}
var PCC_window;
function openPCCWindow(){
var PCC_window = window.open('', 'PCCV3Window', 'width=400, height=630, resizable=1, scrollbars=no, status=0, titlebar=0, toolbar=0, left=300, top=200' );
// iframe형식으로 개발하시지 말아주십시오. iframe으로 개발 시 나오는 문제는 개발지원해드리지 않습니다.
if(PCC_window == null){
alert(" ※ 윈도우 XP SP2 또는 인터넷 익스플로러 7 사용자일 경우에는 \n 화면 상단에 있는 팝업 차단 알림줄을 클릭하여 팝업을 허용해 주시기 바랍니다. \n\n※ MSN,야후,구글 팝업 차단 툴바가 설치된 경우 팝업허용을 해주시기 바랍니다.");
}
//창을 오픈할때 크롬 및 익스플로어 양쪽 다 테스트 하시길 바랍니다.
document.reqPCCForm.action = 'https://pcc.siren24.com/pcc_V3/jsp/pcc_V3_j10_v4.jsp';
document.reqPCCForm.target = 'PCCV3Window';
document.reqPCCForm.submit();
return true;
}
</script>
<div class="cont_wrap" id="sub" style="width: 100%">
<form:form id="loginForm" name="loginForm" method="post" action="/web/user/login/actionSecurityLogin.do">
<input type="hidden" name="beforeUrl" value='<c:out value="${beforeUrl}"></c:out>' />
<input type="hidden" name="userSe" value="GNR" />
<input type="hidden" id="membName" name="membName">
<input type="hidden" id="membCelnum" name="membCelnum">
<input type="hidden" id="sexCode" name="sexCode">
<input type="hidden" id="membBirth" name="membBirth">
<input type="hidden" id="mberCi" name="mberCi">
<input type="hidden" id="retInfo" name="retInfo" value="">
<div class="cont_tit">
<h2>로그인</h2>
<div class="sns_go">
@ -57,25 +164,14 @@ function actionLogin() {
</div>
<div class="login_wrap">
<c:if test="${profile eq 'tLocal'}">
<p class="login_tit">
본인인증 로그인</br>
<span>사이트 오픈 시 셀렉트 박스를 통한 로그인은 삭제됩니다.</span>
</p>
<select id="devIdSelect" style="width: 400px; height: 30px;" onchange="login()">
<select id="devIdSelect" style="width: 400px; height: 30px;" onchange="devLogin()">
<option value="">로그인할 아이디를 선택해주세요.</option>
<!-- <option value="USRCNFRM_00000002613:1">개발팀 사용자(USRCNFRM_00000002613)_일반사용자1</option>
<option value="USRCNFRM_00000002720:1">개발팀 사용자(USRCNFRM_00000002720)_일반사용자2</option>
<option value="USRCNFRM_00000002650:1">기소유예사용자 1 (USRCNFRM_00000002650)_기소유예사용자 1</option>
<option value="USRCNFRM_00000002970:1">기소유예사용자 2 (USRCNFRM_00000002970)_기소유예사용자 2</option>
<option value="USRCNFRM_00000003070:1">기소유예사용자 3 (USRCNFRM_00000003070)_기소유예사용자 3</option>
<option value="USRCNFRM_00000002930:1">기소유예사용자 4 (USRCNFRM_00000002930)_기소유예사용자 4</option>
<option value="USRCNFRM_00000003080:1">기소유예사용자 5 (USRCNFRM_00000003080)_기소유예사용자 5</option>
<option value="USRCNFRM_00000002960:1">기소유예사용자 6 (USRCNFRM_00000002960)_기소유예사용자 6</option>
<option value="USRCNFRM_00000002943:1">기소유예사용자 7 (USRCNFRM_00000002943)_기소유예사용자 7</option>
<option value="USRCNFRM_00000002942:1">기소유예사용자 8 (USRCNFRM_00000002942)_기소유예사용자 8</option>
<option value="USRCNFRM_00000002941:1">기소유예사용자 9 (USRCNFRM_00000002941)_기소유예사용자 9</option>
<option value="USRCNFRM_00000002872:1">기소유예사용자 10 (USRCNFRM_00000002872)_기소유예사용자 10</option> -->
<option value="홍길동:01012345678:M:19890202:AwekrDfuErjWrj/DSjfsduerlkrkjweR+DJfisdfioueklrjiJeudsdWErQWERasdvDASgfeRTdsioufiuERwe==">홍길동:01012345678:M:19890202</option>
<option value="엄길동:01011112222:M:20061230:BwekrDfuErjWrj/DSjfsduerlkrkjweR+DJfisdfioueklrjiJeudsdWErQWERasdvDASgfeRTdsioufiuERwe==">엄길동:01011112222:M:20061230</option>
<option value="이길동:01033334444:W:19580301:CwekrDfuErjWrj/DSjfsduerlkrkjweR+DJfisdfioueklrjiJeudsdWErQWERasdvDASgfeRTdsioufiuERwe==">이길동:01033334444:W:19580301</option>
@ -86,11 +182,18 @@ function actionLogin() {
<option value="이준호:01030266269:M:19890202:HwekrDfuErjWrj/DSjfsduerlkrkjweR+DJfisdfioueklrjiJeudsdWErQWERasdvDASgfeRTdsioufiuERwe==">이준호:01030266269:M:19890202</option>
</select>
<br></br>
</c:if>
<div class="login_form">
<div class="login_btn_wrap">
<button type="button" onclick="javascript:actionLogin();" class="btn_login">본인인증</button>
<button type="button" onclick="javascript:certPhone();" class="btn_login">본인인증</button>
</div>
</div>
</div>
</form:form>
<form name="reqPCCForm" id="reqPCCForm" method="post" action="https://pcc.siren24.com/pcc_V3/jsp/pcc_V3_j10_v4.jsp" onsubmit="return openPCCWindow()">
<input type="hidden" id="crypto_token_id" name="crypto_token_id" value="">
<input type="hidden" id="integrity_value" name="integrity_value" value="">
<input type="hidden" id="reqInfo" name="reqInfo" value="">
<input type="hidden" id="verSion" name="verSion" value="">
</form>
</div>

View File

@ -1,82 +0,0 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<script type="text/javascript">
function press(event) { if (event.keyCode == 13) actionLogin(); }
function actionLogin() {
/* if (document.loginForm.id_text.value =="") {
alert("아이디를 입력하세요");
return;
} else if (document.loginForm.password_text.value =="") {
alert("비밀번호를 입력하세요");
return;
} else { */
//개발 완료시 삭제영역
const str = $("#devIdSelect").val();
const arr = str.split("/");
$("#id_text").val(arr[0]);
$("#password_text").val(arr[1]);
$("#membSeq").val(arr[2]);
//개발완료시 삭제 영역 끝
var id = $("#id_text").val();
var pw = $("#password_text").val();
$("#id").val(id);
$("#password").val(pw);
document.loginForm.action="<c:url value='/web/user/login/actionSecurityLogin2.do'/>";
document.loginForm.submit();
}
</script>
<form:form id="loginForm" name="loginForm" method="post" action="/web/user/login/actionSecurityLogin2.do">
<input type="hidden" name="beforeUrl" value='<c:out value="${beforeUrl}"></c:out>'/>
<input type="hidden" name="userSe" value="GNR"/>
<input type="hidden" id="id" name="id">
<input type="hidden" id="password" name="password">
<input type="hidden" id="membSeq" name="membSeq">
<!-- cont -->
<div class="cont_wrap login_cont" id="sub" style="width: 100%">
<div class="inner">
<div class="cont_tit">
<h2>로그인</h2>
</div>
<fieldset>
<div class="login_wrap">
<p class="login_tit"><span>로그인</span> 해주세요</p>
<p class="login_tit"><span>외부개발자용 로그인은 <br>셀렉트박스에서 아이디를 선택해 주세요.<br>(개발편의를 위한 아이디 셀렉트 박스)<br>*로그인 후 세션 등록을 꼭 해주세요.</span></p>
아이디 선택 : <select id="devIdSelect" style="width: 400px; height: 30px;">
<option value="USRCNFRM_00000002940/1/1">아이디1(USRCNFRM_00000002940) 담당자</option>
<option value="USRCNFRM_00000002941/1/2">아이디2(USRCNFRM_00000002941) 사용자</option>
<option value="USRCNFRM_00000002942/1/3">아이디3(USRCNFRM_00000002942) 사용자</option>
<option value="USRCNFRM_00000002943/1/4">아이디4(USRCNFRM_00000002943) 사용자</option>
<option value="USRCNFRM_00000002944/1/5">아이디5(USRCNFRM_00000002944) 담당자</option>
<option value="USRCNFRM_00000002550/1/6">아이디6(USRCNFRM_00000002550) 담당자</option>
<option value="USRCNFRM_00000002542/1/7">아이디7(USRCNFRM_00000002542) 사용자</option>
<option value="USRCNFRM_00000002541/1/8">아이디8(USRCNFRM_00000002541) 사용자</option>
<option value="USRCNFRM_00000002540/1/9">아이디9(USRCNFRM_00000002540) 담당자</option>
<option value="USRCNFRM_00000002533/1/10">아이디10(USRCNFRM_00000002533) 담당자</option>
</select><br></br>
<div class="login_form">
<input type="text" id="id_text" placeholder="아이디를 입력해주세요" readonly="readonly">
<input type="password" id="password_text" placeholder="비밀번호를 입력해주세요" readonly="readonly">
<div class="btn_wrap">
<button type="button" onclick="javascript:actionLogin();" class="btn_login">로그인</button>
<button type="button" onclick="window.open('<c:out value='${joinUrl}'/>')" title="새창열림" class="btn_join">회원가입</button>
</div>
<div class="login_util">
<a href="#" target="_blank" title="새창열림" onclick="javascript:usrIdPassFind('id')">아이디 찾기</a>
<a href="#" target="_blank" title="새창열림" onclick="javascript:usrIdPassFind('pass')">비밀번호 찾기</a>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<!-- //cont -->
</form:form>

View File

@ -1,289 +0,0 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="kc" uri="/WEB-INF/tlds/kcc_tld.tld"%>
<script type="text/javascript">
$(document).ready(function(){
if(${message != null}){
alert('${message}');
}
});
function press(event) { if (event.keyCode == 13) actionLogin(); }
function login() {
if($('#devIdSelect').val()!=""){
var id = ($('#devIdSelect').val()).split(':');
$("#id_text").val(id[0]);
$("#password_text").val(id[1]);
$("#id").val(id[0]);
$("#password").val(id[1]);
$("#isSelect").val("Y");
document.loginForm.action="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
document.loginForm.submit();
}
}
function actionLogin() {
/* if (document.loginForm.id_text.value =="") {
alert("아이디를 입력하세요");
return;
} else if (document.loginForm.password_text.value =="") {
alert("비밀번호를 입력하세요");
return;
} else { */
//개발 완료시 삭제영역
/* const str = $("#devIdSelect").val();
const arr = str.split("/");
$("#id_text").val(arr[0]);
$("#password_text").val(arr[1]); */
//개발완료시 삭제 영역 끝
if( isNotEmpty($('#itnIdSelect').val())){
var id = ($('#itnIdSelect').val()).split(':')
$("#id_text").val(id[0]);
$("#password_text").val(id[1]);
}
var id = $("#id_text").val();
var pw = $("#password_text").val();
$("#id").val(id);
$("#password").val(pw);
document.loginForm.action="<c:url value='/web/user/login/actionSecurityLogin.do'/>";
document.loginForm.submit();
}
/* 아이디 비밀번호 찾기 link */
function usrIdPassFind(choose){
var frm = document.usrForm;
var actionUrl;
frm.returnSiteCode.value = "<c:out value='${returnSiteCode}'/>";
frm.returnSiteUrl.value = "<c:out value='${returnSiteUrl}'/>";
if(choose == 'id'){
actionUrl = "<c:url value='${idFindUrl}'/>";
}else{
actionUrl = "<c:url value='${pwFindUrl}'/>";
}
frm.action = actionUrl;
frm.submit();
}
</script>
<form:form id="loginForm" name="loginForm" method="post" action="/web/user/login/actionSecurityLogin.do">
<input type="hidden" name="beforeUrl" value='<c:out value="${beforeUrl}"></c:out>' />
<input type="hidden" name="userSe" value="GNR" />
<input type="hidden" id="id" name="id">
<input type="hidden" id="password" name="password">
<input type="hidden" id="isSelect" name="isSelect">
<!-- cont -->
<div class="cont_wrap" id="sub" style="width: 100%">
<div class="cont_tit">
<h2>로그인</h2>
<div class="sns_go">
<button type="button" title="새창열림"><img src="/visitEdu/usr/publish/images/content/facebook_icon.png" alt="페이스북 바로가기"></button>
<button type="button" title="새창열림"><img src="/visitEdu/usr/publish/images/content/twitter_icon.png" alt="트위터 바로가기"></button>
</div>
</div>
<div class="login_wrap">
<p class="login_tit">
<span>로그인</span>
해주세요
</p>
<kc:profile value="local">
개발자 아이디 선택 : <select id="devIdSelect" style="width: 400px; height: 30px;" onchange="login()">
<option value="">로그인할 아이디를 선택해주세요.</option>
<option value="3000118:1">공통 담당자1 (USRCNFRM_00000002620)_우영두</option>
<option value="3000116:1">공통 담당자2 (USRCNFRM_00000002611)_여현준</option>
<option value="3000119:1">공통 담당자3 (USRCNFRM_00000002614)_원영현</option>
<option value="3000122:1">공통 담당자x (USRCNFRM_00000002610)_이준호</option>
<option value="3000120:1">사용자_김x호(USRCNFRM_00000002612)_안주영</option>
<option value="3000117:1">공통 사용자(USRCNFRM_00000002650)_이지우</option>
<option value="3000125:1">개발팀 사용자(USRCNFRM_00000002613)_정수빈</option>
<option value="3000128:1">개발팀 사용자(USRCNFRM_00000002720)_김지훈</option>
<option value="3000127:1">개발팀 사용자(USRCNFRM_00000002630)_이소미</option>
<option value="3000126:1">개발팀 사용자(USRCNFRM_00000002710)_최하연</option>
<!--
<option value="USRCNFRM_00000002620:1">공통 담당자1 (USRCNFRM_00000002620)_우영두</option>
<option value="USRCNFRM_00000002611:1">공통 담당자2 (USRCNFRM_00000002611)_여현준</option>
<option value="USRCNFRM_00000002614:1">공통 담당자3 (USRCNFRM_00000002614)_원영현</option>
<option value="USRCNFRM_00000002610:1">공통 담당자x (USRCNFRM_00000002610)_이준호</option>
<option value="USRCNFRM_00000002612:1">사용자_김x호(USRCNFRM_00000002612)_안주영</option>
<option value="USRCNFRM_00000002650:1">공통 사용자(USRCNFRM_00000002650)_이지우</option>
<option value="USRCNFRM_00000002613:1">개발팀 사용자(USRCNFRM_00000002613)_정수빈</option>
<option value="USRCNFRM_00000002720:1">개발팀 사용자(USRCNFRM_00000002720)_김지훈</option>
<option value="USRCNFRM_00000002630:1">개발팀 사용자(USRCNFRM_00000002630)_이소미</option>
<option value="USRCNFRM_00000002710:1">개발팀 사용자(USRCNFRM_00000002710)_최하연</option>
-->
</select>
<br></br>
아이디 선택 : <select id="itnIdSelect" style="width: 400px; height: 30px;" onchange="actionLogin('Y')">
<option value="">로그인할 아이디를 선택해주세요.</option>
<option value="rosehips@naver.com:copyright123$">담당자1(USRCNFRM_00000002620)_우영두</option>
<option value="yu3145@naver.com:copyright123$">담당자2 (USRCNFRM_00000002611)_여현준</option>
<option value="wyh2010@naver.com:copyright123$">담당자3 (USRCNFRM_00000002614)_원영현</option>
<option value="tolag3@gmail.com:copyright123$">담당자x (USRCNFRM_00000002610)_이준호</option>
<option value="peaceack@gmail.com:copyright123$">사용자_김x호(USRCNFRM_00000002612)_안주영</option>
<option value="dlwldn1024@gmail.com:copyright123$">사용자_이x우(USRCNFRM_00000002650)_이지우</option>
<option value="dhgksk99@gmail.com:copyright123$">사용자_정x빈(USRCNFRM_00000002613)_정수빈</option>
<option value="rownim@naver.com:copyright123$">사용자_김x훈(USRCNFRM_00000002720)_김지훈</option>
<option value="soming90@nate.com:copyright123$">사용자_이x미(USRCNFRM_00000002630)_이소미</option>
<option value="chylove0132@gmail.com:copyright123$">사용자_최x연(USRCNFRM_00000002710)_최하연</option>
<!--
<option value="rosehips@naver.com:copyright123$">사용자_곽x태(USRCNFRM_00000002563)_우영두</option>
<option value="yu3145@naver.com:copyright123$">담당자2 (USRCNFRM_00000002561)_여현준</option>
<option value="wyh2010@naver.com:copyright123$">담당자3 (USRCNFRM_00000002562)_원영현</option>
<option value="tolag3@gmail.com:copyright123$">담당자x (USRCNFRM_00000002560)_이준호</option>
<option value="peaceack@gmail.com:copyright123$">사용자_김x호(USRCNFRM_00000002564)_안주영</option>
<option value="dlwldn1024@gmail.com:copyright123$">사용자_이x우(USRCNFRM_00000002570)_이지우</option>
<option value="dhgksk99@gmail.com:copyright123$">사용자_정x빈(USRCNFRM_00000002585)_정수빈</option>
<option value="rownim@naver.com:copyright123$">사용자_김x훈(USRCNFRM_00000002590)_김지훈</option>
<option value="soming90@nate.com:copyright123$">사용자_이x미(USRCNFRM_00000002591)_이소미</option>
<option value="chylove0132@gmail.com:copyright123$">사용자_최x연(USRCNFRM_00000002592)_최하연</option>
-->
</select>
<br></br>
</kc:profile>
<div class="login_form">
<label for="id_text" class="label">아이디 입력</label>
<input type="text" id="id_text" placeholder="아이디를 입력해주세요">
<label for="password_text" class="label">비밀번호 입력</label>
<input type="password" id="password_text" onkeypress="press(event)" placeholder="비밀번호를 입력해주세요">
<div class="login_btn_wrap">
<button type="button" onclick="javascript:actionLogin();" class="btn_login">로그인</button>
<button type="button" onclick="window.open('<c:out value='${joinUrl}'/>')" title="새창열림" class="btn_join">회원가입</button>
</div>
<div class="login_util">
<a href="#" target="_blank" title="새창열림" onclick="javascript:usrIdPassFind('id')">아이디 찾기</a>
<a href="#" target="_blank" title="새창열림"onclick="javascript:usrIdPassFind('pass')" >비밀번호 찾기</a>
</div>
</div>
</div>
</div>
<%-- <div class="cont_wrap login_cont" id="sub">
<div class="inner">
<div class="cont_tit">
<h2>로그인3</h2>
</div>
<fieldset>
<div class="login_wrap">
<p class="login_tit">
<span>로그인</span>
해주세요
</p>
개발자 아이디 선택 : <select id="devIdSelect" style="width: 400px; height: 30px;" onchange="login()">
<option value="">로그인할 아이디를 선택해주세요.</option>
<option value="3000118:1">공통 담당자1 (USRCNFRM_00000002620)_우영두</option>
<option value="3000116:1">공통 담당자2 (USRCNFRM_00000002611)_여현준</option>
<option value="3000119:1">공통 담당자3 (USRCNFRM_00000002614)_원영현</option>
<option value="3000122:1">공통 담당자x (USRCNFRM_00000002610)_이준호</option>
<option value="3000120:1">사용자_김x호(USRCNFRM_00000002612)_안주영</option>
<option value="3000117:1">공통 사용자(USRCNFRM_00000002650)_이지우</option>
<option value="3000125:1">개발팀 사용자(USRCNFRM_00000002613)_정수빈</option>
<option value="3000128:1">개발팀 사용자(USRCNFRM_00000002720)_김지훈</option>
<option value="3000127:1">개발팀 사용자(USRCNFRM_00000002630)_이소미</option>
<option value="3000126:1">개발팀 사용자(USRCNFRM_00000002710)_최하연</option>
<!--
<option value="USRCNFRM_00000002944:1">공통 담당자1 (USRCNFRM_00000002944)_김하이</option>
<option value="USRCNFRM_00000002943:1">공통 담당자1 (USRCNFRM_00000002943)_김부장</option>
<option value="USRCNFRM_00000002942:1">공통 담당자1 (USRCNFRM_00000002942)_하하하</option>
<option value="USRCNFRM_00000002941:1">공통 담당자1 (USRCNFRM_00000002941)_김위원</option>
<option value="USRCNFRM_00000002940:1">공통 담당자1 (USRCNFRM_00000002940)_이준호1</option>
<option value="USRCNFRM_00000002560:1">공통 담당자1 (USRCNFRM_00000002560)_이준호</option>
<option value="USRCNFRM_00000002561:1">공통 담당자2 (USRCNFRM_00000002561)_여현준</option>
<option value="USRCNFRM_00000002562:1">공통 담당자3 (USRCNFRM_00000002562)_원영현</option>
<option value="USRCNFRM_00000002563:1">사용자_곽x태(USRCNFRM_00000002563)_우영두</option>
<option value="USRCNFRM_00000002564:1">사용자_김x호(USRCNFRM_00000002564)_안주영</option>
<option value="USRCNFRM_00000002570:1">공통 사용자(USRCNFRM_00000002570)_이지우</option>
<option value="USRCNFRM_00000002585:1">개발팀 사용자(USRCNFRM_00000002585)_정수빈</option>
<option value="USRCNFRM_00000002590:1">개발팀 사용자(USRCNFRM_00000002590)_김지훈</option>
<option value="USRCNFRM_00000002591:1">개발팀 사용자(USRCNFRM_00000002591)_이소미</option>
<option value="USRCNFRM_00000002592:1">개발팀 사용자(USRCNFRM_00000002592)_최하연</option>
-->
</select>
<br></br>
아이디 선택 : <select id="itnIdSelect" style="width: 400px; height: 30px;" onchange="actionLogin('Y')">
<option value="">로그인할 아이디를 선택해주세요.</option>
<option value="rosehips@naver.com:copyright123$">강사1(USRCNFRM_00000002620)_우영두</option>
<option value="yu3145@naver.com:copyright123$">강사2 (USRCNFRM_00000002611)_여현준</option>
<option value="wyh2010@naver.com:copyright123$">강사3 (USRCNFRM_00000002614)_원영현</option>
<option value="tolag3@gmail.com:copyright123$">강사4 (USRCNFRM_00000002610)_이준호</option>
<option value="peaceack@gmail.com:copyright123$">강사5(USRCNFRM_00000002612)_안주영</option>
<option value="dlwldn1024@gmail.com:copyright123$">사용자1(USRCNFRM_00000002650)_이지우</option>
<option value="dhgksk99@gmail.com:copyright123$">사용자2(USRCNFRM_00000002613)_정수빈</option>
<option value="rownim@naver.com:copyright123$">사용자3(USRCNFRM_00000002720)_김지훈</option>
<option value="soming90@nate.com:copyright123$">사용자4(USRCNFRM_00000002630)_이소미</option>
<option value="chylove0132@gmail.com:copyright123$">사용자5(USRCNFRM_00000002710)_최하연</option>
<!--
<option value="tolag3@gmail.com:copyright123$">담당자1 (USRCNFRM_00000002560)_이준호</option>
<option value="yu3145@naver.com:copyright123$">담당자2 (USRCNFRM_00000002561)_여현준</option>
<option value="wyh2010@naver.com:copyright123$">담당자3 (USRCNFRM_00000002562)_원영현</option>
<option value="rosehips@naver.com:copyright123$">사용자_곽x태(USRCNFRM_00000002563)_우영두</option>
<option value="peaceack@gmail.com:copyright123$">사용자_김x호(USRCNFRM_00000002564)_안주영</option>
<option value="dlwldn1024@gmail.com:copyright123$">사용자_이x우(USRCNFRM_00000002570)_이지우</option>
<option value="dhgksk99@gmail.com:copyright123$">사용자_정x빈(USRCNFRM_00000002585)_정수빈</option>
<option value="rownim@naver.com:copyright123$">사용자_김x훈(USRCNFRM_00000002590)_김지훈</option>
<option value="soming90@nate.com:copyright123$">사용자_이x미(USRCNFRM_00000002591)_이소미</option>
<option value="chylove0132@gmail.com:copyright123$">사용자_최x연(USRCNFRM_00000002592)_최하연</option>
-->
</select>
<br></br>
<div class="login_form">
<label for="id_text">아이디 입력</label>
<input type="text" id="id_text" placeholder="아이디를 입력해주세요">
<label for="password_text">비밀번호 입력</label>
<input type="password" id="password_text" onkeypress="press(event)" placeholder="비밀번호를 입력해주세요">
<div class="btn_wrap">
<button type="button" onclick="javascript:actionLogin();" class="btn_login">로그인</button>
<button type="button" onclick="window.open('<c:out value='${joinUrl}'/>')" title="새창열림" class="btn_join">회원가입</button>
</div>
<div class="login_util">
<a href="#" target="_black" title="새창열림" onclick="javascript:usrIdPassFind('id')">아이디 찾기</a>
<a href="#" target="_black" title="새창열림" onclick="javascript:usrIdPassFind('pass')">비밀번호 찾기</a>
</div>
</div>
</div>
</fieldset>
</div>
</div> --%>
<!-- //cont -->
</form:form>
<form id="usrForm" name="usrForm" method="post" action="">
<input type="hidden" id="returnSiteCode" name="returnSiteCode" value="" />
<input type="hidden" id="returnSiteUrl" name="returnSiteUrl" value="" />
</form>