정수빈 정수빈 2024-11-22
Merge branch 'master' of http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git
http://subsub8729@vcs.iten.co.kr:9999/hylee/mjon_git

Conflicts:
	src/main/webapp/publish/mypage_index_2024.html
@cf35c07140e9e4d03600a04a6ea2a6d4efa2135f
src/main/java/itn/com/cmm/LoginVO.java
--- src/main/java/itn/com/cmm/LoginVO.java
+++ src/main/java/itn/com/cmm/LoginVO.java
@@ -114,6 +114,11 @@
 	
 	private String dormantYn; // 휴먼회원여부 ( N:일반회원,  Y:휴먼회원)
 	
+	/**
+	 * 보안로그인 여부
+	 */
+	private String secuLoginFlag;
+	
 	public String getDormantYn() {
 		return dormantYn;
 	}
@@ -411,5 +416,12 @@
 	public void setOuterCertYn(String outerCertYn) {
 		this.outerCertYn = outerCertYn;
 	}
+	public String getSecuLoginFlag() {
+		return secuLoginFlag;
+	}
+	public void setSecuLoginFlag(String secuLoginFlag) {
+		this.secuLoginFlag = secuLoginFlag;
+	}
+	
 	
 }
src/main/java/itn/let/cert/ip/service/CertIpService.java
--- src/main/java/itn/let/cert/ip/service/CertIpService.java
+++ src/main/java/itn/let/cert/ip/service/CertIpService.java
@@ -1,5 +1,7 @@
 package itn.let.cert.ip.service;
 
+import java.util.List;
+
 import itn.let.mail.service.StatusResponse;
 
 public interface CertIpService {
@@ -22,6 +24,11 @@
 
 	public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO);
 
+	public Boolean checkCertIp(MberCertIpVO mberCertIpVO);
+
+	public Boolean checkRegCertIp(MberCertIpVO mberCertIpVO);
+
+
 	
 	
 }
 
src/main/java/itn/let/cert/ip/service/CertLoginLogService.java (added)
+++ src/main/java/itn/let/cert/ip/service/CertLoginLogService.java
@@ -0,0 +1,19 @@
+package itn.let.cert.ip.service;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import egovframework.rte.fdl.cmmn.exception.FdlException;
+
+public interface CertLoginLogService {
+
+
+	public void insertCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO, HttpServletRequest request) throws FdlException;
+
+	public List<MberCertLoginLogVO> findAllCertLoginLogVO(MberCertLoginLogVO mberCertLoginLogVO);
+
+
+	
+	
+}
 
src/main/java/itn/let/cert/ip/service/MberCertLoginLogVO.java (added)
+++ src/main/java/itn/let/cert/ip/service/MberCertLoginLogVO.java
@@ -0,0 +1,76 @@
+package itn.let.cert.ip.service;
+
+import itn.let.uss.umt.service.UserDefaultVO;
+/**
+ * 
+ * @author 		: 이호영
+ * @fileName 	: MberCertLoginLogVO.java 
+ * @date 		: 2024.11.21
+ * @description : 로그인 이력관리 92동안만 관리하고 삭제 
+ * =========================================================== 
+ * DATE          AUTHOR   NOTE 
+ * ----------------------------------------------------------- *
+ * 2024.11.21    이호영          최초 생성
+ * 
+ * 
+ * 
+ */
+public class MberCertLoginLogVO extends UserDefaultVO{
+
+	
+	/**
+	 * @description :
+	 */
+	private static final long serialVersionUID = 1L;
+	
+
+	private String certLoginId;
+	private String loginId;
+	private String loginIp;
+	private String loginDevice;
+	private String loginDt;
+	
+	private String secuLoginFlag;
+	
+	
+	public String getCertLoginId() {
+		return certLoginId;
+	}
+	public void setCertLoginId(String certLoginId) {
+		this.certLoginId = certLoginId;
+	}
+	public String getLoginId() {
+		return loginId;
+	}
+	public void setLoginId(String loginId) {
+		this.loginId = loginId;
+	}
+	public String getLoginIp() {
+		return loginIp;
+	}
+	public void setLoginIp(String loginIp) {
+		this.loginIp = loginIp;
+	}
+	public String getLoginDevice() {
+		return loginDevice;
+	}
+	public void setLoginDevice(String loginDevice) {
+		this.loginDevice = loginDevice;
+	}
+	public String getLoginDt() {
+		return loginDt;
+	}
+	public void setLoginDt(String loginDt) {
+		this.loginDt = loginDt;
+	}
+	public String getSecuLoginFlag() {
+		return secuLoginFlag;
+	}
+	public void setSecuLoginFlag(String secuLoginFlag) {
+		this.secuLoginFlag = secuLoginFlag;
+	}
+	
+	
+	
+	
+}
src/main/java/itn/let/cert/ip/service/impl/CertIpDAO.java
--- src/main/java/itn/let/cert/ip/service/impl/CertIpDAO.java
+++ src/main/java/itn/let/cert/ip/service/impl/CertIpDAO.java
@@ -27,5 +27,13 @@
 	public MberCertIpVO findByMberCertIpList(MberCertIpVO mberCertIpVO) {
 		return (MberCertIpVO) select("MberCertIpVO.findByMberCertIpList", mberCertIpVO);
 	}
+
+	public List<MberCertIpVO> checkCertIp(MberCertIpVO mberCertIpVO) {
+		return (List<MberCertIpVO>) list("MberCertIpVO.checkCertIp", mberCertIpVO);
+	}
+	
+	public List<MberCertIpVO> checkRegCertIp(MberCertIpVO mberCertIpVO) {
+		return (List<MberCertIpVO>) list("MberCertIpVO.checkRegCertIp", mberCertIpVO);
+	}
 	
 }
src/main/java/itn/let/cert/ip/service/impl/CertIpServiceImpl.java
--- src/main/java/itn/let/cert/ip/service/impl/CertIpServiceImpl.java
+++ src/main/java/itn/let/cert/ip/service/impl/CertIpServiceImpl.java
@@ -21,8 +21,8 @@
 
 
 	@Override
-	public StatusResponse selectMberCertIpList(MberCertIpVO mberCertPhoneVO) {
-		List<MberCertIpVO> mberCertIpListVO = certIpDAO.selectMberCertIpList(mberCertPhoneVO);
+	public StatusResponse selectMberCertIpList(MberCertIpVO mberCertIpVO) {
+		List<MberCertIpVO> mberCertIpListVO = certIpDAO.selectMberCertIpList(mberCertIpVO);
 		return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now());
 	}
 
@@ -43,5 +43,26 @@
 		certIpDAO.deleteCertIp(mberCertIpVO);
 		return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now());
 	}
+
+
+	@Override
+	public Boolean checkCertIp(MberCertIpVO mberCertIpVO) {
+		List<MberCertIpVO> mberCertIpListVO = certIpDAO.checkCertIp(mberCertIpVO);
+		if(mberCertIpListVO.size()>0) {
+			return true;	
+		}else {
+			return false;
+		}
+	}
+	
+	@Override
+	public Boolean checkRegCertIp(MberCertIpVO mberCertIpVO) {
+		List<MberCertIpVO> mberCertIpListVO = certIpDAO.checkRegCertIp(mberCertIpVO);
+		if(mberCertIpListVO.size()>0) {
+			return true;	
+		}else {
+			return false;
+		}
+	}
 	
 }
 
src/main/java/itn/let/cert/ip/service/impl/CertLoginLogDAO.java (added)
+++ src/main/java/itn/let/cert/ip/service/impl/CertLoginLogDAO.java
@@ -0,0 +1,47 @@
+package itn.let.cert.ip.service.impl;
+
+import java.util.List;
+
+import org.springframework.stereotype.Repository;
+
+import egovframework.rte.psl.dataaccess.EgovAbstractDAO;
+import itn.let.cert.ip.service.MberCertLoginLogVO;
+
+@Repository("CertLoginLogDAO")
+public class CertLoginLogDAO extends EgovAbstractDAO {
+
+
+/*
+	public List<MberCertIpVO> selectMberCertIpList(MberCertIpVO mberCertIpVO) {
+		return (List<MberCertIpVO>) list("MberCertIpVO.selectMberCertIpList", mberCertIpVO);
+	}
+
+	public void insertCertIp(MberCertIpVO mberCertIpVO) {
+		insert("MberCertIpVO.insertCertIp", mberCertIpVO);
+	}
+
+	public void deleteCertIp(MberCertIpVO mberCertIpVO) {
+		insert("MberCertIpVO.deleteCertIp", mberCertIpVO);
+	}
+
+	public MberCertIpVO findByMberCertIpList(MberCertIpVO mberCertIpVO) {
+		return (MberCertIpVO) select("MberCertIpVO.findByMberCertIpList", mberCertIpVO);
+	}
+*/
+	public void insertCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO) {
+		insert("MberCertLoginLogVO.insertCertLoginLog", mberCertLoginLogVO);
+	}
+
+	public int checkLoginIpExists(MberCertLoginLogVO mberCertLoginLogVO) {
+		return (int) select("MberCertLoginLogVO.checkLoginIpExists", mberCertLoginLogVO);
+	}
+
+	public void updateCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO) {
+		insert("MberCertLoginLogVO.updateCertLoginLog", mberCertLoginLogVO);
+	}
+
+	public List<MberCertLoginLogVO> findAllCertLoginLogVO(MberCertLoginLogVO mberCertLoginLogVO) {
+		return (List<MberCertLoginLogVO>) list("MberCertLoginLogVO.findAllCertLoginLogVO", mberCertLoginLogVO);
+	}
+	
+}
 
src/main/java/itn/let/cert/ip/service/impl/CertLoginLogServiceImpl.java (added)
+++ src/main/java/itn/let/cert/ip/service/impl/CertLoginLogServiceImpl.java
@@ -0,0 +1,87 @@
+package itn.let.cert.ip.service.impl;
+
+import java.util.List;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Service;
+
+import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;
+import egovframework.rte.fdl.cmmn.exception.FdlException;
+import egovframework.rte.fdl.idgnr.EgovIdGnrService;
+import itn.let.cert.ip.service.CertLoginLogService;
+import itn.let.cert.ip.service.MberCertLoginLogVO;
+
+@Service("CertLoginLogService")
+public class CertLoginLogServiceImpl extends EgovAbstractServiceImpl implements CertLoginLogService {
+
+	@Resource(name = "CertLoginLogDAO")
+	private CertLoginLogDAO certLoginLogDAO;
+
+    @Resource(name = "egovMjonCertLoginLogIdGnrService")
+	private EgovIdGnrService certLoginLogIdGnrService;
+/*
+	@Override
+	public StatusResponse selectMberCertIpList(MberCertIpVO mberCertPhoneVO) {
+		List<MberCertIpVO> mberCertIpListVO = certLoginLogDAO.selectMberCertIpList(mberCertPhoneVO);
+		return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now());
+	}
+
+
+	@Override
+	public StatusResponse insertCertIp(MberCertIpVO mberCertIpVO) {
+		MberCertIpVO mberCertIpListVO = certLoginLogDAO.findByMberCertIpList(mberCertIpVO);
+		if(mberCertIpListVO != null) {
+			return new StatusResponse(HttpStatus.CONFLICT, "중복 IP입니다.", LocalDateTime.now());
+		}
+		certLoginLogDAO.insertCertIp(mberCertIpVO);
+		return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now());
+	}
+
+
+	@Override
+	public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO) {
+		certLoginLogDAO.deleteCertIp(mberCertIpVO);
+		return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now());
+	}
+*/
+
+	@Override
+	public void insertCertLoginLog(MberCertLoginLogVO mberCertLoginLogVO, HttpServletRequest request) throws FdlException {
+ 
+		
+//		int count = certLoginLogDAO.checkLoginIpExists(mberCertLoginLogVO);
+//		
+//		if (count > 0) {
+//			// 이미 존재하면 UPDATE
+//			certLoginLogDAO.updateCertLoginLog(mberCertLoginLogVO);
+//		} else {
+	
+			mberCertLoginLogVO.setCertLoginId(certLoginLogIdGnrService.getNextStringId());
+			mberCertLoginLogVO.setLoginDevice(getDevice(request));
+			certLoginLogDAO.insertCertLoginLog(mberCertLoginLogVO);
+			
+//		}
+	}
+		
+	private String getDevice(HttpServletRequest request) {
+		String userAgent = request.getHeader("User-Agent").toLowerCase();
+
+		if (userAgent.contains("mobile") || userAgent.contains("android") || userAgent.contains("iphone")) {
+			return "M";
+		} else if (userAgent.contains("tablet") || userAgent.contains("ipad")) {
+			return "T";
+		} else {
+			return "D";
+		}
+	}
+
+	@Override
+	public List<MberCertLoginLogVO> findAllCertLoginLogVO(MberCertLoginLogVO mberCertLoginLogVO) {
+		// TODO Auto-generated method stub
+		return certLoginLogDAO.findAllCertLoginLogVO(mberCertLoginLogVO);
+		
+	}
+
+}
src/main/java/itn/let/cert/ip/web/CertIpController.java
--- src/main/java/itn/let/cert/ip/web/CertIpController.java
+++ src/main/java/itn/let/cert/ip/web/CertIpController.java
@@ -3,6 +3,7 @@
 import java.time.LocalDateTime;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.HttpStatus;
@@ -17,6 +18,7 @@
 import itn.let.cert.ip.service.CertIpService;
 import itn.let.cert.ip.service.MberCertIpVO;
 import itn.let.mail.service.StatusResponse;
+import itn.let.utl.sim.service.EgovClntInfo;
 
 /**
  * 
@@ -79,6 +81,29 @@
 		return ResponseEntity.ok().body(certIpService.insertCertIp(mberCertIpVO));
 	}	
 	
+	
+	@RequestMapping(value = {"/cert/ip/insertCennetCertIp.do"})
+	public ResponseEntity<StatusResponse> insertCennetCertIp(MberCertIpVO mberCertIpVO,HttpServletRequest request) throws Exception {
+		
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId == null) {
+			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
+		}
+		mberCertIpVO.setFrstRegisterId(userId);
+		mberCertIpVO.setMberId(userId);
+
+		mberCertIpVO.setCertIp(EgovClntInfo.getClntIP(request));
+		mberCertIpVO.setCertMemo("허용 IP 등록");
+		
+		return ResponseEntity.ok().body(certIpService.insertCertIp(mberCertIpVO));
+	}	
+	
 	@RequestMapping(value = {"/cert/ip/deleteCertIp.do"})
 	public ResponseEntity<StatusResponse> deleteCertIp(MberCertIpVO mberCertIpVO) throws Exception {
 		
 
src/main/java/itn/let/cert/ip/web/CertLoginLogController.java (added)
+++ src/main/java/itn/let/cert/ip/web/CertLoginLogController.java
@@ -0,0 +1,102 @@
+package itn.let.cert.ip.web;
+
+import java.time.LocalDateTime;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
+import itn.com.cmm.LoginVO;
+import itn.com.utl.fcc.service.EgovStringUtil;
+import itn.let.cert.ip.service.CertLoginLogService;
+import itn.let.cert.ip.service.MberCertIpVO;
+import itn.let.mail.service.StatusResponse;
+
+/**
+ * 
+ * @author 		: 이호영
+ * @fileName 	: CertIpController.java 
+ * @date 		: 2024.11.19
+ * @description : 허용 IP 관련 컨트롤러
+ * =========================================================== 
+ * DATE          AUTHOR   NOTE 
+ * ----------------------------------------------------------- *
+ * 2024.11.19    이호영          최초 생성
+ * 
+ * 
+ * 
+ */
+@Controller
+public class CertLoginLogController {
+	
+	
+	/* CertLoginLogService */
+	@Resource(name = "CertLoginLogService")
+	private CertLoginLogService certLoginLogService;
+	
+	/*
+	@RequestMapping(value = {"/cert/ip/selectMberCertIpList.do"})
+	public ResponseEntity<StatusResponse> selectMberCertIpList(MberCertIpVO mberCertPhoneVO) throws Exception {
+		
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId == null) {
+			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
+		}
+		mberCertPhoneVO.setMberId(userId);
+		return ResponseEntity.ok().body(certLoginLogService.selectMberCertIpList(mberCertPhoneVO));
+	}	
+	
+	
+	@RequestMapping(value = {"/cert/ip/insertCertIp.do"})
+	public ResponseEntity<StatusResponse> insertCertIp(MberCertIpVO mberCertIpVO) throws Exception {
+		
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId == null) {
+			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
+		}
+		mberCertIpVO.setFrstRegisterId(userId);
+		mberCertIpVO.setMberId(userId);
+		
+		
+		return ResponseEntity.ok().body(certLoginLogService.insertCertIp(mberCertIpVO));
+	}	
+	
+	@RequestMapping(value = {"/cert/ip/deleteCertIp.do"})
+	public ResponseEntity<StatusResponse> deleteCertIp(MberCertIpVO mberCertIpVO) throws Exception {
+		
+		ModelAndView modelAndView = new ModelAndView();
+		modelAndView.setViewName("jsonView");
+		
+		//로그인 권한정보 불러오기
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if(userId == null) {
+			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
+		}
+		mberCertIpVO.setLastUpdusrId(userId);
+		mberCertIpVO.setMberId(userId);
+		
+		
+		return ResponseEntity.ok().body(certLoginLogService.deleteCertIp(mberCertIpVO));
+	}	
+		*/
+}(No newline at end of file)
src/main/java/itn/let/cert/phone/service/impl/CertPhoneServiceImpl.java
--- src/main/java/itn/let/cert/phone/service/impl/CertPhoneServiceImpl.java
+++ src/main/java/itn/let/cert/phone/service/impl/CertPhoneServiceImpl.java
@@ -29,11 +29,22 @@
 
 	@Override
 	public StatusResponse insertCertPhone(MberCertPhoneVO mberCertPhoneVO, String moblphonNo) {
-		MberCertPhoneVO mberCertPhoneListVO = certPhoneDAO.findByCertPhoneInfo(mberCertPhoneVO);
-		if(mberCertPhoneListVO != null || mberCertPhoneListVO.getMbtlnum().equals(moblphonNo) ) {
-			return new StatusResponse(HttpStatus.CONFLICT, "중복 번호입니다.", LocalDateTime.now());
+		System.out.println("findByCertPhoneInfo : :::: ");
+		try {
+		
+			MberCertPhoneVO mberCertPhoneListVO = certPhoneDAO.findByCertPhoneInfo(mberCertPhoneVO);
+			if(mberCertPhoneListVO != null) {
+				if(mberCertPhoneListVO.getMbtlnum().equals(moblphonNo)) {
+					return new StatusResponse(HttpStatus.CONFLICT, "중복 번호입니다.", LocalDateTime.now());
+				}
+			}
+			
+			certPhoneDAO.insertCertPhone(mberCertPhoneVO);
+			
+		} catch (Exception e) {
+			e.printStackTrace();	// TODO: handle exception
+			return new StatusResponse(HttpStatus.OK, "오류가 발생하였습니다.", LocalDateTime.now());
 		}
-		certPhoneDAO.insertCertPhone(mberCertPhoneVO);
 		return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now());
 	}
 
src/main/java/itn/let/cert/phone/web/CertPhoneController.java
--- src/main/java/itn/let/cert/phone/web/CertPhoneController.java
+++ src/main/java/itn/let/cert/phone/web/CertPhoneController.java
@@ -91,6 +91,9 @@
 		ModelAndView modelAndView = new ModelAndView();
 		modelAndView.setViewName("jsonView");
 		
+		
+		System.out.println(" :: insertCertPhone :: ");
+		
 		//로그인 권한정보 불러오기
 		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
 		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
@@ -119,7 +122,9 @@
 			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
 		}
 		mberCertPhoneVO.setFrstRegisterId(userId);
-		mberCertPhoneVO.setMberId(userId);
+		if(StringUtils.isEmpty(mberCertPhoneVO.getMberId()) ) {
+			mberCertPhoneVO.setMberId(userId);
+		}
 		
 		
 		return ResponseEntity.ok().body(certPhoneService.updateMberCertPhone(mberCertPhoneVO));
@@ -139,8 +144,10 @@
 			if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now()));
 		}
 		mberCertPhoneVO.setLastUpdusrId(userId);
-		mberCertPhoneVO.setMberId(userId);
-		
+
+		if(StringUtils.isEmpty(mberCertPhoneVO.getMberId()) ) {
+			mberCertPhoneVO.setMberId(userId);
+		}
 		
 		
 		return ResponseEntity.ok().body(certPhoneService.deleteCertPhone(mberCertPhoneVO));
@@ -153,6 +160,7 @@
 	@RequestMapping(value = {"/cert/phone/sendSysMsgDataAjax.do"})
 	public ResponseEntity<StatusResponse> sendSysMsgDataAjax(MberCertPhoneVO mberCertPhoneVO) throws Exception {
 		
+		
 		//로그인 권한정보 불러오기
 		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
 		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
src/main/java/itn/let/main/web/EgovMainController.java
--- src/main/java/itn/let/main/web/EgovMainController.java
+++ src/main/java/itn/let/main/web/EgovMainController.java
@@ -825,7 +825,7 @@
         try {
 			//0번째 부터 6개의 항목만 조회
 			MjonMsgVO mjonMsgVO = new MjonMsgVO();
-			adminMemLoginThisMonth = mjonMsgService.selectMemLoginThisMonth(mjonMsgVO);
+			//adminMemLoginThisMonth = mjonMsgService.selectMemLoginThisMonth(mjonMsgVO);
 		}
 		catch(Exception e) {
 			isSuccess = false;
src/main/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java
--- src/main/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java
+++ src/main/java/itn/let/uat/uia/service/impl/EgovMberManageServiceImpl.java
@@ -604,6 +604,15 @@
 		
 		return resultCnt;
 	}
+
+	@Override
+	public String getSecuLoginFlag(String id) {
+		// TODO Auto-generated method stub
+		return mberManageDAO.getSecuLoginFlag(id);
+	}
 	
+	public void updateSecureLoginFlag(MberManageVO mberManageVO) throws Exception {
+		mberManageDAO.updateSecureLoginFlag(mberManageVO);
+	}
 	
 }
(No newline at end of file)
src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java
--- src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java
+++ src/main/java/itn/let/uat/uia/service/impl/MberManageDAO.java
@@ -332,5 +332,13 @@
 		
 		return resultCnt;
 	}
+
+	public String getSecuLoginFlag(String id) {
+		return (String)select("mberManageDAO.getSecuLoginFlag", id);
+	}
+	
+	public void updateSecureLoginFlag(MberManageVO mberManageVO) throws Exception {
+		update("mberManageDAO.updateSecureLoginFlag",mberManageVO);
+	}
 	
 }
(No newline at end of file)
src/main/java/itn/let/uat/uia/web/EgovLoginController.java
--- src/main/java/itn/let/uat/uia/web/EgovLoginController.java
+++ src/main/java/itn/let/uat/uia/web/EgovLoginController.java
@@ -83,6 +83,10 @@
 import itn.com.cmm.util.WebUtil;
 import itn.com.uss.olh.hpc.service.HackIpService;
 import itn.com.uss.olh.hpc.service.HackIpVO;
+import itn.let.cert.ip.service.CertIpService;
+import itn.let.cert.ip.service.CertLoginLogService;
+import itn.let.cert.ip.service.MberCertIpVO;
+import itn.let.cert.ip.service.MberCertLoginLogVO;
 import itn.let.cert.phone.service.CertPhoneService;
 import itn.let.cert.phone.service.MberCertPhoneVO;
 import itn.let.cop.bbs.service.BoardVO;
@@ -241,6 +245,12 @@
 
 	@Resource(name = "CertPhoneService")
 	private CertPhoneService certPhoneService;
+	
+	@Resource(name = "CertLoginLogService")
+	private CertLoginLogService certLoginLogService;
+	
+	@Resource(name = "CertIpService")
+	private CertIpService certIpService;
 	
 	private static final Logger logger = LoggerFactory.getLogger(MjonMsgDataController.class);
 
@@ -1111,6 +1121,7 @@
 
 		// 공인 IP 구하기
 		String userIp = EgovClntInfo.getClntIP(request);
+		System.out.println("userIp :: "+userIp);
 		// java.util.Scanner s = new java.util.Scanner(new
 		// java.net.URL("https://api.ipify.org").openStream(),
 		// "UTF-8").useDelimiter("\\A");
@@ -2066,6 +2077,35 @@
 		modelAndView.addObject("data", resultVO);
 		modelAndView.addObject("mberCertPhoneList", mberCertPhoneList);
 		
+		
+
+
+		/* 일시 : 2024.11.21
+		 * 내용 : 패스 인증 조회
+		 * 작업자 : 이호영
+		 */
+		String userId = loginVO.getId();
+		// lettngnrlmber TB에 secuLoginFlag 값이 Y면 인증 해야함
+		String secuLoginFlag = mberManageService.getSecuLoginFlag(userId);
+		
+		String passFlag = "Y";
+		if("Y".equals(secuLoginFlag)) {
+			// lettngnrlmber TB에 secuLoginFlag 값이 Y면
+			// IP가 등록 되어 있는지 확인
+			// 있으면 2차인증 안함
+			// 없으면 2차인증 진행
+	    	MberCertIpVO mberCertIpVO = new MberCertIpVO();
+	    	mberCertIpVO.setCertIp(userIp);
+	    	mberCertIpVO.setMberId(userId);
+	    	// ip가 있으면 true
+	    	if(!certIpService.checkCertIp(mberCertIpVO)) {
+	    		passFlag = "N";
+	    	}
+		}
+		modelAndView.addObject("passFlag", passFlag);
+		
+		
+		
 		return modelAndView;
 		
 
@@ -2461,14 +2501,24 @@
 		sendLogVO.setSendId(id);
 		sendLogVO.setReceive(s_hp);
 		sendLogVO.setCheckNo(s_num);
-				
-		sendLogVO = mjonMsgDataService.selectSysMsgLogCheck(sendLogVO);
 		
-		if (sendLogVO==null) {
-			redirectAttributes.addFlashAttribute("fail2", true);
-			return "redirect:/web/user/login/login.do";
-		}		
+		String passFlag	=	request.getParameter("passFlag");
+		System.out.println("passFlag : "+ passFlag);
+		System.out.println("passFlag : "+ passFlag);
+		System.out.println("passFlag : "+ passFlag);
+		System.out.println("passFlag : "+ passFlag);
+		System.out.println("passFlag : "+ passFlag);
+		System.out.println("passFlag : "+ passFlag);
+		if("Y".equals(passFlag)) {
 		
+			sendLogVO = mjonMsgDataService.selectSysMsgLogCheck(sendLogVO);
+			
+			if (sendLogVO==null) {
+				redirectAttributes.addFlashAttribute("fail2", true);
+				return "redirect:/web/user/login/login.do";
+			}		
+		
+		}
 		
 		String password = decryptRsa(privateKey, loginVO.getPassword());
 		loginVO.setId(id);
@@ -2664,7 +2714,14 @@
 				loginVO.getIp();
 				loginVO.setMessage("로그인 성공되었습니다.");
 				loginVO.setLoginYn("Y");
+				
 				loginService.insertActionLoginLog(loginVO);
+				// 인증 로그인 이력을 위한 insert
+				
+				MberCertLoginLogVO mberCertLoginLogVO = new MberCertLoginLogVO();
+				mberCertLoginLogVO.setLoginId(loginVO.getId());
+				mberCertLoginLogVO.setLoginIp(loginVO.getIp());
+				certLoginLogService.insertCertLoginLog(mberCertLoginLogVO, request);
 			}
 
 			// 등급제 Start
src/main/java/itn/let/uat/uia/web/EgovMypageController.java
--- src/main/java/itn/let/uat/uia/web/EgovMypageController.java
+++ src/main/java/itn/let/uat/uia/web/EgovMypageController.java
@@ -16,9 +16,12 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
@@ -41,6 +44,10 @@
 import itn.com.cmm.util.RedirectUrlMaker;
 import itn.com.cmm.util.StringUtil;
 import itn.com.utl.fcc.service.EgovStringUtil;
+import itn.let.cert.ip.service.CertIpService;
+import itn.let.cert.ip.service.CertLoginLogService;
+import itn.let.cert.ip.service.MberCertIpVO;
+import itn.let.cert.ip.service.MberCertLoginLogVO;
 import itn.let.fax.user.service.FaxGroupDataVO;
 import itn.let.fax.user.service.FaxService;
 import itn.let.kakao.user.sent.service.KakaoSentService;
@@ -70,6 +77,7 @@
 import itn.let.uss.umt.service.EgovUserManageService;
 import itn.let.uss.umt.service.MberManageVO;
 import itn.let.uss.umt.service.UserManageVO;
+import itn.let.utl.sim.service.EgovClntInfo;
 import itn.let.utl.user.service.MjonNoticeSendUtil;
 
 /**
@@ -164,6 +172,14 @@
 	/** 등급제 관리 서비스 */
 	@Resource(name = "mberGrdService")
 	MberGrdService mberGrdService;
+
+//	/* CertLoginLogService */
+	@Resource(name = "CertLoginLogService")
+	private CertLoginLogService certLoginLogService;
+	
+//	/* CertLoginLogService */
+	@Resource(name = "CertIpService")
+	private CertIpService certIpService;
 	
 	/**
 	 * 마이페이지 비밀번호 변경 탭
@@ -2927,13 +2943,62 @@
 	 * 회원탈퇴 본인인증 화면
 	 */
 	@RequestMapping(value="/web/user/mberSecureLogin.do")
-	public String secureLogin(@ModelAttribute MberManageVO mberManageVO
+	public String secureLogin(@ModelAttribute("mberCertLoginLogVO") MberCertLoginLogVO mberCertLoginLogVO  
 			, ModelMap model, HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception {
 		
 		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
 		if(loginVO == null) {
 			return "redirect:/web/user/login/login.do";
 		}
+
+	    // secuLoginFlag 값을 Model에 추가
+	    model.addAttribute("secuLoginFlag", mberCertLoginLogVO.getSecuLoginFlag());
+		System.out.println(mberCertLoginLogVO.getSecuLoginFlag());
+
+		//로그인 권한정보 불러오기
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+
+		/** pageing */
+		PaginationInfo paginationInfo = new PaginationInfo();
+		paginationInfo.setCurrentPageNo(mberCertLoginLogVO.getPageIndex());
+		paginationInfo.setRecordCountPerPage(mberCertLoginLogVO.getPageUnit());
+		paginationInfo.setPageSize(mberCertLoginLogVO.getPageSize());
+
+		mberCertLoginLogVO.setFirstIndex(paginationInfo.getFirstRecordIndex());
+		mberCertLoginLogVO.setLastIndex(paginationInfo.getLastRecordIndex());
+		mberCertLoginLogVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());
+		if("".equals(mberCertLoginLogVO.getSearchSortCnd())){ //최초조회시 최신것 조회List
+			mberCertLoginLogVO.setSearchSortCnd("LOGIN_DT");
+			mberCertLoginLogVO.setSearchSortOrd("desc");
+		}
+
+
+		mberCertLoginLogVO.setLoginId(userId);
+    	//전체 발송 리스트 불러오기
+    	List<MberCertLoginLogVO> resultList = certLoginLogService.findAllCertLoginLogVO(mberCertLoginLogVO);
+    	model.addAttribute("resultList", resultList);
+    	model.addAttribute("resultListCnt", resultList.size());
+		
+
+    	paginationInfo.setTotalRecordCount( resultList.size()> 0 ? resultList.get(0).getTotCnt() : 0);
+        model.addAttribute("paginationInfo", paginationInfo);
+		
+		
+		
+
+        // 접속 IP
+    	String cennectIP = EgovClntInfo.getClntIP(request);
+    	model.addAttribute("cennectIP", cennectIP);
+
+        // 접속 IP가 등록되어있는지 확인
+    	MberCertIpVO mberCertIpVO = new MberCertIpVO();
+    	mberCertIpVO.setCertIp(cennectIP);
+    	mberCertIpVO.setMberId(userId);
+    	model.addAttribute("chkcertRegIP", certIpService.checkRegCertIp(mberCertIpVO));
+		
+		
+		
 		
 
 		{
@@ -2951,11 +3016,20 @@
 				serverNm = request.getScheme() + "://www.munjaon.co.kr";
 			}
 			
+			System.out.println("@@@  serverNm  : "  + serverNm);
 			AuthCertVO certVO = kmcCertCheck.authCertCheckNine(serverNm + "/web/user/selectSecurityAuthn.do", loginVO.getId());
 			model.addAttribute("certVO", certVO);
 		}
+		
+		MberManageVO mberManageVO = new MberManageVO();
+		mberManageVO.setMberId(loginVO.getId());
+		
+		model.addAttribute("mberManageVO", userManageService.selectUserInfo(mberManageVO));
+		
+		model.addAttribute("pageTab", "mberSecureLogin");
+		
+		
 
-		model.addAttribute("pageTab", "mberSecureLogin");		
 		return "web/user/mberSecureLogin";
 	}
 	
@@ -3773,14 +3847,47 @@
 		certVO.setCertNation(kmcVO.getNation());
 		certVO.setCertName(kmcVO.getName());
 		certVO.setCertResult(kmcVO.getResult());
-		certVO.setCertType("KMC_회원정보 변경");
+		certVO.setCertType("secureLoginOFF");
 		certVO.setCertIpaddr(kmcVO.getIp());
 		certVO.setBirthDay(kmcVO.getBirthDay());
 		certVO.setSexdstnCode(kmcVO.getGender());
 
-		model.addAttribute("kmcVO", kmcVO);
+
+		//디비 테이블에 저장하기
+		mberManageService.insertCertInfoLog(certVO);
+		
+		
+		
 		
 		return "web/user/securityAuthnPage";
 	}
 	
+	@RequestMapping(value="/web/user/mberSecureLoginAjax.do")
+	public ResponseEntity<?> mberSecureLoginAjax(MberManageVO mberManageVO, @RequestBody Map<String, String> params){
+		LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null;
+		String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId());
+		
+		if("Y".equals(params.get("secuLoginFlag"))) {
+			mberManageVO.setSecuLoginFlag("N");
+		}else {
+			mberManageVO.setSecuLoginFlag("Y");
+		}
+		mberManageVO.setMberId(userId);
+		mberManageVO.setLastUpdusrId(userId);
+		
+		try {
+			mberManageService.updateSecureLoginFlag(mberManageVO);
+			
+			return new ResponseEntity<>("success", HttpStatus.OK);
+		} catch (Exception e) {
+			System.out.println("mberSecureLoginAjax Error!!!!!!!!!!!!!!!!!!!!");
+			System.out.println("mberSecureLoginAjax Error!!!!!!!!!!!!!!!!!!!!");
+			System.out.println("mberSecureLoginAjax Error!!!!!!!!!!!!!!!!!!!!");
+			System.out.println("mberSecureLoginAjax Error!!!!!!!!!!!!!!!!!!!!");
+			System.out.println("mberSecureLoginAjax Error!!!!!!!!!!!!!!!!!!!!");
+			
+			return new ResponseEntity<>("fail", HttpStatus.OK);
+		}
+	}
+	
 }
src/main/java/itn/let/uat/uia/web/KmcCertChecker.java
--- src/main/java/itn/let/uat/uia/web/KmcCertChecker.java
+++ src/main/java/itn/let/uat/uia/web/KmcCertChecker.java
@@ -617,6 +617,8 @@
 	        String cpId				= "MJOM1001";			// 회원사ID
 	        String urlCode			= "001014";			// URL코드
 	        //kmc 본인인증 실/개발 서버 구분
+	        
+	        System.out.println("@@@@@   trUrl  : "  + trUrl);
 			if(trUrl.contains("192.168.0.60") || trUrl.contains("localhost")) {
 				urlCode = "010001";
 			}
src/main/java/itn/let/uss/umt/service/EgovMberManageService.java
--- src/main/java/itn/let/uss/umt/service/EgovMberManageService.java
+++ src/main/java/itn/let/uss/umt/service/EgovMberManageService.java
@@ -243,4 +243,9 @@
 	
 	//기업회원 기업정보 변경신청 취소 처리
 	public int updateCmpUserInfoCancel(MberManageVO mberManageVO) throws Exception;
+
+	public String getSecuLoginFlag(String id);
+	
+	public void updateSecureLoginFlag(MberManageVO mberManageVO) throws Exception;
+
 }
(No newline at end of file)
src/main/java/itn/let/uss/umt/service/MberManageVO.java
--- src/main/java/itn/let/uss/umt/service/MberManageVO.java
+++ src/main/java/itn/let/uss/umt/service/MberManageVO.java
@@ -504,6 +504,12 @@
 	private String dormantDate;
 	private String spamYn;
 	
+	
+	/**
+	 * 보안로그인 여부
+	 */
+	private String secuLoginFlag;
+	
 	public String getSpamYn() {
 		return spamYn;
 	}
@@ -1784,5 +1790,12 @@
 	public void setHotlineAgentCode(String hotlineAgentCode) {
 		this.hotlineAgentCode = hotlineAgentCode;
 	}
+	public String getSecuLoginFlag() {
+		return secuLoginFlag;
+	}
+	public void setSecuLoginFlag(String secuLoginFlag) {
+		this.secuLoginFlag = secuLoginFlag;
+	}
+	
 	
 }
(No newline at end of file)
src/main/java/itn/web/MainController.java
--- src/main/java/itn/web/MainController.java
+++ src/main/java/itn/web/MainController.java
@@ -1223,6 +1223,13 @@
 		
 		model.addAttribute("userCandidateYn", userCandidateYn);
 		
+		if(loginVO != null) {
+			MberManageVO mberManageVO = new MberManageVO();
+			mberManageVO.setMberId(loginVO.getId());
+			
+			model.addAttribute("mberManageVO", userManageService.selectUserInfo(mberManageVO));
+		}
+		
 		return "web/com/webCommonHeader";
     }
     
src/main/resources/egovframework/spring/com/context-idgen.xml
--- src/main/resources/egovframework/spring/com/context-idgen.xml
+++ src/main/resources/egovframework/spring/com/context-idgen.xml
@@ -2849,5 +2849,24 @@
 		<property name="cipers" value="13" />
 		<property name="fillChar" value="0" />
 	</bean>
+	
+	
+	<!-- 문자온 로그인LOG ID Generation  Strategy Config -->
+	<bean name="egovMjonCertLoginLogIdGnrService"
+		class="egovframework.rte.fdl.idgnr.impl.EgovTableIdGnrServiceImpl"
+		destroy-method="destroy">
+		<property name="dataSource" ref="dataSource" />
+		<property name="strategy" ref="mjonCertLoginLogIdStrategy" />
+		<property name="blockSize"  value="10"/>
+		<property name="table"      value="IDS"/>
+		<property name="tableName"  value="CERT_LOGIN_LOG_ID"/>
+	</bean>
+	<bean name="mjonCertLoginLogIdStrategy" 
+		class="egovframework.rte.fdl.idgnr.impl.strategy.EgovIdGnrStrategyImpl">
+		<property name="prefix" value="CERTLOGINLOG_" />
+		<property name="cipers" value="10" />
+		<property name="fillChar" value="0" />
+	</bean>
+	
 		
 </beans>
src/main/resources/egovframework/spring/com/context-scheduling-sym-log-lgm.xml
--- src/main/resources/egovframework/spring/com/context-scheduling-sym-log-lgm.xml
+++ src/main/resources/egovframework/spring/com/context-scheduling-sym-log-lgm.xml
@@ -127,21 +127,21 @@
 
 	<!-- 14 -->
 	<!-- mj_msg_data 백업 -->
-	<bean id="MjMsgDataBackupBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
+	<!-- <bean id="MjMsgDataBackupBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 		<property name="targetObject" ref="tableBackupMsgScheduling" />
 		<property name="targetMethod" value="mjMsgDataBackup" />
 		<property name="concurrent" value="false" />
-	</bean>
+	</bean> -->
 
-	<bean id="MjMsgDataBackupBeanTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
-		<property name="jobDetail" ref="MjMsgDataBackupBean" />		
+<!-- 	<bean id="MjMsgDataBackupBeanTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> -->
+<!-- 		<property name="jobDetail" ref="MjMsgDataBackupBean" />		 -->
 	<!-- 매년 3,11월 22일 4시38분 마다 작년도 테이블 백업  -->
-	   	<property name="cronExpression" value="0 38 4 22 11 ?" />
+<!-- 	   	<property name="cronExpression" value="0 38 4 22 11 ?" /> -->
 <!-- 	   	<property name="cronExpression" value="0 38 4 28 3 ?" /> -->
 	<!-- 매일 4시18분 마다 작년도 테이블 백업  -->
 <!-- 	   	<property name="cronExpression" value="0 03 12 * * ?" /> -->
 <!-- 	   	<property name="cronExpression" value="8 * * * * ?" /> -->
-	</bean>
+<!-- 	</bean> -->
 
 
 
@@ -157,7 +157,7 @@
 				<!-- <ref bean="SttstMsgRankDayBeanTrigger" /> --><!-- 문자전송순위통계집계(매일한번)  -->
 
 				<!-- mj_msg_data 백업  -->
-				<ref bean="MjMsgDataBackupBeanTrigger" />
+				<!-- <ref bean="MjMsgDataBackupBeanTrigger" /> -->
 
 			</list>
 		</property>
src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-cert.xml
--- src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-cert.xml
+++ src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-cert.xml
@@ -3,6 +3,7 @@
 
 <sqlMapConfig>
 	<settings cacheModelsEnabled="true" useStatementNamespaces="true" />
-	<sqlMap resource="egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml"/>	 <!-- 문자메세지 -->
-	<sqlMap resource="egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml"/>	 <!-- 문자메세지 -->
+	<sqlMap resource="egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml"/>	 <!-- 로그인 허용 IP -->
+	<sqlMap resource="egovframework/sqlmap/let/cert/MjonCertLoginLog_SQL_mysql.xml"/>	 <!-- 로그인 허용 IP를 위한 로그인Log -->
+	<sqlMap resource="egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml"/>	 <!-- 로그인 인증 폰번호 -->
 </sqlMapConfig>
src/main/resources/egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml
@@ -23,7 +23,7 @@
 		where 
 			MBER_ID = #mberId#
 		AND CERT_USE_YN = 'Y'
-		order by FRST_REGIST_PNTTM desc
+		order by FRST_REGIST_PNTTM asc
 	</select>
 	
 	<select id="MberCertIpVO.findByMberCertIpList" parameterClass="mberCertIpVO" resultClass="mberCertIpVO">
@@ -86,4 +86,33 @@
 	
 	
 	
+	<select id="MberCertIpVO.checkCertIp" parameterClass="mberCertIpVO" resultClass="mberCertIpVO">
+		/*MberCertIpVO.checkCertIp*/
+			
+			select 
+				LOGIN_IP as certIp 
+			from lettngnrlmber_cert_login_log_ip
+			where LOGIN_ID = #mberId#
+			and LOGIN_IP = #certIp#
+			union all
+			select 
+				CERT_IP as certIp  
+			from lettngnrlmber_cert_ip 
+			where MBER_ID  = #mberId#
+			and CERT_IP = #certIp#
+			AND CERT_USE_YN = 'Y'
+	</select>
+	
+	
+	<select id="MberCertIpVO.checkRegCertIp" parameterClass="mberCertIpVO" resultClass="mberCertIpVO">
+		/*MberCertIpVO.checkCennetIp*/
+			
+			select 
+				CERT_IP as certIp  
+			from lettngnrlmber_cert_ip 
+			where MBER_ID  = #mberId#
+			and CERT_IP = #certIp#
+			AND CERT_USE_YN = 'Y'
+	</select>
+	
 </sqlMap>
(No newline at end of file)
 
src/main/resources/egovframework/sqlmap/let/cert/MjonCertLoginLog_SQL_mysql.xml (added)
+++ src/main/resources/egovframework/sqlmap/let/cert/MjonCertLoginLog_SQL_mysql.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+	수정일		수정자					수정내용
+  =========     =======    =================================================
+  2021.03.01    신명섭 	
+-->
+<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
+<sqlMap namespace="MjonCertLoginLog">
+	<typeAlias  alias="mberCertLoginLogVO" type="itn.let.cert.ip.service.MberCertLoginLogVO"/>
+	
+	
+	
+	
+    <select id="MberCertLoginLogVO.findAllCertLoginLogVO" resultClass="mberCertLoginLogVO" parameterClass="mberCertLoginLogVO">
+    /*MberCertLoginLogVO.findAllCertLoginLogVO*/
+    
+    
+			SELECT
+				COUNT(CERT_LOGIN_ID) OVER() AS totCnt 
+				, CERT_LOGIN_ID as certLoginId    
+				, LOGIN_ID      as loginId         
+				, LOGIN_IP      as loginIp
+				, CASE 
+					WHEN LOGIN_DEVICE = 'D' THEN 'PC'
+					WHEN LOGIN_DEVICE IN ('M', 'T') THEN '모바일'
+					ELSE 'PC'
+					END AS loginDevice
+				, DATE_FORMAT(LOGIN_DT,'%Y-%m-%d %T') as loginDt
+			FROM	LETTNGNRLMBER_CERT_LOGIN_LOG_IP
+			WHERE	1=1
+			and LOGIN_ID = #loginId#
+			ORDER BY 1=1
+			<isNotEmpty property="searchSortCnd">
+			,$searchSortCnd$
+			</isNotEmpty>
+			<isNotEmpty property="searchSortOrd">
+			 	$searchSortOrd$
+			</isNotEmpty>
+		
+			LIMIT  #recordCountPerPage# OFFSET #firstIndex#	
+    
+    </select>
+    
+    
+    
+    <select id="MberCertLoginLogVO.checkLoginIpExists" resultClass="int" parameterClass="mberCertLoginLogVO">
+        SELECT COUNT(1)
+        FROM LETTNGNRLMBER_CERT_LOGIN_LOG_IP
+        WHERE LOGIN_IP = #loginIp#
+        AND LOGIN_ID = #loginId#
+    </select>
+	
+	<insert id="MberCertLoginLogVO.insertCertLoginLog" parameterClass="mberCertLoginLogVO">
+		INSERT INTO LETTNGNRLMBER_CERT_LOGIN_LOG_IP
+		(
+		    CERT_LOGIN_ID,
+		    LOGIN_ID,
+		    LOGIN_IP,
+		    LOGIN_DEVICE,
+		    LOGIN_DT
+		)
+		VALUES
+		(
+		    #certLoginId#,
+		    #loginId#,
+		    #loginIp#,
+		    #loginDevice#,
+		    NOW()
+		)
+	</insert>
+	
+	<!-- LOGIN_IP가 존재할 경우 UPDATE -->
+	<update id="MberCertLoginLogVO.updateCertLoginLog" parameterClass="mberCertLoginLogVO">
+		UPDATE LETTNGNRLMBER_CERT_LOGIN_LOG_IP
+			SET LOGIN_DT = NOW()
+			WHERE LOGIN_IP = #loginIp#
+			AND LOGIN_ID = #loginId#
+	</update>
+	
+</sqlMap>(No newline at end of file)
src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
--- src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml
@@ -5972,6 +5972,7 @@
 
 	<!-- 당월 회원전환률 -->
 	<select id="mjonMsgDAO.selectMemLoginThisMonth" parameterClass="mjonMsgVO" resultClass="mjonMsgVO">
+		/*	mjonMsgDAO.selectMemLoginThisMonth	*/
 		SELECT 
 			M2.createDt
 			,M2.visitCnt
src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovMberManage_SQL_Mysql.xml
@@ -2106,4 +2106,21 @@
 		WHERE CMPHST_ID = #cmpHstId#
     
     </update>
+    
+    <select id="mberManageDAO.getSecuLoginFlag" resultClass="String" parameterClass="String">
+    
+    
+		select SECU_LOGIN_FLAG  from lettngnrlmber where MBER_ID = #id#
+    
+    </select>
+
+    <update id="mberManageDAO.updateSecureLoginFlag" parameterClass="mberVO">
+    	
+    	UPDATE LETTNGNRLMBER SET 
+		SECU_LOGIN_FLAG = #secuLoginFlag#
+		,LAST_UPDUSR_ID = #lastUpdusrId#
+		WHERE MBER_ID = #mberId#
+    
+    </update>
+
 </sqlMap>
src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
--- src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
+++ src/main/resources/egovframework/sqlmap/let/uss/umt/EgovUserManage_SQL_Mysql.xml
@@ -1206,6 +1206,7 @@
 			
 			, A.EMAIL_YN			AS emailYN
 			, A.SMS_YN				AS smsYN
+			, A.SECU_LOGIN_FLAG     AS secuLoginFlag
 			
 		FROM
 			LETTNGNRLMBER A
src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp
--- src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp
+++ src/main/webapp/WEB-INF/jsp/web/com/webCommonHeader.jsp
@@ -41,6 +41,42 @@
 <script>
 $(document).ready(function (){
 	
+
+	$(document).on('click', '#secuLoginFlag', function () {
+
+		var secuLoginFlag = "";
+		console.log($(this).text());
+		if($(this).text() == 'ON'){
+			secuLoginFlag = 'Y'
+		}
+		else{
+			secuLoginFlag = 'N'
+		}
+		
+
+		// 디버깅용 출력
+		console.log(secuLoginFlag);
+		
+		// 동적으로 form 생성
+		var form = $('<form>', {
+		    action: '/web/user/mberSecureLogin.do', // 전송할 URL
+		    method: 'POST' // POST 방식 설정
+		});
+		
+		// form에 hidden input 추가
+		form.append($('<input>', {
+		    type: 'hidden',
+		    name: 'secuLoginFlag', // 서버에서 받을 파라미터 이름
+		    value: secuLoginFlag // 전달할 값
+		}));
+		
+		// form을 body에 추가 후 제출
+		$('body').append(form);
+		form.submit();
+		
+		
+	});
+	
 	//세션에서 종료시간을 받아와서 타이머 실행함
 	/* var timer = '${timer}';
 	if(timer != ""){
@@ -109,6 +145,14 @@
 
 	//등급제 시행 ON/OFF 체크(비로그인)
 	//getMberSettingDetailByNotLogin_Header();			
+	
+	var secuLoginFlag = '${mberManageVO.secuLoginFlag}';
+    
+    if (secuLoginFlag === 'Y') {
+        $('#secuLoginFlag').attr('class', 'state on').text('ON');
+    } else if (secuLoginFlag === 'N') {
+        $('#secuLoginFlag').attr('class', 'state off').text('OFF');
+    }
 });	
 
 //등급제 시행 ON/OFF 체크(비로그인)
@@ -816,6 +860,8 @@
 		window.open(target, 'infoPop', 'width=1110, height=700, top=100, left=100, fullscreen=no, menubar=no, status=no, toolbar=no, titlebar=yes, location=no, scrollbars=1');
 	}
 </script>
+
+
 	<div class="mask"></div>
 <c:if test="${inspYn == 'Y'}">
 	<style>
@@ -1645,6 +1691,11 @@
 		                        </div>
 		                        <button type="button" class="btnType btnType3" onclick="location.href='/web/user/mberInfoIndex.do'">마이페이지</button>
 		                        <button type="button" class="btnType btnType2" onclick="location.href='/web/uat/uia/actionLogout.do'">로그아웃</button>
+								<div class="security_box">
+									<a href="<c:out value="/web/user/mberSecureLogin.do"/>"><p class="title"><i class="icon_lock"></i>보안로그인</p></a>
+									<a href="#" id="secuLoginFlag" class="state">    </a>
+									<!-- <a href="#" class="state off">OFF</a> -->
+								</div>
 		                    </div>
 		                    <div class="login_pay">
 			                    <div class="check_money">
src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp
--- src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp
+++ src/main/webapp/WEB-INF/jsp/web/login/EgovLoginGnrlUsr.jsp
@@ -138,6 +138,7 @@
 }
 
 function actionLogin(){
+	console.log('actionLogin : actionLogin')
 
 	setTimeout(function() {
 		if (isKoreaIpAddress == false) {
@@ -180,28 +181,39 @@
 			      //alert(data.data.moblphonNo);
 			      console.log('===========');
 			      console.log(data.mberCertPhoneList);
+			  		console.log(data.passFlag);
 
 			      if (data.status=="success"){
-			    	  //번호인증팝업 띄우기
-			    	  $("#input_list_item_1").hide();
-			    	  $("#input_list_item_2").hide();
-			    	  $("#input_list_item_3").hide();
-			    	  $("#input_list_item_0").hide();
-
-			    	  $("#input_list_item_4").show();
-			    	  $("#input_list_item_5").show();
-			    	  $("#input_list_item_6").show();
-
-// 			    	  $("#hp_text2").val(data.data.moblphonNo);
-			    		var $select = $('#hp_text2');
-			    		data.mberCertPhoneList.forEach(function(item) {
-			    			$select.append($('<option>', {
-			    				value: item.mbtlnum, // option의 value 값
-			    				text: item.mbtlnum+'('+item.certAlias+')'  // option의 화면에 보이는 텍스트
-			    			}));
-			    		});
-			    	  
-			    	  
+				    	
+				    	if(data.passFlag == "Y")
+			    		{
+				    	    document.loginForm2.passFlag.value = passFlag;
+				    		actionLogin_end();
+			    		}
+				    	else
+				    	{
+					    	  
+					    	//번호인증팝업 띄우기
+					    	$("#input_list_item_1").hide();
+					    	$("#input_list_item_2").hide();
+					    	$("#input_list_item_3").hide();
+					    	$("#input_list_item_0").hide();
+		
+					    	$("#input_list_item_4").show();
+					    	$("#input_list_item_5").show();
+					    	$("#input_list_item_6").show();
+		
+		// 			    	$("#hp_text2").val(data.data.moblphonNo);
+					    	var $select = $('#hp_text2');
+					    	data.mberCertPhoneList.forEach(function(item) {
+					    		$select.append($('<option>', {
+					    			value: item.mbtlnum, // option의 value 값
+					    			text: item.mbtlnum+'('+item.certAlias+')'  // option의 화면에 보이는 텍스트
+					    		}));
+					    	});
+		
+				    	}
+				    	
 			   		}else if (data.status=="fail"){
 			   			
 			   			if (data.dormantYn=="Y"){
@@ -526,6 +538,7 @@
     <input type="hidden" name="goEventPay" value="${goEventPay}"/>
     <input type="hidden" id="hp" name="hp">
     <input type="hidden" id="num" name="num">
+    <input type="hidden" id="passFlag" name="passFlag">
     
     <div class="send_top">
 		<div class="mypage_content current">
src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp
--- src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp
+++ src/main/webapp/WEB-INF/jsp/web/user/mberSecureLogin.jsp
@@ -9,25 +9,81 @@
 
 //보안 로그인
 $(document).ready(function(){
-
+	
 	// 허용 IP 등록
 	$(".btn_allow_ip_add").click(function () {
-		if (confirm("현재 접속중인 IP를 접속 허용 IP로 등록하시겠습니까?")) {
-			alert("접속 허용 IP 등록이 완료되었습니다.");
+		
+		var ip = $('#cennectIp').val();
+		
+		if (confirm("현재 접속중인 IP["+ip+"]를 접속 허용 IP로 등록하시겠습니까?")) {
+
+			$.ajax({
+				type: "POST",
+				url: "/cert/ip/insertCennetCertIp.do",
+				data: null,
+				dataType:'json',
+				async: false,
+				success: function (returnData) {
+					
+					if(returnData.status == 'OK'){
+						alert("접속 허용 IP["+ip+"] 등록이 완료되었습니다.");
+						location.reload();  
+					}
+					else
+					{
+						alert("오류가 발생하였습니다.");
+					}
+				},
+				error: function (e) { alert("오류가 발생하였습니다."); console.log("ERROR : ", e); }
+			});
+			
 		} else {}
 	});
 
+	
+	// secuLoginFlag 값에 따라 해당하는 탭에 'on' 클래스 추가
+    if ('${mberManageVO.secuLoginFlag}' === 'Y') {
+        $('.security_tab a').filter(function() {
+            return $(this).text() === 'ON';
+        }).addClass('on');
+    } else {
+        $('.security_tab a').filter(function() {
+            return $(this).text() === 'OFF';
+        }).addClass('on');
+    }
 	// on/off 시 confirm 창 노출
-	$('.security_set .tab_depth1 a').click(function () {
-		if ($(this).text().trim() == "ON") {
-			if(!confirm("보안로그인 설정 후 로그인 시, 등록한 휴대폰번호로 추가 인증이 진행됩니다")){
-				console.log('???');
-				return false;
+	$('.security_tab a').click(function (e) {
+
+		if ($(this).hasClass("on") == false) {
+			if ($(this).text().trim() == "ON") {
+// 				if (!confirm("보안로그인 설정 후 로그인 시, 등록한 휴대폰번호로 추가 인증이 진행됩니다")) {
+				if (!confirm("보안로그인 설정 시 미리 등록한 IP로 접속하거나 휴대폰 SMS 추가 인증을 진행하셔야 합니다.")) {
+					$(this).removeClass("on");
+					$(this).siblings("a").addClass("on");
+				} else {
+					callTo();
+					$(this).addClass("on");
+					$(this).siblings("a").removeClass("on");
+				}
+			} else {
+// 				if (!confirm("가입자 휴대폰번호로 본인인증 후 해제가 가능하며, 보안로그인 설정을 해제함으로써 발생하는 손해에 대하여 회사는 책임지지 않습니다.")) {
+				if (!confirm("가입자 휴대폰번호로 본인인증 후 해제가 가능합니다. 해제 시 계정정보 유출에 따른 피해가 발생할 수 있으므로 이를 권장하지 않습니다.")) {
+					$(this).removeClass("on");
+					$(this).siblings("a").addClass("on");
+				} else {
+// 					$(this).addClass("on");
+// 					$(this).siblings("a").removeClass("on");
+					openKMCISWindow();
+				}
 			}
-		} else {
-			confirm("가입자 휴대폰번호로 본인인증 후 해제가 가능하며, 보안로그인 설정을 해제함으로써 발생하는 손해에 대하여 회사는 책임지지 않습니다.");
-			openKMCISWindow();
 		}
+		
+		
+		
+		
+		
+		
+		
 	});
 	
 	// 인증번호 발송 버튼
@@ -220,6 +276,19 @@
 
 	findAllCertIp();
 	findAllCertPhone();
+	
+
+	console.log('${mberCertLoginLogVO.secuLoginFlag}');
+	var secuLoginFlag = '${mberCertLoginLogVO.secuLoginFlag}';
+	if(secuLoginFlag == 'Y'){
+		console.log('????????Y')
+		$('#secuOffBtn').click();
+	}else if(secuLoginFlag == 'N'){
+		console.log('????????N')
+		$('#secuOnBtn').click();
+		
+	}
+	
 });
 
 function fn_phoneSave(obj){
@@ -274,6 +343,7 @@
 		dataType:'json',
 		async: false,
 		success: function (returnData) {
+			console.log('returnData : ', returnData);
 			if(returnData.status == 'OK'){
 				$('.tooltip-close').click()
 				alert(returnData.message);
@@ -440,7 +510,11 @@
 //IP 삭제
 function deleteRow(p_ip){
 
+
+	var myIp = $('#cennectIp').val();
 	console.log('p_ip : ', p_ip);
+	
+	
 	var params = {
 		"certIp" : p_ip
 	}
@@ -455,6 +529,11 @@
 		async: false,
 		success: function (returnData) {
 			if(returnData.status == 'OK'){
+				if(myIp == p_ip){
+					location.reload();
+					
+				}
+				
 				findAllCertIp();
 			}
 			else
@@ -499,13 +578,46 @@
 
 //자식창에서 호출
 function callTo() {
-	alert("호출입니다.");
+	$.ajax({
+        url: '/web/user/mberSecureLoginAjax.do',
+        type: 'POST',
+        contentType: 'application/json',
+        data: JSON.stringify({
+        	secuLoginFlag: '${mberManageVO.secuLoginFlag}'
+        }),
+        success: function(response) {
+			if(response === 'success'){
+				alert('변경이 완료되었습니다.');
+				location.reload();
+			}else{
+				alert('변경에 실패했습니다. 다시 시도해 주세요.');
+				location.reload();
+			}
+    		
+        },
+        error: function(error) {
+        	alert("error");
+        }
+    });
+}
+
+function linkPage(pageNo){
+	var listForm = document.listForm ;
+	listForm.pageIndex.value = pageNo ;
+	listForm.submit();
 }
 
 //휴대푠 번호 등록 [끝]--------------------------------------------------------------------------------------------
 
 </script>
-
+<form name="reqKMCISForm" method="post" action="#">
+	<input type="hidden" id="tr_url" name="tr_url" value = "${certVO.tr_url}">
+	<input type="hidden" id="tr_add" name="tr_add" value = "${certVO.tr_add}">
+	<input type="hidden" id="tr_cert" name="tr_cert" value = "${certVO.tr_cert}">
+</form>
+<form name="listForm" action="<c:url value='/web/user/mberSecureLogin.do'/>" method="post">
+	<input name="pageIndex" type="hidden" value="<c:out value='${mberCertLoginLogVO.pageIndex}'/>"/>
+</form>
 	<div class="mask"></div>
 
 	<!-- 휴대폰인증 팝업 -->
@@ -538,7 +650,7 @@
 								<th>인증번호</th>
 								<td>
 									<label for="" class="label">인증번호 입력</label>
-									<input type="text" placeholder="인증번호 4자리 입력" id="certNumber" onfocus="this.placeholder=''" onblur="this.placeholder='인증번호 4자리 입력'" class="inputLight" style="width: 200px;">
+									<input type="text" placeholder="인증번호 6자리 입력" id="certNumber" onfocus="this.placeholder=''" onblur="this.placeholder='인증번호 6자리 입력'" class="inputLight" style="width: 200px;">
 									<button type="button" id="certConfirmBtn" class="btnType btnType6" style="width:90px">확인</button>
 								</td>
 							</tr>
@@ -581,18 +693,21 @@
 								<div class="title_wrap">
 									<p class="dashboard_title">보안로그인</p>
 									<div class="title_box ip_add_wrap">
-										<span>현재 접속중인 IP : <b>000.000.000.00</b></span>
-										<button type="button" class="btnType btnType6 btn_allow_ip_add">허용 IP 등록</button>
+										<span>현재 접속중인 IP : <b><c:out value="${cennectIP }"/> <c:if test="${chkcertRegIP }"> [허용 IP] </c:if> </b></span>
+										<input type="hidden" id="cennectIp" value="<c:out value="${cennectIP }"/>"/>
+										<c:if test="${!chkcertRegIP }">
+											<button type="button" class="btnType btnType6 btn_allow_ip_add">허용 IP 등록</button>
+										</c:if>
 									</div>
 								</div>
 
 								<div class="set_area">
 									<p class="lately_date">최근 변경일시 : <span>2024-11-01 12:49</span></p>
 
-									<div class="tab_depth1">
-<!-- 										<a href="#none" class="on">ON</a> -->
-										<a href="#none" class="on">ON</a>
-										<a href="#none">OFF</a>
+    								<input type="hidden" id="secuLoginFlag" value="${secuLoginFlag}" />
+									<div class="tab_depth1 security_tab">
+										<a href="#none" id="secuOnBtn">ON</a>
+										<a href="#none" id="secuOffBtn">OFF</a>
 									</div>
 								</div>
 							</div>
@@ -728,62 +843,19 @@
 										</tr>
 									</thead>
 									<tbody>
+										<c:forEach var="result" items="${resultList}" varStatus="status">
 										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>PC</td>
+											<td><c:out value="${result.loginDt}"/></td>
+											<td><c:out value="${result.loginIp}"/></td>
+											<td><c:out value="${result.loginDevice}"/></td>
 										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>모바일</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>PC</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>모바일</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>PC</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>모바일</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>PC</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>모바일</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>PC</td>
-										</tr>
-										<tr>
-											<td>2024-11-20 13:57:12</td>
-											<td>119.193.215.98</td>
-											<td>모바일</td>
-										</tr>
+										</c:forEach>
 									</tbody>
 								</table>
 							</div>
 							<!-- //로그인 내역 -->
 							<!-- pagination -->
-							<ul class="pagination">
+							<!-- <ul class="pagination">
 								<li class="page_first"><button><img src="/publish/images/content/page_first.png" alt=""></button></li>
 								<li class="page_prev"><button><img src="/publish/images/content/page_prev.png" alt=""></button></li>
 								<li class="on"><button>1</button></li>
@@ -798,8 +870,13 @@
 								<li><button>10</button></li>
 								<li class="page_next"><button><img src="/publish/images/content/page_next.png" alt=""></button></li>
 								<li class="page_last"><button><img src="/publish/images/content/page_last.png" alt=""></button></li>
-							</ul><!-- pagination -->
-
+							</ul>pagination
+ -->
+							<c:if test="${!empty resultList}">
+							   <ul class="pagination">
+							       <ui:pagination paginationInfo = "${paginationInfo}"  type="imageWeb" jsFunction="linkPage" />
+							   </ul>
+							</c:if>
 						</div>
 						<!-- //보안로그인 -->
 					</div>
src/main/webapp/publish/mypage_index_2024.html
--- src/main/webapp/publish/mypage_index_2024.html
+++ src/main/webapp/publish/mypage_index_2024.html
@@ -224,13 +224,14 @@
 						</div>
 						<button type="button" class="btnType btnType3">마이페이지</button>
 						<button type="button" class="btnType btnType2">로그아웃</button>
+						
 						<div class="security_box red_box">
 							<a href="#" class="title">보안로그인</a><!-- 보안로그인 클릭시 보안로그인 홈페이지로 -->
-							<span class="state off">OFF</span><!-- ON/OFF 클릭시 이벤트 발생 -->
+							<a href="#" class="state off">OFF</a><!-- ON/OFF 클릭시 이벤트 발생 -->
 						</div>
 						<div class="security_box green_box">
 							<a href="#" class="title">보안로그인</a>
-							<span class="state on">ON</span>
+							<a href="#" class="state on">ON</a>
 						</div>
 					</div>
 					<div class="login_pay">
Add a comment
List