package itn.let.uat.uia.web;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.crypto.Cipher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;
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.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import NiceID.Check.CPClient;
import egovframework.rte.fdl.cmmn.trace.LeaveaTrace;
import egovframework.rte.fdl.property.EgovPropertyService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import itn.com.cmm.ComDefaultCodeVO;
import itn.com.cmm.EgovMessageSource;
import itn.com.cmm.LoginVO;
import itn.com.cmm.captcha.CaptchaUtil;
import itn.com.cmm.service.EgovCmmUseService;
import itn.com.cmm.service.EgovFileMngService;
import itn.com.cmm.service.EgovFileMngUtil;
import itn.com.cmm.service.FileVO;
import itn.com.cmm.util.StringUtil;
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;
import itn.let.mjo.event.service.MjonEventService;
import itn.let.mjo.event.service.MjonEventVO;
import itn.let.mjo.mjocommon.MjonCommon;
import itn.let.mjo.msg.service.MjonMsgService;
import itn.let.mjo.msg.service.MjonMsgVO;
import itn.let.mjo.msgdata.service.MjonMsgDataService;
import itn.let.mjo.msgdata.service.MjonMsgReturnVO;
import itn.let.mjo.msgdata.web.MjonMsgDataController;
import itn.let.mjo.msgsent.service.MjonMsgSentService;
import itn.let.mjo.msgsent.service.MjonMsgSentVO;
import itn.let.mjo.pay.service.KmcVO;
import itn.let.mjo.pay.service.MjonPayService;
import itn.let.sym.grd.service.MberGrdService;
import itn.let.sym.grd.service.MberGrdVO;
import itn.let.sym.log.clg.service.EgovLoginLogService;
import itn.let.sym.log.clg.service.LoginLog;
import itn.let.sym.mnu.mpm.service.MenuManageJTreeVO;
import itn.let.sym.site.service.EgovSiteManagerService;
import itn.let.sym.site.service.JoinSettingVO;
import itn.let.sym.site.service.SiteManagerVO;
import itn.let.sym.site.service.TermsVO;
import itn.let.uat.uap.service.EgovLoginPolicyService;
import itn.let.uat.uap.service.LoginPolicyVO;
import itn.let.uat.uia.service.AuthCertVO;
import itn.let.uat.uia.service.EgovLoginService;
import itn.let.uss.umt.service.EgovMberManageService;
import itn.let.uss.umt.service.EgovUserManageService;
import itn.let.uss.umt.service.MberManageConfigVO;
import itn.let.uss.umt.service.MberManageVO;
import itn.let.uss.umt.service.UserDefaultVO;
import itn.let.uss.umt.service.UserGuestVO;
import itn.let.uss.umt.service.UserManageVO;
import itn.let.utl.fcc.service.EgovCryptoUtil;
import itn.let.utl.fcc.service.EgovStringUtil;
import itn.let.utl.sim.service.EgovClntInfo;
import itn.let.utl.user.service.MjonNoticeSendUtil;
import itn.let.utl.user.service.MjonSmsCertSendUtil;

/**
 * 일반 로그인, 인증서 로그인을 처리하는 컨트롤러 클래스
 * 
 * @author 공통서비스 개발팀 박지욱
 * @since 2009.03.06
 * @version 1.0
 * @see
 *
 *      <pre>
 * << 개정이력(Modification Information) >>
 *
 *   수정일      수정자          수정내용
 *  -------    --------    ---------------------------
 *  2009.03.06  박지욱          최초 생성
 *  2011.08.31  JJY            경량환경 템플릿 커스터마이징버전 생성
 *
 *      </pre>
 */
@Controller
public class EgovLoginController {

	static String RSA_WEB_KEY = "_RSA_WEB_Key_"; // 개인키 session key
	static String RSA_INSTANCE = "RSA"; // rsa transformation

	/** 네이버 인증 관련 */
	@Value("#{globalSettings['Globals.itn.naver.clentId']}")
	private String itnNaverClientId;
	@Value("#{globalSettings['Globals.itn.naver.clientSecret']}")
	private String itnNaverClientSecret;
	@Value("#{globalSettings['Globals.itn.naver.returnUrl']}")
	private String itnNaverReturnUrl;

	/** 카카오 인증 관련 */
	@Value("#{globalSettings['Globals.itn.kakao.restApiKey']}")
	private String itnKakaoRestApiKey;
	@Value("#{globalSettings['Globals.itn.kakao.returnUrl']}")
	private String itnKakaoReturnUrl;

	/** EgovLoginService */
	@Resource(name = "loginService")
	private EgovLoginService loginService;

	/** EgovMessageSource */
	@Resource(name = "egovMessageSource")
	EgovMessageSource egovMessageSource;

	/** EgovLoginPolicyService */
	@Resource(name = "egovLoginPolicyService")
	EgovLoginPolicyService egovLoginPolicyService;

	/** EgovPropertyService */
	@Resource(name = "propertiesService")
	protected EgovPropertyService propertiesService;

	/** TRACE */
	@Resource(name = "leaveaTrace")
	LeaveaTrace leaveaTrace;

	@Resource(name = "EgovLoginLogService")
	private EgovLoginLogService loginLogService;

	@Resource(name = "egovSiteManagerService")
	private EgovSiteManagerService egovSiteManagerService;

	/** userManageService */
	@Resource(name = "userManageService")
	private EgovUserManageService userManageService;

	/** mberManageService */
	@Resource(name = "mberManageService")
	private EgovMberManageService mberManageService;

	@Resource(name = "hackIpService")
	private HackIpService hackIpService;

	@Resource(name = "EgovCmmUseService")
	private EgovCmmUseService cmmUseService;

	@Resource(name = "EgovFileMngUtil")
	private EgovFileMngUtil fileUtil;

	@Resource(name = "EgovFileMngService")
	private EgovFileMngService fileMngService;

	@Resource(name = "mjonMsgService")
	private MjonMsgService mjonMsgService;

	@Resource(name = "MjonMsgDataService")
	private MjonMsgDataService mjonMsgDataService;

	@Resource(name = "egovCryptoUtil")
	EgovCryptoUtil egovCryptoUtil;
	
	@Resource(name = "MjonMsgSentService")
    private MjonMsgSentService mjonMsgSentService;

	/** 알림전송 Util */
	@Resource(name = "mjonNoticeSendUtil")
	private MjonNoticeSendUtil mjonNoticeSendUtil;
	
	@Resource(name = "MjonSmsCertSendUtil")
	private MjonSmsCertSendUtil mjonSmsCertSendUtil;
	
	@Resource(name="MjonCommon")
	private MjonCommon mjonCommon;

	@Resource(name = "MjonEventService")
    private MjonEventService mjonEventService;
	
	@Resource(name = "mjonPayService")
	private MjonPayService mjonPayService;    
	
	@Resource(name = "mberGrdService")
	MberGrdService mberGrdService;

	@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);

	/* 문자온 사용자 로그인 시작 */
	// 회원가입 1뎁스 - 개인/기업 선택
	@RequestMapping(value = "/web/user/login/selectUserDept.do")
	public String selectUserDept(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/";
		
		// B선라인
		String blineCode = request.getParameter("blineCode");
		if (blineCode != null && blineCode.length() != 0){
		}
		else {
			blineCode = "N";			
		}
		model.addAttribute("blineCode", blineCode);
		
		return "web/login/usrSelectDept";
	}

	// 회원가입 2뎁스 - 약관 동의
	@RequestMapping(value = "/web/user/login/checkTerms.do")
	public String checkTerms(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO, TermsVO termsVO, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/";
		//URL을 이용한 비정상적인 접근 차단
		if("".equals(mberManageVO.getDept()) || mberManageVO.getDept() == null) {
			redirectAttributes.addFlashAttribute("message", "잘못된 경로로 접속하여 메인화면으로 이동됩니다");
			return "redirect:/web/main/mainPage.do";
		}
		// 본인인증 방식 선택 정보 불러오기
		JoinSettingVO joinSettingVO = egovSiteManagerService.selectJoinCertTypeDetail();
		model.addAttribute("joinSettingVO", joinSettingVO);
		// 약관 사용메뉴 - 01:회원가입
		termsVO.setMenuNm("01");
		List<TermsVO> termsList = new ArrayList<TermsVO>();
		termsList = egovSiteManagerService.selectTermsMenu(termsVO);

		model.addAttribute("termsList", termsList);

		// 나이스 본인인증
		/*
		 * String referer = (String) request.getHeader("REFERER");
		 * 
		 * URL newURL = new URL(referer);
		 * 
		 * String protocol = newURL.getProtocol() + "://"; String host =
		 * newURL.getHost();
		 * 
		 * String succUrl = protocol + host + "/web/user/login/niceCheckAjax.do"; // 성공시
		 * 이동할 URL - String failUrl = protocol + host +
		 * "/web/user/login/selectUserDept.do";
		 * 
		 * mberManageVO.setNiceSuccUrl(succUrl); mberManageVO.setNiceFailUrl(failUrl);
		 */
		model.addAttribute("mberManageVO", mberManageVO);

		// KMC 본인인증 데이터 불러오기
		// 핸드폰인증만 사용할 시
		if (joinSettingVO.getJoinCertType().equals("M")) {

			KmcCertChecker kmcCertCheck = new KmcCertChecker();

			// kmc 본인인증 실/개발 서버 구분
			String serverNm = "";
			if (request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
				serverNm = request.getScheme() + "://219.240.88.15:8095";
			}else if(request.getRequestURL().toString().contains("www.")){
				serverNm = request.getScheme() + "://www.munjaon.co.kr";
			}
			else {
				serverNm = request.getScheme() + "://munjaon.co.kr";
			}

			AuthCertVO certVO = kmcCertCheck.authCertCheck(serverNm + "/web/cop/kmc/authRequestAjax.do");

			model.addAttribute("tr_cert", certVO.getTr_cert());
			model.addAttribute("tr_url", certVO.getTr_url());
			model.addAttribute("tr_add", certVO.getTr_add());

		}

		// B선라인
		String blineCode = request.getParameter("blineCode");
		if (blineCode != null && blineCode.length() != 0){
		}
		else {
			blineCode = "N";			
		}
		model.addAttribute("blineCode", blineCode);
		
		return "web/login/usrCheckTerms";
	}

	// 회원가입 - 정보 입력 후 KMC 팝업에 삽입
	@RequestMapping(value = "/web/user/login/kmcPopupAjax.do")
	public ModelAndView kmcPopupAjax(@ModelAttribute("mberManageVO") MberManageVO mberManageVO, ModelMap model,
			HttpSession session, @RequestParam Map<String, Object> commandMap, HttpServletRequest request)
			throws Exception {

		System.out.println("++++++++++++ 세션체크 ::: " + (MberManageVO) session.getAttribute("mberSession"));

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		KmcCertChecker kmcCertCheck = new KmcCertChecker();

		// kmc 본인인증 실/개발 서버 구분
		String serverNm = "";
		if (request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
			serverNm = request.getScheme() + "://219.240.88.15:8095";
		} else {
			serverNm = request.getScheme() + "://www.munjaon.co.kr";
		}

		AuthCertVO certVO = kmcCertCheck.authCertCheckTwo(serverNm + "/web/cop/kmc/authRequestAjax.do",
				mberManageVO.getMberNm(), mberManageVO.getMoblphonNo(), mberManageVO.getSexdstnCode(),
				mberManageVO.getNationality(), mberManageVO.getBirth());

		System.out.println("++++++++++++ 세션체크222 ::: " + (MberManageVO) session.getAttribute("mberSession"));

		/*
		 * model.addAttribute("tr_cert", certVO.getTr_cert());
		 * model.addAttribute("tr_url", certVO.getTr_url());
		 * model.addAttribute("tr_add", certVO.getTr_add());
		 */
		modelAndView.addObject("tr_cert", certVO.getTr_cert());
		modelAndView.addObject("tr_url", certVO.getTr_url());
		modelAndView.addObject("tr_add", certVO.getTr_add());

		return modelAndView;
	}

	// 회원가입 3뎁스 - 정보입력
	@RequestMapping(value = "/web/user/login/insertUsrView.do")
	public String insertUsrView(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO, TermsVO termsVO, ModelMap model,
			HttpSession session, JoinSettingVO joinSettingVO, RedirectAttributes redirectAttributes) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/cmm/main/mainPage.do";

		//URL을 이용한 비정상적인 접근 차단
		if("".equals(mberManageVO.getDept()) || mberManageVO.getDept() == null  || "".equals(mberManageVO.getMblDn()) || mberManageVO.getMblDn() == null) {
			redirectAttributes.addFlashAttribute("message", "잘못된 경로로 접속하여 메인화면으로 이동됩니다");
			return "redirect:/web/main/mainPage.do";
		}
		
		System.out.println("++++++++++++ 세션체크 ::: " + (MberManageVO) session.getAttribute("mberSession"));
		if (null == session.getAttribute("mberSession")) { // 세션이 없을 시 메인화면으로 팅김
			redirectAttributes.addFlashAttribute("message", "쿠키 설정을 확인하세요.");
			return "redirect:/";
		}

		// 이메일 코드조회
		ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
		voComCode.setCodeId("ITN031");
		model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode));

		// 방문경로 코드조회
		voComCode.setCodeId("ITN025");
		model.addAttribute("visitRoute", cmmUseService.selectCmmCodeDetail(voComCode));

		// 기업유형 코드조회
		voComCode.setCodeId("ITN033");
		model.addAttribute("bizTypeCode", cmmUseService.selectCmmCodeDetail(voComCode));

		// 본인인증 방식 선택 정보 불러오기
		JoinSettingVO joinCertType = egovSiteManagerService.selectJoinCertTypeDetail();
		String joinType = joinCertType.getJoinCertType();
		model.addAttribute("joinType", joinType);

		// 본인인증
		// 회원타입(개인,기업) 담아둔 세션 조회
		session = request.getSession();
		MberManageVO mberSessionVO = (MberManageVO) session.getAttribute("mberSession");

		if (joinType.equals("M") || joinType.equals("A")) {

			// 크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해
			// samesite 보안을 none처리
			/*
			 * response.setHeader("Set-Cookie",
			 * "AuthKmcCertVO=AuthKmcCertVO; Secure; SameSite=None"); //KMC 문자 본인인증 세션 정보
			 * 받아오기 AuthCertVO certKmcVO = (AuthCertVO)
			 * session.getAttribute("AuthKmcCertVO");
			 * 
			 * if(certKmcVO != null) {
			 * 
			 * mberManageVO.setNiceNm(certKmcVO.getCertName()); //본인인증 이름
			 * mberManageVO.setMoblphonNo(certKmcVO.getCertPhone()); //본인인증 핸드폰
			 * mberManageVO.setMblDn(certKmcVO.getCertDi()); //본인인증 중복가입방지 번호
			 * mberManageVO.setNationality(certKmcVO.getCertNation());
			 * mberManageVO.setBirthDay(certKmcVO.getBirthDay());
			 * mberManageVO.setSexdstnCode(certKmcVO.getSexdstnCode());
			 * 
			 * }
			 */

		} else {

			// ARS 전화 본인인증 세션 정보 받아오기
			AuthCertVO certArsVO = (AuthCertVO) session.getAttribute("AuthARSCertVO");

			if (certArsVO != null) {

				mberManageVO.setMoblphonNo(certArsVO.getCertPhone()); // 본인인증 핸드폰

			}

		}

		model.addAttribute("mberSessionVO", mberSessionVO);

		// 나이스 본인인증을 했을때 세션처리 후 데이터 저장해주기.
		/*
		 * MberManageVO VO = new MberManageVO(); if (null !=
		 * request.getSession().getAttribute("userSearchVO")) { // 세션체크 VO =
		 * ((MberManageVO) request.getSession().getAttribute("userSearchVO"));
		 * mberManageVO.setNiceNm(VO.getNiceNm()); // 이름
		 * mberManageVO.setSexdstnCode(VO.getSexdstnCode()); // 성별
		 * mberManageVO.setMoblphonNo(VO.getMoblphonNo()); // 핸드폰번호
		 * mberManageVO.setBirthDay(VO.getBirthDay()); // 생년월일
		 * mberManageVO.setMblDn(VO.getMblDn()); // 모바일 인증키
		 * session.removeAttribute("userSearchVO"); }
		 */
		model.addAttribute("mberManageVO", mberManageVO);

		// B선라인
		String blineCode = request.getParameter("blineCode");
		if (blineCode != null && blineCode.length() != 0){
		}
		else {
			blineCode = "N";			
		}
		model.addAttribute("blineCode", blineCode);
		
		return "web/login/usrInsertView";
	}

	// 회원가입 3뎁스 - 정보입력	-	2023-01-25 사업자등록번호 비교 방식 변경으로 추가함
	@RequestMapping(value = "/web/user/login/new_insertUsrView.do")
	public String new_insertUsrView(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO, TermsVO termsVO, ModelMap model,
			HttpSession session, JoinSettingVO joinSettingVO, RedirectAttributes redirectAttributes) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/cmm/main/mainPage.do";

		//URL을 이용한 비정상적인 접근 차단
		if("".equals(mberManageVO.getDept()) || mberManageVO.getDept() == null  || "".equals(mberManageVO.getMblDn()) || mberManageVO.getMblDn() == null) {
			redirectAttributes.addFlashAttribute("message", "잘못된 경로로 접속하여 메인화면으로 이동됩니다");
			return "redirect:/web/main/mainPage.do";
		}
		
		System.out.println("++++++++++++ 세션체크 ::: " + (MberManageVO) session.getAttribute("mberSession"));
		if (null == session.getAttribute("mberSession")) { // 세션이 없을 시 메인화면으로 팅김
			redirectAttributes.addFlashAttribute("message", "쿠키 설정을 확인하세요.");
			return "redirect:/";
		}

		// 이메일 코드조회
		ComDefaultCodeVO voComCode = new ComDefaultCodeVO();
		voComCode.setCodeId("ITN031");
		model.addAttribute("emailCode", cmmUseService.selectCmmCodeDetail(voComCode));

		// 방문경로 코드조회
		voComCode.setCodeId("ITN025");
		model.addAttribute("visitRoute", cmmUseService.selectCmmCodeDetail(voComCode));

		// 기업유형 코드조회
		voComCode.setCodeId("ITN033");
		model.addAttribute("bizTypeCode", cmmUseService.selectCmmCodeDetail(voComCode));

		// 본인인증 방식 선택 정보 불러오기
		JoinSettingVO joinCertType = egovSiteManagerService.selectJoinCertTypeDetail();
		String joinType = joinCertType.getJoinCertType();
		model.addAttribute("joinType", joinType);

		// 본인인증
		// 회원타입(개인,기업) 담아둔 세션 조회
		session = request.getSession();
		MberManageVO mberSessionVO = (MberManageVO) session.getAttribute("mberSession");

		if (joinType.equals("M") || joinType.equals("A")) {

			// 크롬 SameSite정책 방지 - 도메인이 다른 타사로 이동 시 크롬 정책에 의해 세션 유실이 일어나는 경우가 있는데, 이를 방지하기 위해
			// samesite 보안을 none처리
			/*
			 * response.setHeader("Set-Cookie",
			 * "AuthKmcCertVO=AuthKmcCertVO; Secure; SameSite=None"); //KMC 문자 본인인증 세션 정보
			 * 받아오기 AuthCertVO certKmcVO = (AuthCertVO)
			 * session.getAttribute("AuthKmcCertVO");
			 * 
			 * if(certKmcVO != null) {
			 * 
			 * mberManageVO.setNiceNm(certKmcVO.getCertName()); //본인인증 이름
			 * mberManageVO.setMoblphonNo(certKmcVO.getCertPhone()); //본인인증 핸드폰
			 * mberManageVO.setMblDn(certKmcVO.getCertDi()); //본인인증 중복가입방지 번호
			 * mberManageVO.setNationality(certKmcVO.getCertNation());
			 * mberManageVO.setBirthDay(certKmcVO.getBirthDay());
			 * mberManageVO.setSexdstnCode(certKmcVO.getSexdstnCode());
			 * 
			 * }
			 */

		} else {

			// ARS 전화 본인인증 세션 정보 받아오기
			AuthCertVO certArsVO = (AuthCertVO) session.getAttribute("AuthARSCertVO");

			if (certArsVO != null) {

				mberManageVO.setMoblphonNo(certArsVO.getCertPhone()); // 본인인증 핸드폰

			}

		}

		model.addAttribute("mberSessionVO", mberSessionVO);

		// 나이스 본인인증을 했을때 세션처리 후 데이터 저장해주기.
		/*
		 * MberManageVO VO = new MberManageVO(); if (null !=
		 * request.getSession().getAttribute("userSearchVO")) { // 세션체크 VO =
		 * ((MberManageVO) request.getSession().getAttribute("userSearchVO"));
		 * mberManageVO.setNiceNm(VO.getNiceNm()); // 이름
		 * mberManageVO.setSexdstnCode(VO.getSexdstnCode()); // 성별
		 * mberManageVO.setMoblphonNo(VO.getMoblphonNo()); // 핸드폰번호
		 * mberManageVO.setBirthDay(VO.getBirthDay()); // 생년월일
		 * mberManageVO.setMblDn(VO.getMblDn()); // 모바일 인증키
		 * session.removeAttribute("userSearchVO"); }
		 */
		model.addAttribute("mberManageVO", mberManageVO);

		return "web/login/new_usrInsertView";
	}
	
	// 회원가입 - 가입처리
	@RequestMapping(value = "/web/user/login/usrJoinInsertAjax.do")
	public ModelAndView insertUsr(@ModelAttribute("mberManageVO") MberManageVO mberManageVO, HttpServletRequest request,
			HttpServletResponse response, ModelMap model, @RequestParam Map<String, Object> commandMap,
			HttpSession session, RedirectAttributes redirectAttributes, JoinSettingVO joinSettingVO,
			final MultipartHttpServletRequest multiRequest) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		//비밀번호 규칙성 검증 추가 - 취약점 조치
		mberManageVO.setPassword(mberManageVO.getPassword().trim());
		String passWord = mberManageVO.getPassword();
		
		if(passWord.length() < 8  || passWord.length() > 20) {
			modelAndView.addObject("resultSts", "passWordFail");
			return modelAndView;
		}
		
        Pattern digitPattern = Pattern.compile("[0-9]");
        Matcher digitMatcher = digitPattern.matcher(passWord);
        boolean hasDigit = digitMatcher.find();

        Pattern letterPattern = Pattern.compile("[a-zA-Z]");
        Matcher letterMatcher = letterPattern.matcher(passWord);
        boolean hasLetter = letterMatcher.find();

        Pattern specialPattern = Pattern.compile("[`~!@@#$%^&*|\\\\'\";:/?]");
        Matcher specialMatcher = specialPattern.matcher(passWord);
        boolean hasSpecialCharacter = specialMatcher.find();
        
        
		if(hasDigit == false || hasLetter == false || hasSpecialCharacter == false) {
			modelAndView.addObject("resultSts", "passWordFail");
			return modelAndView;
		}
		
		
		// 사업자등록증 업로드
		List<FileVO> result = null;
		String wAtchFileId = ""; //사업자등록증 첨부파일 ID 
		String cAtchFileId = ""; //재직증명서 첨부파일 ID 

		final Map<String, MultipartFile> files = multiRequest.getFileMap();
		//다중 업로드 처리
		Map<String, MultipartFile> fileC = new LinkedHashMap<>(); //사업자등록증 
		Map<String, MultipartFile> fileW = new LinkedHashMap<>(); //재직증명서
		
		if (!files.isEmpty()) {
			
			Iterator<Map.Entry<String, MultipartFile>> it = files.entrySet().iterator();
			int cIndex = 0;
			int wIndex = 0;
			while(it.hasNext()) {
				
				Map.Entry<String, MultipartFile> entry = it.next();
				MultipartFile mFile = entry.getValue();
				
				if(entry.getKey().equals("file")) {	//사업자등록증 - jsp에서 넘겨준 input type="file"의 name
					
					fileC.put("fileC" + cIndex, mFile);
					cIndex++;
					
				}
				
				if(entry.getKey().equals("fileWork")) {	//재직증명서 - jsp에서 넘겨준 input type="file"의 name
					
					fileW.put("fileW" + wIndex, mFile);
					wIndex++;
					
				}
				
			}
			
			if(fileC != null) { // 사업자등록증
				
				List<FileVO> resultC = fileUtil.parseFileInf(fileC, "BIZ_", 0, "", "", "");
				wAtchFileId = fileMngService.insertFileInfs(resultC);
				mberManageVO.setAtchFileId(wAtchFileId);
				
			}
			
			if(fileW != null) { // 재직증명서 첨부파일
				
				List<FileVO> resultW = fileUtil.parseFileInf(fileW, "WORK_", 0, "", "", "");
				cAtchFileId = fileMngService.insertFileInfs(resultW);
				mberManageVO.setWorkAtchFileId(cAtchFileId);
				
			}
			

		}

		// 신규 회원 문자단가 기본 설정값 // 2021.05.21 기본값을 설정하지 않고, 단가가 다른 회원만 해당 값을 넣어줌. 문자 보낼 때
		// 해당 필드가 비어있으면 기본단가 테이블에서 기본 가격을 가지고오기로 수정
		// joinSettingVO = egovSiteManagerService.selectJoinSetting();
		// mberManageVO.setShortPrice(joinSettingVO.getShortPrice());
		// mberManageVO.setLongPrice(joinSettingVO.getLongPrice());
		// mberManageVO.setPicturePrice(joinSettingVO.getPicturePrice());

//		// 사업자등록 등록시 첨부파일ID 설정
//		mberManageVO.setAtchFileId(atchFileId);
		int resultUsr = 0;
		try {

			String mberId = mberManageVO.getMberId();
			String mberNm = mberManageVO.getMberNm();

			// 내외국인 구분값이 없으면 내국인(0)으로 값 세팅
			if (StringUtil.isEmpty(mberManageVO.getNationality())) {
				mberManageVO.setNationality("0");
			}

			//아이디 소문자 변환
			mberManageVO.setMberId(mberManageVO.getMberId().toLowerCase());
			// 회원정보 디비 입력
			resultUsr = mberManageService.insertUsr(mberManageVO);
			
			try {
				// 기업회원일 시 기업회원 정보 내역에 입력
				if("c".equals(mberManageVO.getDept().trim())) {
					mberManageVO.setHstType("01"); //유형 1.회원가입 2.기업회원전환 3.기업정보변경 (공통코드)
					mberManageVO.setHstSttus("01"); //상태 1.신청 2.승인 3.반려 (공통코드)
					mberManageService.insertCmpUsrHst(mberManageVO);
				}				
			}catch(Exception ex) {
				System.out.println("#############################################################");
				if (null != mberManageVO && null != mberManageVO.getMberId()) {
					System.out.println("회원가입 => 기업회원가입 아이디 : " + mberManageVO.getMberId());
				}
				System.out.println("회원가입 => 기업회원가입 오류 : " + ex.getMessage());
				
				ex.printStackTrace();
			}

			// 본인인증 방식 선택 정보 불러오기
			JoinSettingVO joinCertType = egovSiteManagerService.selectJoinCertTypeDetail();
			String joinType = joinCertType.getJoinCertType();

			// 본인인증 확인용
			session = request.getSession();

			// 회원 세션 정보 받아오기
			// MberManageVO mberSessionVO = (MberManageVO)
			// session.getAttribute("mberSession");

			if (joinType.equals("A")) { // 회원인증이 ARS 전화 + KMC 문자인증 둘다 하는경우

				// ARS 본인인증 세션정보 받아오기
				AuthCertVO certArsVO = (AuthCertVO) session.getAttribute("AuthARSCertVO");

				// 회원 아이디/이름 저장하기
				certArsVO.setMberId(mberId);
				certArsVO.setCertName(mberNm);

				// 디비 테이블에 저장하기
				mberManageService.insertCertInfoLog(certArsVO);

				// 전화 인증 세션 삭제
				session.removeAttribute("AuthARSCertVO");

				//세션 이슈로 인한 세션 삭제, 로그는 본인인증 시 insert되며 로그 테이블 idx를 가져와 회원가입 시 로그 데이터의 mberId 업데이트 처리
				
				// KMC 문자 본인인증 세션 정보 받아오기
				// AuthCertVO certKmcVO = (AuthCertVO) session.getAttribute("AuthKmcCertVO");
				// 회원아이디 저장하기
				AuthCertVO certKmcVO = new AuthCertVO();
				certKmcVO.setMberId(mberId);
				// 디비 테이블에 저장하기
				mberManageService.insertCertInfoLog(certKmcVO);

				// 문자 인증 세션 삭제
				// session.removeAttribute("AuthKmcCertVO");

			} else if (joinType.equals("P")) { // 회원인증이 ARS 전화인증만 하는 경우

				// ARS 본인인증 세션정보 받아오기
				AuthCertVO certArsVO = (AuthCertVO) session.getAttribute("AuthARSCertVO");

				// 회원 아이디/이름 저장하기
				certArsVO.setMberId(mberId);
				certArsVO.setCertName(mberNm);

				// 디비 테이블에 저장하기
				mberManageService.insertCertInfoLog(certArsVO);

				// 전화 인증 세션 삭제
				session.removeAttribute("AuthARSCertVO");

			} else { // 회원인증이 KMC 본인인증만 하는 경우

				// KMC 문자 본인인증 세션 정보 받아오기
				// AuthCertVO certKmcVO = (AuthCertVO) session.getAttribute("AuthKmcCertVO");
				// 회원아이디 저장하기
				//AuthCertVO certKmcVO = new AuthCertVO();
				//certKmcVO.setMberId(mberId);
				// 디비 테이블에 저장하기
				//mberManageService.insertCertInfoLog(certKmcVO);
				
				//세션 이슈로 인한 세션 삭제, 로그는 본인인증 시 insert되며 로그 테이블 idx를 가져와 회원가입 시 로그 데이터의 mberId 업데이트 처리
				mberManageService.updateCertInfoLogMberId(mberManageVO);

				// 문자 인증 세션 삭제
				// session.removeAttribute("AuthKmcCertVO");

			}

			if (resultUsr > 0) {

				redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("success.common.insert"));
				model.addAttribute("resultSts", "success");
				
				// CS관리자 이메일 & SMS 알림전송
				if("p".equals(mberManageVO.getDept())){ //개인회원

				}else{ //기업회원
					
					// 법인폰 알람여부 체크
					JoinSettingVO joinSettingVO2 = new JoinSettingVO();
					joinSettingVO2 = egovSiteManagerService.selectAdminNotiDetail();
					// 이메일 체크
					// 이메일 체크
					if (joinSettingVO2 != null && joinSettingVO2.getEmailNoti().equals("Y")) {
						String emailTitle = "회원관리 > 기업회원 가입승인 요청";

						// CS관리자 이메일 알림전송
						mjonNoticeSendUtil.csAdminEmailNoticeSend(mberManageVO.getMberNm(), mberManageVO.getMberId(), emailTitle);
					}

					// SMS 체크					
					if (joinSettingVO2 != null && joinSettingVO2.getSmsNoti().equals("Y")) {
						String smsTitle = "기업회원 가입승인 요청";
						
						// CS관리자 SMS 알림전송
						mjonNoticeSendUtil.csAdminSmsNoticeSend(mberManageVO.getMberId(), smsTitle);
					}					

					// SLACK 체크
					if (joinSettingVO2 != null && joinSettingVO2.getSlackNoti().equals("Y")) {					
						// Slack 메시지 발송(단순본문)
						String msg = "[문자온] 기업회원 가입승인 요청 - " + mberManageVO.getMberNm() +"("+ mberManageVO.getMberId() + ")";
						mjonCommon.sendSimpleSlackMsg(msg);
					}
					
				}
				
				//회원가입 안내 문자 발송
				MjonMsgVO mjonMsgVO = new MjonMsgVO();
				String contents = "";
				if("p".equals(mberManageVO.getDept())){ //개인회원
					contents = "[문자온] "+mberManageVO.getMberNm()+"님의 회원가입을 진심으로 환영합니다."+System.lineSeparator()+"o 사이트 주소 : www.munjaon.co.kr"+System.lineSeparator()+"o 가입아이디 : "+mberManageVO.getMberId()+System.lineSeparator()+"인증전화번호 : "+mberManageVO.getMoblphonNo()+System.lineSeparator()+"※ 본인이 직접 가입하지 않은 경우 문자온 고객센터(1551-8011)로 즉시 연락주시기 바랍니다."+System.lineSeparator()+System.lineSeparator()+"감사합니다.";
				}else{ //기업회원
					contents = "[문자온] "+mberManageVO.getMberNm()+"님의 회원가입을 진심으로 환영합니다."+System.lineSeparator()+"o 사이트 주소 : www.munjaon.co.kr"+System.lineSeparator()+"o 가입아이디 : "+mberManageVO.getMberId()+System.lineSeparator()+"인증전화번호 : "+mberManageVO.getMoblphonNo()+System.lineSeparator()+"※ 본인이 직접 가입하지 않은 경우 문자온 고객센터(1551-8011)로 즉시 연락주시기 바랍니다."+System.lineSeparator()+"※ 기업회원은 필수 제출서류 관리자 확인 후 최종 승인됩니다."+System.lineSeparator()+"감사합니다.";
				}

	    		// 문자타입별 대표전송사 정보
				mjonMsgVO.setMsgDiv("L");	// 장문
				MjonMsgVO mjonMsgVO2 = new MjonMsgVO();
				mjonMsgVO2 = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO);
				// 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술
	        	mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택			
	        	// 전송금액
				mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString());	//총금액
				mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString());	//한건 금액
				
	    		mjonMsgVO.setSmsTxt(contents); //문자 내용
	    		mjonMsgVO.setReserveYn("N");//에약문자 N
	    		mjonMsgVO.setCallFrom("15518011");//발신번호
	    		mjonMsgVO.setUserId("system"); //ID
				mjonMsgVO.setMsgType("6"); //MMS - 장문
				mjonMsgVO.setBefCash("0.0");		//관리자가 발송하는 것이라서 0원으로 입력
				
				//수신번호 배열 변환 작업
				//mjonMsgVO.setCallTo(mberManageVO.getMoblphonNo());
				String[] phone = new String[1];
				phone[0] = mberManageVO.getMoblphonNo();
				mjonMsgVO.setCallToList(phone);
				
	    		//문자종류 관리자가 발송하는 것은 msgKind : S 로 셋팅
	    		mjonMsgVO.setMsgKind("S");
	    		mjonMsgVO.setFileCnt("0");//첨부이미지 갯수
	    		
	        	if(mjonMsgVO.getAgentCode().equals("03")) {	//아이엠오 전송사 문자 타입 설정해 주기
	        		
	        		// 단순 장문 문자는 neoType : 2, 그림 포함 : 4
	        		if(mjonMsgVO.getFileCnt().equals("0")) { // 단순 장문 문자
	        			
	        			mjonMsgVO.setNeoType("2");
	        			
	        		}else{ // 그림포함 문자인경우
	        			
	        			mjonMsgVO.setNeoType("4");
	        			
	        		}
	        		
	        	}
	        	
	        	//현재 고객의 보유 캐시가 문자 발송이 가능한 금액인지 체크
	        	String userMoney = "0.0";
	        	String userPoint = "0.0";
	        	mjonMsgVO.setBefPoint(userPoint); //현재 보유 포인트 정보 저장
	        	mjonMsgVO.setBefCash("0.0");		//관리자가 발송하는 것이라서 0원으로 입력

				MjonMsgReturnVO returnVO = mjonMsgDataService.insertAdmToMberMsgDataInfo(mjonMsgVO); //실제 전송

				/*MjonMsgReturnVO returnVO = mjonMsgDataService.insertSysMsgDataInfo(mjonMsgVO); //실제 전송*/
				
				/*// 시스템 발송 로그 - insertAdmToMberMsgDataInfo에서 처리
				SendLogVO sendLogVO = new SendLogVO();
				// SendType 1:문자로 발송 2:이메일로 발송
				sendLogVO.setSendId(returnVO.getMsgGroupId());
				sendLogVO.setSendType("1");
				sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom());
				sendLogVO.setReceive(mjonMsgVO.getCallTo());
				sendLogVO.setContents(contents);

				mjonMsgDataService.insertSysMsgLog(sendLogVO);
*/			} else {
				System.out.println("#############################################################");
				System.out.println("회원가입 => 디비입력 내역없음");
	
				redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.insert"));
				model.addAttribute("resultSts", "fail");
			}

		} catch (Exception e) {
			System.out.println("#############################################################");
			if (null != mberManageVO && null != mberManageVO.getMberId()) {
				System.out.println("회원가입 아이디 : " + mberManageVO.getMberId());
			}
			System.out.println("회원가입 오류 : " + e.getMessage());
			
			redirectAttributes.addFlashAttribute("message", egovMessageSource.getMessage("fail.common.insert"));
		}
		// RedirectUrlMaker redirectUrlMaker = new
		// RedirectUrlMaker("/web/user/login/usrInsertCompl.do");
		// return redirectUrlMaker.getRedirectUrl();
		// return "web/login/usrInserCompl";
		return modelAndView;
	}

	// 회원가입 - 중복ID 체크 Ajax
	@RequestMapping(value = "/web/user/login/usrIdCheckAjax.do")
	public ModelAndView selectUsrIdCheckAjax(@ModelAttribute("mberManageVO") MberManageVO mberManageVO,
			@RequestParam Map<String, Object> commandMap) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		String mberId = (String) commandMap.get("mberId");
		//소문자로 변환
		mberId =  mberId.toLowerCase();
		List<String> checkId = new ArrayList<String>();
		
		//회원가입시 특정 아이디 사용 못하도록 제한 - 시스템에서 사용하는 단어 입력 금지시킴 20220603 우영두 추가
		if(mberId.contains("system") 
				|| mberId.contains("test") 
				|| mberId.contains("admin") 
				|| mberId.contains("user")) {
			
			checkId.add("1");
			
		}else {
			checkId = mberManageService.selectIdCheck(mberId);
		}

		modelAndView.addObject("checkIdCnt", checkId.size());

		return modelAndView;
	}

	// 회원가입 - 모바일인증 중복 체크 Ajax, 만 18세 체크
	@RequestMapping(value = "/web/user/login/mblDnCheckAjax.do")
	public ModelAndView selectMblDnCheckAjax(@ModelAttribute("mberManageVO") MberManageVO mberManageVO,
			@RequestParam Map<String, Object> commandMap) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try{
			//중복체크
			String mblDn = (String) commandMap.get("mblDn");

			List<String> checkMblDn = new ArrayList<String>();
			checkMblDn = mberManageService.selectMblDnCheck(mblDn);

			modelAndView.addObject("checkMblDnCnt", checkMblDn.size());
			
			//만 나이
			String birthDay = (String) commandMap.get("birthDay");
			LocalDate now = LocalDate.now();
			LocalDate parsedBirthDate = LocalDate.parse(birthDay, DateTimeFormatter.ofPattern("yyyyMMdd"));
		 
			int age = now.minusYears(parsedBirthDate.getYear()).getYear(); // (1)
		 
			if (parsedBirthDate.plusYears(age).isAfter(now)) { 
				age = age -1;
			}
			modelAndView.addObject("age", age);			
		}catch(Exception ex){
			ex.printStackTrace();
		}

		
		return modelAndView;
	}

	// 회원가입 - 가입 완료 후 화면
	@RequestMapping(value = "/web/user/login/usrJoinComplete.do")
	public String selectUserComplete(@ModelAttribute("mberManageVO") MberManageVO mberManageVO, ModelMap model,
			HttpSession session) throws Exception {

		LoginVO loginVo = (LoginVO) session.getAttribute("LoginVO");
		model.addAttribute("mberManageVO", loginVo);

		return "web/login/usrInserCompl";
	}

	// 회원가입 - 가입 완료 후 화면 (기업회원)
	@RequestMapping(value = "/web/user/login/usrJoinMemShipComplete.do")
	public String selectUserMemberShipComplete(@ModelAttribute("mberManageVO") MberManageVO mberManageVO, ModelMap model,
			HttpSession session) throws Exception {

		/*LoginVO loginVo = (LoginVO) session.getAttribute("LoginVO");
		model.addAttribute("mberManageVO", loginVo);*/

		return "web/login/usrInserMemShipCompl";
	}

	/*
	*//**
		 * (관리자)로그인 화면으로 들어간다
		 * 
		 * @param vo
		 *            - 로그인후 이동할 URL이 담긴 LoginVO
		 * @return 로그인 페이지
		 * @exception Exception
		 *//*
			 * @RequestMapping(value = "/uat/uia/egovLoginUsr.do") public String
			 * loginUsrView(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletRequest
			 * request, HttpServletResponse response, ModelMap model) throws Exception {
			 * return "uat/uia/EgovLoginUsr"; }
			 */

	/**
	 * (관리자) 로그인 화면.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/uat/uia/EgovLoginUsr.do")
	public String adminLogin(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/cmm/main/mainPage.do";
		initRsa(request);
		return "uat/uia/EgovLoginUsr";
	}

	/**
	 * (사용자) 로그인 화면.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/login/login.do")
	public String userLogin(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@RequestParam Map<String, Object> commandMap, HttpSession session) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/";

		// 로그인필요 URL 호출하여 온경우
		String beforeUrl = (String) commandMap.get("beforeUrl");
		String message = (String) commandMap.get("message");
		String goEventPay = (String) commandMap.get("goEventPay");
		
		// sns 회원가입 key 값 설정
		String naverClientId = itnNaverClientId;
		String naverClientSecret = itnNaverClientSecret;

		String kakaoRestApiKey = itnKakaoRestApiKey;
		String kakaoReturnUrl = itnKakaoReturnUrl;

		// config 정보 가져오기
		MberManageConfigVO mberConfigVO = new MberManageConfigVO();

		List<MberManageConfigVO> mberManageCnfVO = mberManageService.selectMberCnf(mberConfigVO);

		/*for (int i = 0; i < mberManageCnfVO.size(); i++) {
			if (mberManageCnfVO.get(i).getIsSns().equals("Y")) {
				if (mberManageCnfVO.get(i).getUseYn().equals("Y")) {
					if (mberManageCnfVO.get(i).getConfigId().equals("snsNaver")) {
						String redirectURI = URLEncoder.encode(itnNaverReturnUrl, "UTF-8");
						SecureRandom random = new SecureRandom();
						BigInteger state = new BigInteger(130, random);
						String naver_url = "https://nid.naver.com/oauth2.0/authorize?response_type=code";
						naver_url += "&client_id=" + itnNaverClientId;
						naver_url += "&redirect_url=" + redirectURI;
						naver_url += "&state=" + state;
						mberManageCnfVO.get(i).setSiteUrl(naver_url);
						mberManageCnfVO.get(i).setSiteIcon("/img/login_naver_icon.png");

					} else if (mberManageCnfVO.get(i).getConfigId().equals("snsKakao")) {

						String kakao_url = "https://kauth.kakao.com/oauth/authorize?response_type=code";
						kakao_url += "&client_id=" + kakaoRestApiKey;
						kakao_url += "&redirect_uri=" + kakaoReturnUrl;
						mberManageCnfVO.get(i).setSiteUrl(kakao_url);
						mberManageCnfVO.get(i).setSiteIcon("/img/login_kakao_icon.png");

					} else if (mberManageCnfVO.get(i).getConfigId().equals("snsGoogle")) {

					}
				}
			}
		}*/
		model.addAttribute("mberManageCnfVO", mberManageCnfVO);
		model.addAttribute("beforeUrl", beforeUrl);
		model.addAttribute("message", message);
		initRsa(request);

		// 공인 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");
		// userIp = s.next();

		model.addAttribute("userIp", userIp);
		model.addAttribute("goEventPay", goEventPay);

		return "web/login/EgovLoginGnrlUsr";
	}

	/**
	 * (관리자) 일반(스프링 시큐리티) 로그인을 처리한다(관리자)
	 * 
	 * @param vo
	 *            - 아이디, 비밀번호가 담긴 LoginVO
	 * @param request
	 *            - 세션처리를 위한 HttpServletRequest
	 * @return result - 로그인결과(세션정보)
	 * @exception Exception
	 */
	@RequestMapping(value = "/uat/uia/actionSecurityLogin.do")
	public String selectActionSecurityLogin(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response,
			HttpServletRequest request, ModelMap model, HttpSession session) throws Exception {

		// Locale.setDefault(new Locale("en", "GB"));
		Locale.setDefault(new Locale("ko", "Kr"));

		// 로그인 정보 check
		if (loginVO.getId() == null || loginVO.getPassword() == null) { // 로그인 최초 화면 로딩
			// RSA 키 생성
			initRsa(request);
			return "uat/uia/EgovLoginUsr";
		}
		
		/*
		 * 미허용IP일 떄, 문자 인증을 하기위한 변수
		 * */ 
		String authSelfId = loginVO.getId();
		String authSelfPw = loginVO.getPassword2();

		PrivateKey privateKey = (PrivateKey) session.getAttribute(EgovLoginController.RSA_WEB_KEY);
		if (privateKey == null) {
			initRsa(request);
			return "uat/uia/EgovLoginUsr";
		}
		// 복호화
		String id = "";
		try {
			id = decryptRsa(privateKey, loginVO.getId());
		} catch (Exception e) {
			initRsa(request);
			return "uat/uia/EgovLoginUsr";
		}
		String password = decryptRsa(privateKey, loginVO.getPassword());
		loginVO.setId(id);
		loginVO.setPassword(password);

        // 사용자일 경우 로그인 안되게
        LoginVO	loginInfo	=	loginService.getUserAuth(loginVO);
        String s_loginInfo_getAuthority	=	"";
        try {
        	s_loginInfo_getAuthority	=	loginInfo.getAuthority();
        	
        }catch(Exception ex) {
        	System.out.println(ex.getMessage());
        	//ex.printStackTrace();        	
        	//System.out.println(ex.prin.printStackTrace());
        }

		if (null == loginInfo) { // 아이디 없음.
			initRsa(request);
			model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "uat/uia/EgovLoginUsr";
		} else {
			if ("ROLE_GNRL_USER".equals(loginInfo.getAuthority())) { // 일반사용자 로그인
				initRsa(request);
				model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
				return "uat/uia/EgovLoginUsr";
			}
		}
		
        /*
		if (null == loginService.getUserAuth(loginVO)) { // 아이디 없음.
			initRsa(request);
			model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "uat/uia/EgovLoginUsr";
		} else {
			if ("ROLE_GNRL_USER".equals(loginService.getUserAuth(loginVO).getAuthority())) { // 일반사용자 로그인
				initRsa(request);
				model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
				return "uat/uia/EgovLoginUsr";
			}
		}
		*/

		// 1. 로그인 처리
		LoginVO resultVO = loginService.actionLogin(loginVO);
		
		/*
		 *  미허용 IP 인증번호 비교 flag
		 *  false : 인증번호 비교 결과 맞음
		 *  true : 인증번호 비교 결과 틀림
		 * 
		 */
		Boolean smsCertFlag = false;
		
		if(StringUtil.isNotEmpty(loginVO.getCheckNo()) && "Y".equals(resultVO.getOuterCertYn())) {
			
			//수신자
			String callTo = resultVO.getMoblphonNo();
			String checkNo = loginVO.getCheckNo();
			String mberId = resultVO.getId();
			
			/* 
			 * 인증번호 비교
			 * return 
			 * 		empty = "인증번호 발송 내역이 없습니다. 최고관리자에게 문의하세요."
			 * 		success = "5분이내 발송 내역 비교, 인증번호 비교 시  일치"
			 * 			smsCertFlag = true
			 * 		checkNoFail = "인증번호를 확인해 주세요"
			 * 		timeOut = "인증번호 시간이 초과되었습니다. \\n 인증번호를 다시 발송합니다."
			 * 		Exception = "에러가 발생하였습니다. 다시 시도해 주세요. \\n 에러가 지속될 시 최고관리자에게 문의하세요.";
			 * 		final = "exception";
			 * 
			 * 		실패 시 passMiss 숫자++ update
			 * 			loginService.updatePassMissPlus(loginVO);
			 * 
			 * */
			String result = mjonSmsCertSendUtil.mjonSmsCertCheck(callTo, checkNo, mberId);
			
			if(result.equals("empty")) {
				loginService.updatePassMissPlus(loginVO);
				model.addAttribute("message", "인증번호 발송 내역이 없습니다. 최고관리자에게 문의하세요.");
				initRsa(request);
				return "uat/uia/EgovLoginUsr";
			} else if(result.equals("success")) {
				smsCertFlag = true;
			} else if(result.equals("checkNoFail")) {
				loginService.updatePassMissPlus(loginVO);
				model.addAttribute("message", "인증번호를 확인해 주세요");
				model.addAttribute("message_auth", "미허용 IP에서 접속하셨습니다. \\n등록 된 휴대폰 번호로 발송된 인증번호를 입력해주세요.");
				model.addAttribute("mode", "본인인증");
				model.addAttribute("id", resultVO.getId());
				model.addAttribute("password", authSelfPw);
				
				//인증문자 발송
				mjonSmsCertSendUtil.mjonSmsCertSend(callTo);
				
				initRsa(request);
				return "uat/uia/EgovLoginUsr";
			} else if(result.equals("timeOut")) {
				model.addAttribute("message", "인증번호 시간이 초과되었습니다. \\n 인증번호를 다시 발송합니다.");
				model.addAttribute("message_auth", "미허용 IP에서 접속하셨습니다. \\n등록 된 휴대폰 번호로 발송된 인증번호를 입력해주세요.");
				model.addAttribute("mode", "본인인증");
				model.addAttribute("id", resultVO.getId());
				model.addAttribute("password", authSelfPw);
				
				//인증문자 발송
				mjonSmsCertSendUtil.mjonSmsCertSend(callTo);
				
				initRsa(request);
				return "uat/uia/EgovLoginUsr";
			} else if(result.equals("Exception")) {
				model.addAttribute("message", "에러가 발생하였습니다. 다시 시도해 주세요. \\\\n 에러가 지속될 시 최고관리자에게 문의하세요.");
				model.addAttribute("message_auth", "미허용 IP에서 접속하셨습니다. \\n등록 된 휴대폰 번호로 발송된 인증번호를 입력해주세요.");
				model.addAttribute("mode", "본인인증");
				model.addAttribute("id", resultVO.getId());
				model.addAttribute("password", authSelfPw);
				
				//인증문자 발송
				mjonSmsCertSendUtil.mjonSmsCertSend(callTo);
				
				initRsa(request);
				return "uat/uia/EgovLoginUsr";
			} 
		}
		
		if (null == resultVO.getId()) { // 로그인 실패
			loginService.updatePassMissPlus(loginVO);
			model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			initRsa(request);
			return "uat/uia/EgovLoginUsr";
		}
		else {
			if (resultVO.getPassMiss() > 5) {
				model.addAttribute("message", "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 관리자에게 문의하시기 바랍니다.");
				initRsa(request);
				return "uat/uia/EgovLoginUsr";
			} else { // 초기화
				loginService.updatePassMissReset(loginVO);
			}
		}

		// 2. 허용IP조회

		boolean loginPolicyYn = false;
		// String userIp = EgovClntInfo.getClntIP(request);
		// 방화벽 아이피 조회

		HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
				.getRequest();
		String userIp = req.getHeader("X-Forwarded-For") == null ? req.getHeader("X-Forwarded-For") : req.getHeader("X-Forwarded-For").replaceAll("10.12.107.11", "").replaceAll(",", "").trim();
		if (userIp == null) {
			userIp = req.getRemoteAddr();
		}

		//TODO: 관리자 미허용 IP 테스트 구간입니다.
//		{
//		userIp = "211.211.211.211";
//		System.out.println("--------userIp-------" + userIp + "-----------------");
//		}

		boolean ipCheck = false;
		List<LoginPolicyVO> loginPolicyGroupList = new ArrayList<LoginPolicyVO>();
		loginPolicyGroupList = egovLoginPolicyService.selectLoginGroupPolicyAll();
		if (loginPolicyGroupList != null) {
			for (LoginPolicyVO tempPolicyVO : loginPolicyGroupList) {
				if (userIp.contains(tempPolicyVO.getIpInfo().trim())) {
					ipCheck = true;
					break;
				}
			}
		}
		// 관리자 SMS 인증번호가 틀렸을경우 or 인증번호 페이지에 가지 못햇을 경우
		if(!smsCertFlag && "Y".equals(resultVO.getOuterCertYn())) {
			// 관리자 허용 IP에 없을 경우
			if (!ipCheck) {
				// 관리자 아이디에 휴대폰 번호가 없을경우
				if(StringUtil.isEmpty(resultVO.getMoblphonNo())){
					model.addAttribute("message", "핸드폰 번호가 없습니다. 최고관리자에게 문의하세요.");
				} 
				// 문자인증 입력 노출
				else{
					model.addAttribute("mode", "본인인증");
					model.addAttribute("message_auth", "미허용 IP에서 접속하셨습니다. \\n등록 된 휴대폰 번호로 발송된 인증번호를 입력해주세요.");
					model.addAttribute("id", resultVO.getId());
					model.addAttribute("password", authSelfPw);
					
					//수신자
					String callTo = resultVO.getMoblphonNo();
					
					//인증문자 발송
					mjonSmsCertSendUtil.mjonSmsCertSend(callTo);
					
				}
				initRsa(request);
				return "uat/uia/EgovLoginUsr";
			}
		}

		// resultVO.siteId 의 각 로그인 ip를 조회함
		// if (resultVO != null && resultVO.getId() != null &&
		// !resultVO.getId().equals("") && loginPolicyYn) {
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("")) {
			// 세션에다 ip 등록
			resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);

			UsernamePasswordAuthenticationFilter springSecurity = null;

			ApplicationContext act = WebApplicationContextUtils
					.getRequiredWebApplicationContext(request.getSession().getServletContext());

			Map<String, UsernamePasswordAuthenticationFilter> beans = act
					.getBeansOfType(UsernamePasswordAuthenticationFilter.class);

			if (beans.size() > 0) {

				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(
						request.getServletContext().getContextPath() + "/egov_security_login", "POST"));

			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}

			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(),
					resultVO.getUniqId()), response, null);
			{ // 관리자 로그인 log 저장
				String uniqId = "";
				String ip = "";

				/* Authenticated */
				LoginLog loginLog = new LoginLog();
				Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				if (isAuthenticated.booleanValue()) {
					LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
					uniqId = user.getUniqId();
					ip = EgovClntInfo.getClntIP(request);
					loginLog.setSiteId(user.getSiteId());
					HttpSession httpSession = request.getSession(true);
					{
						List<SiteManagerVO> siteManageList = new ArrayList<SiteManagerVO>();
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setFirstIndex(0);
						siteManagerVO.setRecordCountPerPage(100);
						siteManageList = egovSiteManagerService.selectSiteManagerList(siteManagerVO);
						httpSession.setAttribute("siteManageList", siteManageList);
						httpSession.setAttribute("adminId", user.getId());
						httpSession.setAttribute("loginId", user.getId()); // 자동완성 공통으로 쓰기위해
						httpSession.setAttribute("esntlId", user.getPassword());

						// 최근검색어 조회 후 세션에 넣어줌
						/*
						 * UserManageVO tempUserManageVO = new UserManageVO();
						 * tempUserManageVO.setEmplyrId(user.getId()); tempUserManageVO =
						 * userManageService.selectRecentSearchWord(tempUserManageVO);
						 * 
						 * List<String> lisRecentSearch = new ArrayList<String>(); if(null !=
						 * tempUserManageVO){ //ArrayList 로 세션 저장
						 * Collections.addAll(lisRecentSearch,tempUserManageVO.getSearchWord().split(","
						 * )) ; } httpSession.setAttribute("recentSearch", lisRecentSearch) ;
						 */

						// 로그인 성공시 MJ_MEMBER_ADD 정보 세션에 넣음.
						resultVO.setPassword(""); // 패스워드 null로 세팅
						resultVO.setUniqId("");
						httpSession.setAttribute("UserInfo", resultVO);

					}
				}

				/*
				 * loginLog.setLoginId(uniqId); loginLog.setLoginIp(ip);
				 * loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O loginLog.setErrOccrrAt("N");
				 * loginLog.setErrorCode(""); //로그인은 관리자, PC만 됨 loginLog.setUserAt("A");
				 * loginLog.setDeviceType("P"); loginLog.setProgrmFileNm("adminLogin");
				 * loginLog.setMenuNm("관리자로그인"); loginLogService.logInsertLoginLog(loginLog);
				 */
			}

			return "forward:/uat/uia/actionMain.do"; // 성공 시 페이지.. (redirect 불가)
			// 개인키 삭제
			// session.removeAttribute(EgovLoginController.RSA_WEB_KEY);
			// return "blank"; // 성공 시 페이지.. (redirect 불가)

		} else {
			model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			initRsa(request);
			return "uat/uia/EgovLoginUsr";
		}
	}

	/**
	 * (사용자) 일반(스프링 시큐리티) 로그인을 처리한다
	 * 
	 * @param vo
	 *            - 아이디, 비밀번호가 담긴 LoginVO
	 * @param request
	 *            - 세션처리를 위한 HttpServletRequest
	 * @return result - 로그인결과(세션정보)
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/login/actionSecurityLogin_bak_00.do")
	public String selectActionSecurityLoginWeb_bak(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {

		String userIp = EgovClntInfo.getClntIP(request);
		HackIpVO hackIpVO = new HackIpVO();
		hackIpVO.setAccessIp(userIp);
		hackIpVO.setBlockYn("Y");
		if (null != hackIpService.selectHackIpVO(hackIpVO)) {
			String message = "차단된 아이피입니다. 관리자에게 문의해 주십시요.";
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}

		/*ScriptEngineManager engine = new ScriptEngineManager();*/

		loginVO.setUserSe("USR");
		// 로그인 정보 check

		if (loginVO.getId() == null || loginVO.getPassword() == null) {
			// 회원가입 시 로그인 처리
			LoginVO pLoginVO = (LoginVO) request.getAttribute("pLoginVO");
			if (pLoginVO == null) {
				// RSA 키 생성
				initRsa(request);
				/* return "redirect:/web/user/login/login.do"; */
				return "redirect:/";
			} else {
				loginVO.setId(pLoginVO.getId());
				loginVO.setPassword(pLoginVO.getPassword());
				loginVO.setBeforeUrl(pLoginVO.getBeforeUrl());
				loginVO.setMessage(pLoginVO.getMessage());
			}
		}

		// 1. 일반 로그인 처리
		PrivateKey privateKey = (PrivateKey) session.getAttribute(EgovLoginController.RSA_WEB_KEY);
		if (privateKey == null) {
			initRsa(request);
			/*return "web/site/login/EgovLoginGnrlUsr";*/
			String message = "아이디와 비밀번호를 확인해주세요.";
			redirectAttributes.addFlashAttribute("message", message);
			System.out.println("======================================================");
			System.out.println("=               RSA privateKey is null               =");
			System.out.println("======================================================");
			return "redirect:/web/main/mainPage.do";
		}

		LoginVO resultVO;
		// 복호화
		String id = "";
		try {
			//아이디 복호화 후 소문자 변환
			id = decryptRsa(privateKey, loginVO.getId()).toLowerCase();
		} catch (Exception e) {
			initRsa(request);
			// return "redirect:/web/user/login/login.do";
			if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
				redirectAttributes.addFlashAttribute("fail", true);
				return "redirect:/web/user/login/login.do";
			}
			return "redirect:/";

		}
		String password = decryptRsa(privateKey, loginVO.getPassword());
		loginVO.setId(id);
		loginVO.setIp(EgovClntInfo.getClntIP(request));
		loginVO.setPassword(password);
		loginVO.setUserSe("GNR");
		loginVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		
		//기업회원 가입중인지 체크 - 기존 로그인 select는 MBER_STTUS = 'Y'가 하드코딩이라 로그인 전 기업회원 가입중인지 선 체크
		//암호화 2번 방지를 위한 LoginVO 생성
		LoginVO loginCmpChkVO = new LoginVO();
		loginCmpChkVO.setId(id);
		loginCmpChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginCmpChkVO.setPassword(password);
		loginCmpChkVO.setUserSe("GNR");
		loginCmpChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginCmpChkVO.setEmplyrSttusCode("A"); // 신청대기중인 사용자까지 조회
		LoginVO cmpHstResultVO = loginService.actionLoginCmpChk(loginCmpChkVO);
		if(null != cmpHstResultVO.getId()) {
			//기업회원 정보 마지막 내역 조회
			MberManageVO mberManageVO = new MberManageVO();
			mberManageVO.setMberId(loginVO.getId());
			MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
			if(null != cmpChangeManageVO) {
				if("01".equals(cmpChangeManageVO.getHstType())) { //가장 마지막 내역이 기업회원 가입일 시
					if("01".equals(cmpChangeManageVO.getHstSttus()) || "03".equals(cmpChangeManageVO.getHstSttus()) ) { //가장 마지막 기업회원 가입이 신청 또는 반려 상태일 시
						redirectAttributes.addFlashAttribute("mberId", loginVO.getId());
						//addFlashAttribute 일회성으로 인하여 membershipAttachDocBefore.do 이동 후
						//membershipAttachDoc.do로 바로 submit하여 새로고침 시 정보 유지되게 끔 처리
						return "redirect:/web/user/login/membershipAttachDocBefore.do";
					}
				}
			}
		}
		//스팸처리 회원인지 mj_spam_member_info 해당 ID의 최근 1개 데이터 조회
		LoginVO loginSmiChkVO = new LoginVO();
		loginSmiChkVO.setId(id);
		loginSmiChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginSmiChkVO.setPassword(password);
		loginSmiChkVO.setUserSe("GNR");
		loginSmiChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginSmiChkVO.setEmplyrSttusCode("B"); // 신청대기중인 사용자까지 조회
		LoginVO smiResultVO = loginService.actionLoginCmpChk(loginSmiChkVO);
		if(null != smiResultVO.getId()) {
			MberManageVO spamMberManageVO = new MberManageVO();
			spamMberManageVO.setMberId(loginVO.getId());
			MberManageVO spamMemberInfoVO = mberManageService.selectSpamMemberInfo(spamMberManageVO);
			if(null != spamMemberInfoVO) {
				redirectAttributes.addFlashAttribute("mberId", loginVO.getId());
				return "redirect:/web/user/login/loginRestrictionUseBefore.do";
			}
		}
		resultVO = loginService.actionLogin(loginVO);
		LoginVO passMissVO = loginService.selectPassMiss(loginVO);

		String alertMessage = "";
		if (!"admin".equals(loginVO.getId())) {
			//아이디가 존재
			if(passMissVO != null) {
				// 로그인 실패 (
				if (null == resultVO.getId() && passMissVO.getPassMiss() < 5 ) {
					loginService.updatePassMissPlus(loginVO);
					alertMessage = egovMessageSource.getMessage("fail.common.login");
	
					// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디는 있지만 비밀번호가 틀린상황
					/// HackIpVO hackIpVO = new HackIpVO();
					hackIpVO.setHackUserId(loginVO.getId());
					hackIpVO.setAccessIp( EgovClntInfo.getClntIP(request));
					hackIpService.insertHackIp(hackIpVO);
					if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
						redirectAttributes.addFlashAttribute("fail", true);
						return "redirect:/web/user/login/login.do";
					}
	
					return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
				} else {
					if (passMissVO.getPassMiss() >= 5) {
						alertMessage = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 비밀번호를 재설정해주세요.";
						return goUserPassMissPage(redirectAttributes, loginVO, request, model, alertMessage);
					} /*
						 * else if("A".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "신청하신 아이디가 현제 승인대기 상" + "태입니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }else
						 * if("B".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "아이디가 차단상태가 되어 사용할수 없습니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }
						 */
					loginService.updatePassMissReset(loginVO);
				}
			}
			//아이디 미존재
			else {
				alertMessage = egovMessageSource.getMessage("fail.common.login");
				
				// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디없고 비밀번호도 틀린상황
				/// HackIpVO hackIpVO = new HackIpVO();
				hackIpVO.setHackUserId(loginVO.getId());
				hackIpVO.setAccessIp(EgovClntInfo.getClntIP(request));
				hackIpService.insertHackIp(hackIpVO);
				if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
					redirectAttributes.addFlashAttribute("fail", true);
					return "redirect:/web/user/login/login.do";
				}

				return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
			}
		}

		
		/* 일시 : 2023.07.26
		 * 내용 : 로그인시 휴먼고객 redirect 기능 추가
		 * 작업자 : 원영현 과장 
		 */
		
		if(resultVO.getDormantYn().equals("Y") || resultVO.getDormantYn() == "Y") {
			
			return "redirect:/web/user/humanPage.do";
		}
		
		
		
		
		boolean loginPolicyYn = true;

		// 접속IP
		// userIp = EgovClntInfo.getClntIP(request);

		// resultVO.siteId 의 각 로그인 ip를 조회함
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("") && loginPolicyYn) {
			// 세션에다 ip 등록
			resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);
			UsernamePasswordAuthenticationFilter springSecurity = null;
			ApplicationContext act = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
			Map<String, UsernamePasswordAuthenticationFilter> beans = act.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(request.getServletContext().getContextPath() + "/egov_security_login", "POST"));
			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}

			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(), resultVO.getUniqId()), response, null);
			{ // 관리자 로그인 log 저장
				String uniqId = "";
				String ip = "";

				/* Authenticated */
				LoginLog loginLog = new LoginLog();
				Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				if (isAuthenticated.booleanValue()) {
					LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
					uniqId = user.getUniqId();
					ip = EgovClntInfo.getClntIP(request);

					HttpSession httpSession = request.getSession(true);
					{
						List<SiteManagerVO> siteManageList = new ArrayList<SiteManagerVO>();
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setFirstIndex(0);
						siteManagerVO.setRecordCountPerPage(100);
						siteManageList = egovSiteManagerService.selectSiteManagerList(siteManagerVO);
						httpSession.setAttribute("siteManageList", siteManageList);
						httpSession.setAttribute("loginId", user.getId()); // 자동완성 공통으로 쓰기위해
						httpSession.setAttribute("esntlId", user.getPassword());

						// 최근검색어 조회 후 세션에 넣어줌
						/*
						 * UserManageVO tempUserManageVO = new UserManageVO();
						 * tempUserManageVO.setEmplyrId(user.getId()); tempUserManageVO =
						 * userManageService.selectRecentSearchWord(tempUserManageVO);
						 * 
						 * List<String> lisRecentSearch = new ArrayList<String>(); if(null !=
						 * tempUserManageVO){ //ArrayList 로 세션 저장
						 * Collections.addAll(lisRecentSearch,tempUserManageVO.getSearchWord().split(","
						 * )) ; } httpSession.setAttribute("recentSearch", lisRecentSearch) ;
						 */
					}
				}
				/*
				 * loginLog.setLoginId(uniqId); loginLog.setLoginIp(ip);
				 * loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O loginLog.setErrOccrrAt("N");
				 * loginLog.setErrorCode(""); //로그인은 관리자, PC만 됨 loginLog.setUserAt("U"); //사용자
				 * loginLog.setDeviceType("P"); //PC loginLog.setProgrmFileNm("adminLogin");
				 * loginLog.setMenuNm("관리자로그인"); loginLogService.logInsertLoginLog(loginLog);
				 */

				loginVO.getId();
				loginVO.getIp();
				loginVO.setMessage("로그인 성공되었습니다.");
				loginVO.setLoginYn("Y");
				loginService.insertActionLoginLog(loginVO);
			}

			// 등급제 Start
	   		// 회원별 등급 적용
			MberGrdVO mberGrdVO = new MberGrdVO();
			mberGrdVO.setMberId(loginVO.getId());
	    	mberGrdVO.setAmt("0");
	    	mberGrdVO.setMoid("");
	   		mberGrdService.mberGrdSaveByUserNoHist(mberGrdVO);    		
			// End
	   		
			// 이벤트 결제 바로가기 로직 체크 Start
			String goEventPay = (String) commandMap.get("goEventPay");
			System.out.println("goEventPay : " + goEventPay);
			if (null != goEventPay && goEventPay.equals("Y")) {
				// 이벤트 결제 바로가기
				if (goEventPay(loginVO) == true) {
					loginVO.setBeforeUrl("/web/event/member/pay/PayView.do");
				}
			}
			// End
			
			String beforeUrl = (String) commandMap.get("beforeUrl");

			// 로그인 전 URL 호출 시
			if (loginVO.getBeforeUrl() != null && !("").equals(loginVO.getBeforeUrl())) {
				request.getSession().setAttribute("usrBeforeUrl", loginVO.getBeforeUrl());
				// 회원가입 시 메세지 처리
				if (loginVO.getMessage() != null && !("").equals(loginVO.getMessage())) {
					request.getSession().setAttribute("registMessage", loginVO.getMessage());
				}
			}

			// 개인키 삭제
			// 성공시 웹페이지 분기로 인해 session에 페이지 타입을 넣어준다.
			request.getSession().setAttribute("pageType", "web");
			
			return "blank"; // 성공 시 페이지.. (redirect 불가)

			// uat/uia/actionMain.do 실제 성공시 무조건 좌측 메소드로 감.
			// return "forward:/web/main/mainPage.do";
		} else {
			String message = egovMessageSource.getMessage("fail.common.login");
			redirectAttributes.addFlashAttribute("beforeUrl", loginVO.getBeforeUrl());
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}
	}
	
	/**
	  * @Method Name	: selectUserSttusAjax
	  * @작성일 			: 2024. 3. 27.
	  * @작성자			: WYH
	  * @변경이력			: 
	  * @Method 설명 		: 회원상태 조회 (Y:일반회원, B:이용정지 회원, N:탈퇴회원) 
	  */
	/*
	@RequestMapping(value = { "/web/user/login/actionSecurityLoginAjax.do" })
	public ModelAndView actionSecurityLoginAjax(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
	    String p_id		=	"";
	    String p_pwd	=	"";
		
		try {
			//id, pwd 로그인 하고 결과와 hp 번호를 돌려주면 됨
			p_id	=	request.getParameter("id");
			p_pwd	=	request.getParameter("password");
			
			
			
			String userId = mjonMsgVO.getUserId();
			String userSttus = userManageService.selectUserStatusInfoCheck(userId);
			
			modelAndView.addObject("status", "success");
			modelAndView.addObject("userSttus", userSttus);
			
		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", "인증에 실패하였습니다.");
		}
		
		return modelAndView;
	}
	*/
	
	@RequestMapping(value = "/web/user/login/actionSecurityLoginBeforeHpAjax.do")
	public ModelAndView selectActionSecurityLoginWebBeforeHp(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		String userIp = EgovClntInfo.getClntIP(request);
		HackIpVO hackIpVO = new HackIpVO();
		hackIpVO.setAccessIp(userIp);
		hackIpVO.setBlockYn("Y");
		if (null != hackIpService.selectHackIpVO(hackIpVO)) {
			String message = "차단된 아이피입니다. 관리자에게 문의해 주십시요.";
			
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", message);
			return modelAndView;
			
		}

		/*ScriptEngineManager engine = new ScriptEngineManager();*/

		loginVO.setUserSe("USR");
		// 로그인 정보 check

		if (loginVO.getId() == null || loginVO.getPassword() == null) {
			// 회원가입 시 로그인 처리
			LoginVO pLoginVO = (LoginVO) request.getAttribute("pLoginVO");
			if (pLoginVO == null) {
				// RSA 키 생성
				initRsa(request);
				/* return "redirect:/web/user/login/login.do"; */
				//return "redirect:/";
				
				String message = "로그인 실패했습니다.";
				
				modelAndView.addObject("status", "fail");
				modelAndView.addObject("msg", message);
				return modelAndView;
				
			} else {
				loginVO.setId(pLoginVO.getId());
				loginVO.setPassword(pLoginVO.getPassword());
				loginVO.setBeforeUrl(pLoginVO.getBeforeUrl());
				loginVO.setMessage(pLoginVO.getMessage());
			}
		}

		// 1. 일반 로그인 처리
		PrivateKey privateKey = (PrivateKey) session.getAttribute(EgovLoginController.RSA_WEB_KEY);
		if (privateKey == null) {
			initRsa(request);
			/*return "web/site/login/EgovLoginGnrlUsr";*/
			String message = "아이디와 비밀번호를 확인해주세요.";
			redirectAttributes.addFlashAttribute("message", message);
			System.out.println("======================================================");
			System.out.println("=               RSA privateKey is null               =");
			System.out.println("======================================================");
						
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", message);
			return modelAndView;
			
		}

		LoginVO resultVO;
		// 복호화
		String id = "";
		try {
			//아이디 복호화 후 소문자 변환
			id = decryptRsa(privateKey, loginVO.getId()).toLowerCase();
		} catch (Exception e) {
			initRsa(request);

			String message = "로그인 실패했습니다.";
			
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", message);
			return modelAndView;

		}
		String password = decryptRsa(privateKey, loginVO.getPassword());
		loginVO.setId(id);
		loginVO.setIp(EgovClntInfo.getClntIP(request));
		loginVO.setPassword(password);
		loginVO.setUserSe("GNR");
		loginVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		
		//기업회원 가입중인지 체크 - 기존 로그인 select는 MBER_STTUS = 'Y'가 하드코딩이라 로그인 전 기업회원 가입중인지 선 체크
		//암호화 2번 방지를 위한 LoginVO 생성
		LoginVO loginCmpChkVO = new LoginVO();
		loginCmpChkVO.setId(id);
		loginCmpChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginCmpChkVO.setPassword(password);
		loginCmpChkVO.setUserSe("GNR");
		loginCmpChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginCmpChkVO.setEmplyrSttusCode("A"); // 신청대기중인 사용자까지 조회
		LoginVO cmpHstResultVO = loginService.actionLoginCmpChk(loginCmpChkVO);
		if(null != cmpHstResultVO.getId()) {
			//기업회원 정보 마지막 내역 조회
			MberManageVO mberManageVO = new MberManageVO();
			mberManageVO.setMberId(loginVO.getId());
			MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
			if(null != cmpChangeManageVO) {
				if("01".equals(cmpChangeManageVO.getHstType())) { //가장 마지막 내역이 기업회원 가입일 시
					if("01".equals(cmpChangeManageVO.getHstSttus()) || "03".equals(cmpChangeManageVO.getHstSttus()) ) { //가장 마지막 기업회원 가입이 신청 또는 반려 상태일 시

						String message = "기업회원 신청 또는 반려상태입니다.";
						
						modelAndView.addObject("status", "fail");
						modelAndView.addObject("msg", message);
						return modelAndView;

					}
				}
			}
		}
		//스팸처리 회원인지 mj_spam_member_info 해당 ID의 최근 1개 데이터 조회
		LoginVO loginSmiChkVO = new LoginVO();
		loginSmiChkVO.setId(id);
		loginSmiChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginSmiChkVO.setPassword(password);
		loginSmiChkVO.setUserSe("GNR");
		loginSmiChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginSmiChkVO.setEmplyrSttusCode("B"); // 신청대기중인 사용자까지 조회
		LoginVO smiResultVO = loginService.actionLoginCmpChk(loginSmiChkVO);
		if(null != smiResultVO.getId()) {
			MberManageVO spamMberManageVO = new MberManageVO();
			spamMberManageVO.setMberId(loginVO.getId());
			MberManageVO spamMemberInfoVO = mberManageService.selectSpamMemberInfo(spamMberManageVO);
			if(null != spamMemberInfoVO) {
				String message = "신청대기중인 상태입니다.";
				
				modelAndView.addObject("status", "fail");
				modelAndView.addObject("msg", message);
				return modelAndView;
			}
		}
		resultVO = loginService.actionLogin(loginVO);
		LoginVO passMissVO = loginService.selectPassMiss(loginVO);

		String alertMessage = "";
		if (!"admin".equals(loginVO.getId())) {
			//아이디가 존재
			if(passMissVO != null) {
				// 로그인 실패 (
				if (null == resultVO.getId() && passMissVO.getPassMiss() < 5 ) {
					loginService.updatePassMissPlus(loginVO);
					alertMessage = egovMessageSource.getMessage("fail.common.login");
	
					// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디는 있지만 비밀번호가 틀린상황
					/// HackIpVO hackIpVO = new HackIpVO();
					hackIpVO.setHackUserId(loginVO.getId());
					hackIpVO.setAccessIp( EgovClntInfo.getClntIP(request));
					hackIpService.insertHackIp(hackIpVO);
					if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
						String message = "로그인 실패했습니다.";
						
						modelAndView.addObject("status", "fail");
						modelAndView.addObject("msg", message);
						return modelAndView;
					}
	
					String message = "로그인 실패했습니다.";
					
					modelAndView.addObject("status", "fail");
					modelAndView.addObject("msg", message);
					return modelAndView;
					
				} else {
					if (passMissVO.getPassMiss() >= 5) {
						//alertMessage = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 비밀번호를 재설정해주세요.";
						String message = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 비밀번호를 재설정해주세요.";
						
						modelAndView.addObject("status", "fail");
						modelAndView.addObject("msg", message);
						return modelAndView;
					} /*
						 * else if("A".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "신청하신 아이디가 현제 승인대기 상" + "태입니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }else
						 * if("B".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "아이디가 차단상태가 되어 사용할수 없습니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }
						 */
					loginService.updatePassMissReset(loginVO);
				}
			}
			//아이디 미존재
			else {
				alertMessage = egovMessageSource.getMessage("fail.common.login");
				
				// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디없고 비밀번호도 틀린상황
				/// HackIpVO hackIpVO = new HackIpVO();
				hackIpVO.setHackUserId(loginVO.getId());
				hackIpVO.setAccessIp(EgovClntInfo.getClntIP(request));
				hackIpService.insertHackIp(hackIpVO);
				if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
					String message = "로그인 실패했습니다.";
					
					modelAndView.addObject("status", "fail");
					modelAndView.addObject("msg", message);
					return modelAndView;
				}

				String message = "로그인 실패했습니다.";
				
				modelAndView.addObject("status", "fail");
				modelAndView.addObject("msg", message);
				return modelAndView;
			}
		}

		
		/* 일시 : 2023.07.26
		 * 내용 : 로그인시 휴먼고객 redirect 기능 추가
		 * 작업자 : 원영현 과장 
		 */
		
		if(resultVO.getDormantYn().equals("Y") || resultVO.getDormantYn() == "Y") {
			
			String message = "휴면계정입니다.";
			modelAndView.addObject("dormantYn", "Y");
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", message);
			return modelAndView;
		}
		
		String message = "로그인 성공했습니다.";
		
		
		
		

		/* 일시 : 2024.11.18
		 * 내용 : 다중 인증번호 조회
		 * 작업자 : 이호영
		 */
		

		List<MberCertPhoneVO> mberCertPhoneList = certPhoneService.selectMberCertPhoneList(resultVO.getId());
		
		
		modelAndView.addObject("status", "success");
		modelAndView.addObject("msg", message);
		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;
		

	}
	
	@RequestMapping(value = "/web/user/login/actionSecurityLogin_ori_00.do")
	public String selectActionSecurityLoginWeb(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {

		String userIp = EgovClntInfo.getClntIP(request);
		HackIpVO hackIpVO = new HackIpVO();
		hackIpVO.setAccessIp(userIp);
		hackIpVO.setBlockYn("Y");
		if (null != hackIpService.selectHackIpVO(hackIpVO)) {
			String message = "차단된 아이피입니다. 관리자에게 문의해 주십시요.";
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}

		/*ScriptEngineManager engine = new ScriptEngineManager();*/

		loginVO.setUserSe("USR");
		// 로그인 정보 check

		if (loginVO.getId() == null || loginVO.getPassword() == null) {
			// 회원가입 시 로그인 처리
			LoginVO pLoginVO = (LoginVO) request.getAttribute("pLoginVO");
			if (pLoginVO == null) {
				// RSA 키 생성
				initRsa(request);
				/* return "redirect:/web/user/login/login.do"; */
				return "redirect:/";
			} else {
				loginVO.setId(pLoginVO.getId());
				loginVO.setPassword(pLoginVO.getPassword());
				loginVO.setBeforeUrl(pLoginVO.getBeforeUrl());
				loginVO.setMessage(pLoginVO.getMessage());
			}
		}

		// 1. 일반 로그인 처리
		PrivateKey privateKey = (PrivateKey) session.getAttribute(EgovLoginController.RSA_WEB_KEY);
		if (privateKey == null) {
			initRsa(request);
			/*return "web/site/login/EgovLoginGnrlUsr";*/
			String message = "아이디와 비밀번호를 확인해주세요.";
			redirectAttributes.addFlashAttribute("message", message);
			System.out.println("======================================================");
			System.out.println("=               RSA privateKey is null               =");
			System.out.println("======================================================");
			return "redirect:/web/main/mainPage.do";
		}

		LoginVO resultVO;
		// 복호화
		String id = "";
		try {
			//아이디 복호화 후 소문자 변환
			id = decryptRsa(privateKey, loginVO.getId()).toLowerCase();
		} catch (Exception e) {
			initRsa(request);
			// return "redirect:/web/user/login/login.do";
			if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
				redirectAttributes.addFlashAttribute("fail", true);
				return "redirect:/web/user/login/login.do";
			}
			return "redirect:/";

		}
		String password = decryptRsa(privateKey, loginVO.getPassword());
		loginVO.setId(id);
		loginVO.setIp(EgovClntInfo.getClntIP(request));
		loginVO.setPassword(password);
		loginVO.setUserSe("GNR");
		loginVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		
		//기업회원 가입중인지 체크 - 기존 로그인 select는 MBER_STTUS = 'Y'가 하드코딩이라 로그인 전 기업회원 가입중인지 선 체크
		//암호화 2번 방지를 위한 LoginVO 생성
		LoginVO loginCmpChkVO = new LoginVO();
		loginCmpChkVO.setId(id);
		loginCmpChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginCmpChkVO.setPassword(password);
		loginCmpChkVO.setUserSe("GNR");
		loginCmpChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginCmpChkVO.setEmplyrSttusCode("A"); // 신청대기중인 사용자까지 조회
		LoginVO cmpHstResultVO = loginService.actionLoginCmpChk(loginCmpChkVO);
		if(null != cmpHstResultVO.getId()) {
			//기업회원 정보 마지막 내역 조회
			MberManageVO mberManageVO = new MberManageVO();
			mberManageVO.setMberId(loginVO.getId());
			MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
			if(null != cmpChangeManageVO) {
				if("01".equals(cmpChangeManageVO.getHstType())) { //가장 마지막 내역이 기업회원 가입일 시
					if("01".equals(cmpChangeManageVO.getHstSttus()) || "03".equals(cmpChangeManageVO.getHstSttus()) ) { //가장 마지막 기업회원 가입이 신청 또는 반려 상태일 시
						redirectAttributes.addFlashAttribute("mberId", loginVO.getId());
						//addFlashAttribute 일회성으로 인하여 membershipAttachDocBefore.do 이동 후
						//membershipAttachDoc.do로 바로 submit하여 새로고침 시 정보 유지되게 끔 처리
						return "redirect:/web/user/login/membershipAttachDocBefore.do";
					}
				}
			}
		}
		//스팸처리 회원인지 mj_spam_member_info 해당 ID의 최근 1개 데이터 조회
		LoginVO loginSmiChkVO = new LoginVO();
		loginSmiChkVO.setId(id);
		loginSmiChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginSmiChkVO.setPassword(password);
		loginSmiChkVO.setUserSe("GNR");
		loginSmiChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginSmiChkVO.setEmplyrSttusCode("B"); // 신청대기중인 사용자까지 조회
		LoginVO smiResultVO = loginService.actionLoginCmpChk(loginSmiChkVO);
		if(null != smiResultVO.getId()) {
			MberManageVO spamMberManageVO = new MberManageVO();
			spamMberManageVO.setMberId(loginVO.getId());
			MberManageVO spamMemberInfoVO = mberManageService.selectSpamMemberInfo(spamMberManageVO);
			if(null != spamMemberInfoVO) {
				redirectAttributes.addFlashAttribute("mberId", loginVO.getId());
				return "redirect:/web/user/login/loginRestrictionUseBefore.do";
			}
		}
		resultVO = loginService.actionLogin(loginVO);
		LoginVO passMissVO = loginService.selectPassMiss(loginVO);

		String alertMessage = "";
		if (!"admin".equals(loginVO.getId())) {
			//아이디가 존재
			if(passMissVO != null) {
				// 로그인 실패 (
				if (null == resultVO.getId() && passMissVO.getPassMiss() < 5 ) {
					loginService.updatePassMissPlus(loginVO);
					alertMessage = egovMessageSource.getMessage("fail.common.login");
	
					// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디는 있지만 비밀번호가 틀린상황
					/// HackIpVO hackIpVO = new HackIpVO();
					hackIpVO.setHackUserId(loginVO.getId());
					hackIpVO.setAccessIp( EgovClntInfo.getClntIP(request));
					hackIpService.insertHackIp(hackIpVO);
					if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
						redirectAttributes.addFlashAttribute("fail", true);
						return "redirect:/web/user/login/login.do";
					}
	
					return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
				} else {
					if (passMissVO.getPassMiss() >= 5) {
						alertMessage = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 비밀번호를 재설정해주세요.";
						return goUserPassMissPage(redirectAttributes, loginVO, request, model, alertMessage);
					} /*
						 * else if("A".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "신청하신 아이디가 현제 승인대기 상" + "태입니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }else
						 * if("B".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "아이디가 차단상태가 되어 사용할수 없습니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }
						 */
					loginService.updatePassMissReset(loginVO);
				}
			}
			//아이디 미존재
			else {
				alertMessage = egovMessageSource.getMessage("fail.common.login");
				
				// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디없고 비밀번호도 틀린상황
				/// HackIpVO hackIpVO = new HackIpVO();
				hackIpVO.setHackUserId(loginVO.getId());
				hackIpVO.setAccessIp(EgovClntInfo.getClntIP(request));
				hackIpService.insertHackIp(hackIpVO);
				if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
					redirectAttributes.addFlashAttribute("fail", true);
					return "redirect:/web/user/login/login.do";
				}

				return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
			}
		}

		
		/* 일시 : 2023.07.26
		 * 내용 : 로그인시 휴먼고객 redirect 기능 추가
		 * 작업자 : 원영현 과장 
		 */
		
		if(resultVO.getDormantYn().equals("Y") || resultVO.getDormantYn() == "Y") {
			
			return "redirect:/web/user/humanPage.do";
		}
		
		
		
		
		boolean loginPolicyYn = true;

		// 접속IP
		// userIp = EgovClntInfo.getClntIP(request);

		// resultVO.siteId 의 각 로그인 ip를 조회함
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("") && loginPolicyYn) {
			// 세션에다 ip 등록
			resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);
			UsernamePasswordAuthenticationFilter springSecurity = null;
			ApplicationContext act = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
			Map<String, UsernamePasswordAuthenticationFilter> beans = act.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(request.getServletContext().getContextPath() + "/egov_security_login", "POST"));
			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}

			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(), resultVO.getUniqId()), response, null);
			{ // 관리자 로그인 log 저장
				String uniqId = "";
				String ip = "";

				/* Authenticated */
				LoginLog loginLog = new LoginLog();
				Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				if (isAuthenticated.booleanValue()) {
					LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
					uniqId = user.getUniqId();
					ip = EgovClntInfo.getClntIP(request);

					HttpSession httpSession = request.getSession(true);
					{
						List<SiteManagerVO> siteManageList = new ArrayList<SiteManagerVO>();
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setFirstIndex(0);
						siteManagerVO.setRecordCountPerPage(100);
						siteManageList = egovSiteManagerService.selectSiteManagerList(siteManagerVO);
						httpSession.setAttribute("siteManageList", siteManageList);
						httpSession.setAttribute("loginId", user.getId()); // 자동완성 공통으로 쓰기위해
						httpSession.setAttribute("esntlId", user.getPassword());

						// 최근검색어 조회 후 세션에 넣어줌
						/*
						 * UserManageVO tempUserManageVO = new UserManageVO();
						 * tempUserManageVO.setEmplyrId(user.getId()); tempUserManageVO =
						 * userManageService.selectRecentSearchWord(tempUserManageVO);
						 * 
						 * List<String> lisRecentSearch = new ArrayList<String>(); if(null !=
						 * tempUserManageVO){ //ArrayList 로 세션 저장
						 * Collections.addAll(lisRecentSearch,tempUserManageVO.getSearchWord().split(","
						 * )) ; } httpSession.setAttribute("recentSearch", lisRecentSearch) ;
						 */
					}
				}
				/*
				 * loginLog.setLoginId(uniqId); loginLog.setLoginIp(ip);
				 * loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O loginLog.setErrOccrrAt("N");
				 * loginLog.setErrorCode(""); //로그인은 관리자, PC만 됨 loginLog.setUserAt("U"); //사용자
				 * loginLog.setDeviceType("P"); //PC loginLog.setProgrmFileNm("adminLogin");
				 * loginLog.setMenuNm("관리자로그인"); loginLogService.logInsertLoginLog(loginLog);
				 */

				loginVO.getId();
				loginVO.getIp();
				loginVO.setMessage("로그인 성공되었습니다.");
				loginVO.setLoginYn("Y");
				loginService.insertActionLoginLog(loginVO);
			}

			// 등급제 Start
	   		// 회원별 등급 적용
			MberGrdVO mberGrdVO = new MberGrdVO();
			mberGrdVO.setMberId(loginVO.getId());
	    	mberGrdVO.setAmt("0");
	    	mberGrdVO.setMoid("");
	   		mberGrdService.mberGrdSaveByUserNoHist(mberGrdVO);    		
			// End
	   		
			// 이벤트 결제 바로가기 로직 체크 Start
			String goEventPay = (String) commandMap.get("goEventPay");
			System.out.println("goEventPay : " + goEventPay);
			if (null != goEventPay && goEventPay.equals("Y")) {
				// 이벤트 결제 바로가기
				if (goEventPay(loginVO) == true) {
					loginVO.setBeforeUrl("/web/event/member/pay/PayView.do");
				}
			}
			// End
			
			String beforeUrl = (String) commandMap.get("beforeUrl");

			// 로그인 전 URL 호출 시
			if (loginVO.getBeforeUrl() != null && !("").equals(loginVO.getBeforeUrl())) {
				request.getSession().setAttribute("usrBeforeUrl", loginVO.getBeforeUrl());
				// 회원가입 시 메세지 처리
				if (loginVO.getMessage() != null && !("").equals(loginVO.getMessage())) {
					request.getSession().setAttribute("registMessage", loginVO.getMessage());
				}
			}

			// 개인키 삭제
			// 성공시 웹페이지 분기로 인해 session에 페이지 타입을 넣어준다.
			request.getSession().setAttribute("pageType", "web");
			
			return "blank"; // 성공 시 페이지.. (redirect 불가)

			// uat/uia/actionMain.do 실제 성공시 무조건 좌측 메소드로 감.
			// return "forward:/web/main/mainPage.do";
		} else {
			String message = egovMessageSource.getMessage("fail.common.login");
			redirectAttributes.addFlashAttribute("beforeUrl", loginVO.getBeforeUrl());
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}
	}


	
	@RequestMapping(value = "/web/user/login/actionSecurityLoginAfterHp.do")
	public String selectActionSecurityLoginWebAfterHp(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
				
		String userIp = EgovClntInfo.getClntIP(request);
		HackIpVO hackIpVO = new HackIpVO();
		hackIpVO.setAccessIp(userIp);
		hackIpVO.setBlockYn("Y");
		if (null != hackIpService.selectHackIpVO(hackIpVO)) {
			String message = "차단된 아이피입니다. 관리자에게 문의해 주십시요.";
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}

		/*ScriptEngineManager engine = new ScriptEngineManager();*/

		loginVO.setUserSe("USR");
		// 로그인 정보 check

		if (loginVO.getId() == null || loginVO.getPassword() == null) {
			// 회원가입 시 로그인 처리
			LoginVO pLoginVO = (LoginVO) request.getAttribute("pLoginVO");
			if (pLoginVO == null) {
				// RSA 키 생성
				initRsa(request);
				/* return "redirect:/web/user/login/login.do"; */
				return "redirect:/";
			} else {
				loginVO.setId(pLoginVO.getId());
				loginVO.setPassword(pLoginVO.getPassword());
				loginVO.setBeforeUrl(pLoginVO.getBeforeUrl());
				loginVO.setMessage(pLoginVO.getMessage());
			}
		}
		
		// 1. 일반 로그인 처리
		PrivateKey privateKey = (PrivateKey) session.getAttribute(EgovLoginController.RSA_WEB_KEY);
		if (privateKey == null) {
			initRsa(request);
			/*return "web/site/login/EgovLoginGnrlUsr";*/
			String message = "아이디와 비밀번호를 확인해주세요.";
			redirectAttributes.addFlashAttribute("message", message);
			System.out.println("======================================================");
			System.out.println("=               RSA privateKey is null               =");
			System.out.println("======================================================");
			return "redirect:/web/main/mainPage.do";
		}

		LoginVO resultVO;
		// 복호화
		String id = "";
		try {
			//아이디 복호화 후 소문자 변환
			id = decryptRsa(privateKey, loginVO.getId()).toLowerCase();
		} catch (Exception e) {
			initRsa(request);
			// return "redirect:/web/user/login/login.do";
			if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
				redirectAttributes.addFlashAttribute("fail", true);
				return "redirect:/web/user/login/login.do";
			}
			return "redirect:/";

		}
		
		
		//핸드폰 인증번호 확인
		String s_hp	=	request.getParameter("hp");
		String s_num	=	request.getParameter("num");
		
		System.out.println(s_hp);
		System.out.println(s_num);
		System.out.println("s_num==============");
		
		SendLogVO sendLogVO = new SendLogVO();
		sendLogVO.setSendId(id);
		sendLogVO.setReceive(s_hp);
		sendLogVO.setCheckNo(s_num);
		
		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);
		loginVO.setIp(EgovClntInfo.getClntIP(request));
		loginVO.setPassword(password);
		loginVO.setUserSe("GNR");
		loginVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		
		//기업회원 가입중인지 체크 - 기존 로그인 select는 MBER_STTUS = 'Y'가 하드코딩이라 로그인 전 기업회원 가입중인지 선 체크
		//암호화 2번 방지를 위한 LoginVO 생성
		LoginVO loginCmpChkVO = new LoginVO();
		loginCmpChkVO.setId(id);
		loginCmpChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginCmpChkVO.setPassword(password);
		loginCmpChkVO.setUserSe("GNR");
		loginCmpChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginCmpChkVO.setEmplyrSttusCode("A"); // 신청대기중인 사용자까지 조회
		LoginVO cmpHstResultVO = loginService.actionLoginCmpChk(loginCmpChkVO);
		if(null != cmpHstResultVO.getId()) {
			//기업회원 정보 마지막 내역 조회
			MberManageVO mberManageVO = new MberManageVO();
			mberManageVO.setMberId(loginVO.getId());
			MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
			if(null != cmpChangeManageVO) {
				if("01".equals(cmpChangeManageVO.getHstType())) { //가장 마지막 내역이 기업회원 가입일 시
					if("01".equals(cmpChangeManageVO.getHstSttus()) || "03".equals(cmpChangeManageVO.getHstSttus()) ) { //가장 마지막 기업회원 가입이 신청 또는 반려 상태일 시
						redirectAttributes.addFlashAttribute("mberId", loginVO.getId());
						//addFlashAttribute 일회성으로 인하여 membershipAttachDocBefore.do 이동 후
						//membershipAttachDoc.do로 바로 submit하여 새로고침 시 정보 유지되게 끔 처리
						return "redirect:/web/user/login/membershipAttachDocBefore.do";
					}
				}
			}
		}
		//스팸처리 회원인지 mj_spam_member_info 해당 ID의 최근 1개 데이터 조회
		LoginVO loginSmiChkVO = new LoginVO();
		loginSmiChkVO.setId(id);
		loginSmiChkVO.setIp(EgovClntInfo.getClntIP(request));
		loginSmiChkVO.setPassword(password);
		loginSmiChkVO.setUserSe("GNR");
		loginSmiChkVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
		loginSmiChkVO.setEmplyrSttusCode("B"); // 신청대기중인 사용자까지 조회
		LoginVO smiResultVO = loginService.actionLoginCmpChk(loginSmiChkVO);
		if(null != smiResultVO.getId()) {
			MberManageVO spamMberManageVO = new MberManageVO();
			spamMberManageVO.setMberId(loginVO.getId());
			MberManageVO spamMemberInfoVO = mberManageService.selectSpamMemberInfo(spamMberManageVO);
			if(null != spamMemberInfoVO) {
				redirectAttributes.addFlashAttribute("mberId", loginVO.getId());
				return "redirect:/web/user/login/loginRestrictionUseBefore.do";
			}
		}
		resultVO = loginService.actionLogin(loginVO);
		LoginVO passMissVO = loginService.selectPassMiss(loginVO);

		String alertMessage = "";
		if (!"admin".equals(loginVO.getId())) {
			//아이디가 존재
			if(passMissVO != null) {
				// 로그인 실패 (
				if (null == resultVO.getId() && passMissVO.getPassMiss() < 5 ) {
					loginService.updatePassMissPlus(loginVO);
					alertMessage = egovMessageSource.getMessage("fail.common.login");
	
					// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디는 있지만 비밀번호가 틀린상황
					/// HackIpVO hackIpVO = new HackIpVO();
					hackIpVO.setHackUserId(loginVO.getId());
					hackIpVO.setAccessIp( EgovClntInfo.getClntIP(request));
					hackIpService.insertHackIp(hackIpVO);
					if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
						redirectAttributes.addFlashAttribute("fail", true);
						return "redirect:/web/user/login/login.do";
					}
	
					return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
				} else {
					if (passMissVO.getPassMiss() >= 5) {
						alertMessage = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 비밀번호를 재설정해주세요.";
						return goUserPassMissPage(redirectAttributes, loginVO, request, model, alertMessage);
					} /*
						 * else if("A".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "신청하신 아이디가 현제 승인대기 상" + "태입니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }else
						 * if("B".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "아이디가 차단상태가 되어 사용할수 없습니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }
						 */
					loginService.updatePassMissReset(loginVO);
				}
			}
			//아이디 미존재
			else {
				alertMessage = egovMessageSource.getMessage("fail.common.login");
				
				// 로그인 실패시 해킹의심 IP 테이블에 등록_아이디없고 비밀번호도 틀린상황
				/// HackIpVO hackIpVO = new HackIpVO();
				hackIpVO.setHackUserId(loginVO.getId());
				hackIpVO.setAccessIp(EgovClntInfo.getClntIP(request));
				hackIpService.insertHackIp(hackIpVO);
				if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
					redirectAttributes.addFlashAttribute("fail", true);
					return "redirect:/web/user/login/login.do";
				}

				return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
			}
		}

		
		/* 일시 : 2023.07.26
		 * 내용 : 로그인시 휴먼고객 redirect 기능 추가
		 * 작업자 : 원영현 과장 
		 */
		
		if(resultVO.getDormantYn().equals("Y") || resultVO.getDormantYn() == "Y") {
			
			return "redirect:/web/user/humanPage.do";
		}
		
		
		
		
		boolean loginPolicyYn = true;

		// 접속IP
		// userIp = EgovClntInfo.getClntIP(request);

		// resultVO.siteId 의 각 로그인 ip를 조회함
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("") && loginPolicyYn) {
			// 세션에다 ip 등록
			resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);
			UsernamePasswordAuthenticationFilter springSecurity = null;
			ApplicationContext act = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
			Map<String, UsernamePasswordAuthenticationFilter> beans = act.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(request.getServletContext().getContextPath() + "/egov_security_login", "POST"));
			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}

			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(), resultVO.getUniqId()), response, null);
			{ // 관리자 로그인 log 저장
				String uniqId = "";
				String ip = "";

				/* Authenticated */
				LoginLog loginLog = new LoginLog();
				Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				if (isAuthenticated.booleanValue()) {
					LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
					uniqId = user.getUniqId();
					ip = EgovClntInfo.getClntIP(request);

					HttpSession httpSession = request.getSession(true);
					{
						List<SiteManagerVO> siteManageList = new ArrayList<SiteManagerVO>();
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setFirstIndex(0);
						siteManagerVO.setRecordCountPerPage(100);
						siteManageList = egovSiteManagerService.selectSiteManagerList(siteManagerVO);
						httpSession.setAttribute("siteManageList", siteManageList);
						httpSession.setAttribute("loginId", user.getId()); // 자동완성 공통으로 쓰기위해
						httpSession.setAttribute("esntlId", user.getPassword());

						// 최근검색어 조회 후 세션에 넣어줌
						/*
						 * UserManageVO tempUserManageVO = new UserManageVO();
						 * tempUserManageVO.setEmplyrId(user.getId()); tempUserManageVO =
						 * userManageService.selectRecentSearchWord(tempUserManageVO);
						 * 
						 * List<String> lisRecentSearch = new ArrayList<String>(); if(null !=
						 * tempUserManageVO){ //ArrayList 로 세션 저장
						 * Collections.addAll(lisRecentSearch,tempUserManageVO.getSearchWord().split(","
						 * )) ; } httpSession.setAttribute("recentSearch", lisRecentSearch) ;
						 */
					}
				}
				/*
				 * loginLog.setLoginId(uniqId); loginLog.setLoginIp(ip);
				 * loginLog.setLoginMthd("I"); // 로그인:I, 로그아웃:O loginLog.setErrOccrrAt("N");
				 * loginLog.setErrorCode(""); //로그인은 관리자, PC만 됨 loginLog.setUserAt("U"); //사용자
				 * loginLog.setDeviceType("P"); //PC loginLog.setProgrmFileNm("adminLogin");
				 * loginLog.setMenuNm("관리자로그인"); loginLogService.logInsertLoginLog(loginLog);
				 */

				loginVO.getId();
				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
	   		// 회원별 등급 적용
			MberGrdVO mberGrdVO = new MberGrdVO();
			mberGrdVO.setMberId(loginVO.getId());
	    	mberGrdVO.setAmt("0");
	    	mberGrdVO.setMoid("");
	   		mberGrdService.mberGrdSaveByUserNoHist(mberGrdVO);    		
			// End
	   		
			// 이벤트 결제 바로가기 로직 체크 Start
			String goEventPay = (String) commandMap.get("goEventPay");
			System.out.println("goEventPay : " + goEventPay);
			if (null != goEventPay && goEventPay.equals("Y")) {
				// 이벤트 결제 바로가기
				if (goEventPay(loginVO) == true) {
					loginVO.setBeforeUrl("/web/event/member/pay/PayView.do");
				}
			}
			// End
			
			String beforeUrl = (String) commandMap.get("beforeUrl");

			// 로그인 전 URL 호출 시
			if (loginVO.getBeforeUrl() != null && !("").equals(loginVO.getBeforeUrl())) {
				request.getSession().setAttribute("usrBeforeUrl", loginVO.getBeforeUrl());
				// 회원가입 시 메세지 처리
				if (loginVO.getMessage() != null && !("").equals(loginVO.getMessage())) {
					request.getSession().setAttribute("registMessage", loginVO.getMessage());
				}
			}

			// 개인키 삭제
			// 성공시 웹페이지 분기로 인해 session에 페이지 타입을 넣어준다.
			request.getSession().setAttribute("pageType", "web");
			
			return "blank"; // 성공 시 페이지.. (redirect 불가)

			// uat/uia/actionMain.do 실제 성공시 무조건 좌측 메소드로 감.
			// return "forward:/web/main/mainPage.do";
		} else {
			String message = egovMessageSource.getMessage("fail.common.login");
			redirectAttributes.addFlashAttribute("beforeUrl", loginVO.getBeforeUrl());
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}
	}
	
	// 이벤트 결제 바로가기
	public boolean goEventPay(LoginVO loginVO) throws Exception {
		boolean goEventPay = false;
		MjonEventVO mjonEventVO = new MjonEventVO();

		// 이벤트 컨텐츠 정보 불러오기
		String bbsId = "BBSMSTR_000000000731";	//이벤트 게시판 번호
		String nttSj = "[첫결제 이벤트] 첫 결제 시, 누구나 조건 없이 인생 최저가!";
		BoardVO resultEvent = selectEventBoardInfo(bbsId, nttSj);
		
		if(resultEvent != null) {//이벤트 게시판의 이벤트 게시글 번호 셋팅
			mjonEventVO.setEventNttId(Float.toString(resultEvent.getNttId()));
		
			// 회원 이름 조회
			MberManageVO mberManageVO = new MberManageVO();
			mberManageVO.setMberId(loginVO.getId());
			String mberNm = mberManageService.selectMberNmByMberId(mberManageVO);
			if (mberNm != null) {
				loginVO.setName(mberNm);	
			}

			// Step 0. B선 전송사 이용고객 => 이벤트대상 제외처리
			mberManageVO.setMberId(loginVO.getId());
			String blineCode = mberManageService.selectBlineCodeByMberId(mberManageVO);
			if (blineCode != null && blineCode.equals("N")) {
				// Step 1. 결제여부 체크(미결제 일때 이벤트 대상)
				int payCnt = mjonPayService.selectMemerPayCount(loginVO.getId());
				if (payCnt == 0) {
					// Step 2. 이벤트 회원 정보 조회
					MjonEventVO eventMberInfo = selectEventMsgMberDefaultInfo(mjonEventVO, resultEvent.getNttId(), bbsId, loginVO.getId(), loginVO.getName());
					if(eventMberInfo == null) {//등록된 회원정보가 없으면 정보 입력
						mjonEventVO.setEventStatus("N");
						int resultCnt = mjonEventService.insertEventMsgMberDefaultInfo(mjonEventVO);
						if (resultCnt > 0) {
							goEventPay = true;
						}
					}else {
						//등록된 회원정보가 있으면 화면 이동 및 메세지 처리
						String status = eventMberInfo.getEventStatus();
						if(status.equals("Y")) {
							//이벤트가 진행중인 경우
						}
						else if(status.equals("E")) {
							//이벤트가 종료된 경우
						}else {
							//이벤트 미진행인 경우 성공으로 결제페이지로 이동되도록 한다.
							goEventPay = true;
						}
					}
				}
			}
		}
		
		return goEventPay;
	}
	
    //이벤트 게시글 정보 불러오기 함수
    public BoardVO selectEventBoardInfo(String bbsId, String nttSj) throws Exception{
    	
		BoardVO boardVO = new BoardVO();
		boardVO.setBbsId(bbsId);
		boardVO.setNttSj(nttSj);
		BoardVO resultEvent = mjonEventService.selectEventInfoByNttSj(boardVO);
		
		return resultEvent;
    }
    
    //이벤트 회원 정보 불러오기 함수
    public MjonEventVO selectEventMsgMberDefaultInfo(MjonEventVO mjonEventVO, float nttId, String bbsId, String mberId, String mberNm) throws Exception{
    	
    	mjonEventVO.setEventNttId(Float.toString(nttId));
		mjonEventVO.setEventBbsId(bbsId);
		mjonEventVO.setMberId(mberId);
		mjonEventVO.setMberNm(mberNm);
		mjonEventVO.setEventShortPrice("7.5");
		mjonEventVO.setEventLongPrice("32");
		mjonEventVO.setEventPicturePrice("59");
		mjonEventVO.setEventPicture2Price("67");
		mjonEventVO.setEventPicture3Price("70");
		
		//이벤트 회원정보 존재여부 확인 및 회원 정보 불러오기
		MjonEventVO eventMberInfo = mjonEventService.selectEventMsgMberDefaultInfo(mjonEventVO);
		
		return eventMberInfo;
    }
    
	
	/**
	 * 회원가입 후 (사용자) 일반(스프링 시큐리티) 로그인을 처리한다
	 * 
	 * @param vo
	 *            - 아이디, 비밀번호가 담긴 LoginVO
	 * @param request
	 *            - 세션처리를 위한 HttpServletRequest
	 * @return result - 로그인결과(세션정보)
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/login/actionSecurityJoinLogin.do")
	public String selectActionSecurityJoinLoginWeb(@ModelAttribute("loginVO") LoginVO loginVO,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO, HttpServletResponse response,
			HttpServletRequest request, @RequestParam Map<String, Object> commandMap, ModelMap model,
			HttpSession session, RedirectAttributes redirectAttributes) throws Exception {

		//아이디 소문자 변경
		loginVO.setId(loginVO.getId().toLowerCase());
		
		// 해킹 의심 IP 차단상태의 경우 로그인 불가
		String userIp = EgovClntInfo.getClntIP(request);
		HackIpVO hackIpVO = new HackIpVO();
		hackIpVO.setAccessIp(userIp);
		hackIpVO.setBlockYn("Y");
		if (null != hackIpService.selectHackIpVO(hackIpVO)) {
			String message = "차단된 아이피입니다. 관리자에게 문의해 주십시요.";
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}

		/*
		 * ScriptEngineManager engine = new ScriptEngineManager(); if
		 * (loginVO.getSnsSite() != null) { int snsIdCnt =
		 * loginService.selectSnsIdCount(loginVO); LoginVO snsInfo =
		 * loginService.selectSnsId(loginVO); if (snsIdCnt == 0) { LoginVO snsLoginVO =
		 * new LoginVO(); snsLoginVO.setSnsSite(loginVO.getSnsSite());
		 * snsLoginVO.setSnsId(loginVO.getSnsId());
		 * snsLoginVO.setName(loginVO.getName());
		 * snsLoginVO.setSnsEmail(loginVO.getSnsEmail());
		 * 
		 * if (null != snsInfo) { snsLoginVO.setId(snsInfo.getId());
		 * redirectAttributes.addFlashAttribute("loginVO", snsLoginVO); return
		 * "redirect:/web/user/join/snsLink.do"; } else {
		 * 
		 * redirectAttributes.addFlashAttribute("loginVO", snsLoginVO); return
		 * "redirect:/web/user/join/usrJoinIntro.do"; } } else {
		 * loginVO.setId(snsInfo.getId()); loginVO.setPassword(snsInfo.getPassword()); }
		 * 
		 * }
		 */

		loginVO.setUserSe("USR");
		// 로그인 정보 check

		/*
		 * if (loginVO.getId() == null || loginVO.getPassword() == null) { // 회원가입 시 로그인
		 * 처리 LoginVO pLoginVO = (LoginVO) request.getAttribute("pLoginVO"); if
		 * (pLoginVO == null) { // RSA 키 생성 initRsa(request); return
		 * "redirect:/web/user/login/login.do"; return "redirect:/"; } else {
		 * loginVO.setId(pLoginVO.getId()); loginVO.setPassword(pLoginVO.getPassword());
		 * loginVO.setBeforeUrl(pLoginVO.getBeforeUrl());
		 * loginVO.setMessage(pLoginVO.getMessage()); } }
		 */

		/*
		 * // 1. 일반 로그인 처리 PrivateKey privateKey = (PrivateKey)
		 * session.getAttribute(EgovLoginController.RSA_WEB_KEY); if (privateKey ==
		 * null) { initRsa(request); return "web/site/login/EgovLoginGnrlUsr"; }
		 */
		LoginVO resultVO;
		if (loginVO.getSnsSite() == null) {
			// 복호화
			String id = "";
			/*
			 * try { id = decryptRsa(privateKey, loginVO.getId()); } catch (Exception e) {
			 * initRsa(request); //return "redirect:/web/user/login/login.do";
			 * if(loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
			 * redirectAttributes.addFlashAttribute("fail", true); return
			 * "redirect:/web/user/login/login.do"; } return "redirect:/";
			 * 
			 * }
			 */
			// String password = decryptRsa(privateKey, loginVO.getPassword());
			loginVO.setId(loginVO.getId());
			loginVO.setIp(EgovClntInfo.getClntIP(request));
			loginVO.setPassword(loginVO.getPassword());
			loginVO.setUserSe("GNR");
			loginVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
			resultVO = loginService.actionLogin(loginVO);
			resultVO.setMberNm(loginVO.getMberNm()); // 이름 넣어주기. 개인회원 - 이름 / 기업회원 - 기업명 표시를 위해

			String alertMessage = "";
			if (!"admin".equals(loginVO.getId())) {
				if (null == resultVO.getId()) { // 로그인 실패
					/* loginService.updatePassMissPlus(loginVO); */
					alertMessage = egovMessageSource.getMessage("fail.common.login");

					// 로그인 실패시 해킹의심 IP 테이블에 등록
					/// HackIpVO hackIpVO = new HackIpVO();
					hackIpVO.setHackUserId(loginVO.getId());
					hackIpVO.setAccessIp(EgovClntInfo.getClntIP(request));
					hackIpService.insertHackIp(hackIpVO);
					if (loginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
						redirectAttributes.addFlashAttribute("fail", true);
						return "redirect:/web/user/login/login.do";
					}

					return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
				} else {
					if (resultVO.getPassMiss() > 5) {
						alertMessage = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 관리자에게 문의하시기 바랍니다.";
						return goUserLoginPage(redirectAttributes, loginVO, request, model, alertMessage);
					} /*
						 * else if("A".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "신청하신 아이디가 현제 승인대기 상" + "태입니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }else
						 * if("B".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "아이디가 차단상태가 되어 사용할수 없습니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }
						 */
					loginService.updatePassMissReset(loginVO);
				}
			}

		} else {
			resultVO = loginService.actionSnsLogin(loginVO);
		}

		boolean loginPolicyYn = true;

		// 접속IP
		// userIp = EgovClntInfo.getClntIP(request);

		// resultVO.siteId 의 각 로그인 ip를 조회함
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("") && loginPolicyYn) {
			// 세션에다 ip 등록
			resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);
			UsernamePasswordAuthenticationFilter springSecurity = null;
			ApplicationContext act = WebApplicationContextUtils
					.getRequiredWebApplicationContext(request.getSession().getServletContext());
			Map<String, UsernamePasswordAuthenticationFilter> beans = act
					.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(
						request.getServletContext().getContextPath() + "/egov_security_login", "POST"));

			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}

			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(),
					resultVO.getUniqId()), response, null);
			{ // 관리자 로그인 log 저장
				String uniqId = "";
				String ip = "";

				/* Authenticated */
				LoginLog loginLog = new LoginLog();
				Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				if (isAuthenticated.booleanValue()) {
					LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
					uniqId = user.getUniqId();
					ip = EgovClntInfo.getClntIP(request);

					HttpSession httpSession = request.getSession(true);
					{
						List<SiteManagerVO> siteManageList = new ArrayList<SiteManagerVO>();
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setFirstIndex(0);
						siteManagerVO.setRecordCountPerPage(100);
						siteManageList = egovSiteManagerService.selectSiteManagerList(siteManagerVO);
						httpSession.setAttribute("siteManageList", siteManageList);
						httpSession.setAttribute("loginId", user.getId()); // 자동완성 공통으로 쓰기위해
						httpSession.setAttribute("esntlId", user.getPassword());

					}
				}

				loginVO.getId();
				loginVO.getIp();
				loginVO.setMessage("로그인 성공되었습니다.");
				loginVO.setLoginYn("Y");
				loginService.insertActionLoginLog(loginVO);

			}

			String beforeUrl = (String) commandMap.get("beforeUrl");

			// 로그인 전 URL 호출 시
			if (loginVO.getBeforeUrl() != null && !("").equals(loginVO.getBeforeUrl())) {
				request.getSession().setAttribute("usrBeforeUrl", loginVO.getBeforeUrl());
				// 회원가입 시 메세지 처리
				if (loginVO.getMessage() != null && !("").equals(loginVO.getMessage())) {
					request.getSession().setAttribute("registMessage", loginVO.getMessage());
				}
			}

			// 개인키 삭제
			// 성공시 웹페이지 분기로 인해 session에 페이지 타입을 넣어준다.
			request.getSession().setAttribute("pageType", "web");
			// redirect 처리를 위한 임시 세션. context-security의 logoutSuccessUrl에서
			// /uat/uia/actionMain.do를 호출 해 joinComplete 확인 후 회원가입 성공 화면으로 이동
			request.getSession().setAttribute("joinComplete", "Y");
			return "blank"; // 성공 시 페이지.. (redirect 불가)

			// uat/uia/actionMain.do 실제 성공시 무조건 좌측 메소드로 감.
			// return "forward:/web/main/mainPage.do";
		} else {
			String message = egovMessageSource.getMessage("fail.common.login");
			redirectAttributes.addFlashAttribute("beforeUrl", loginVO.getBeforeUrl());
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}
	}

	/**
	 * 로그인 후 메인화면으로 들어간다
	 * 
	 * @param
	 * @return 로그인 페이지
	 * @exception Exception
	 */
	@RequestMapping(value = "/uat/uia/actionMain.do")
	public String actionMain(HttpServletResponse response, HttpServletRequest request, ModelMap model,
			RedirectAttributes redirectAttributes, HttpSession session) throws Exception {
		/*
		 * 1.로그인 성공시 메소드 호출(사용자/관리자 모두) 2.권한없는 페이지 호출시 메소드 호출됨 3.사용자 화면에서 권한 없어도 무조건
		 * 이쪽으로 redirect됨(여기서 분기처리요망)
		 */
		// initial target url. 첫 호출 URL
		SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response); // 사용자 최종 클릭 화면
		if (savedRequest != null) { // 권한업는 페이지 호출시 호출한 페이지 분기를 위해
			if (savedRequest.getRedirectUrl().contains("web")) { // 사용자페이지에서 옴
				session.setAttribute("pageType", "web");
			} else {
				session.setAttribute("pageType", "admin");
			}
		}

		// 1. Spring Security 사용자권한 처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) { // 로그인이 안되었을경우
			if (session.getAttribute("pageType") != null) { // 사용자 로그인 추가
				if ("web".equals((String) session.getAttribute("pageType"))) {
					if (savedRequest != null) {
						session.setAttribute("beforeUrl", savedRequest.getRedirectUrl());
						return "redirect:/web/user/login/login.do";
					}
				} else {
					return "redirect:/uat/uia/EgovLoginUsr.do";
				}
			}
			return "forward:/uat/uia/EgovLoginUsr.do"; // 로그아웃 경우(사용자는 uat/uia/actionMain.do 사용안함)
		}

		// 현재 로그인 시간에서 20분 후 시간 받아오기(로그아웃될 시간)
		// MJUtil mjUtil = new MJUtil();
		// String timer = mjUtil.getAfterTimerDate(20);

		// 세션에 로그아웃될 시간 저장해 주기
		// session.setAttribute("timer", timer);

		// 사용자 로그린 경우
		if (session.getAttribute("pageType") != null) {
			if ("web".equals((String) session.getAttribute("pageType"))) { // 사용자
				if (session.getAttribute("beforeUrl") != null) { // 사용자 메인
					String tempSessionUrl = (String) session.getAttribute("beforeUrl");
					session.setAttribute("pageType", null);
					return "redirect:" + tempSessionUrl;
				} else if (session.getAttribute("usrBeforeUrl") != null) {
					String tempSessionUrl = (String) session.getAttribute("usrBeforeUrl");
					if (tempSessionUrl.contains("/web/user/login/usrJoinComplete.do")) {
						tempSessionUrl = "/";
					}
					session.setAttribute("pageType", null);
					return "redirect:" + tempSessionUrl;
				} else if (session.getAttribute("joinComplete") != null) {
					if ("Y".equals(session.getAttribute("joinComplete"))) {
						return "redirect:/web/user/login/usrJoinComplete.do";
					}
				} else {
					session.setAttribute("pageType", null);
					// return "redirect:/web/main/mainPage.do";
					
					return "redirect:/";
				}
			}
		}

		return "redirect:/cmm/main/mainPage.do";
	}

	/**
	 * (관리자) 특정 사용자 아이디로 로그인을 처리한다
	 * 
	 * @param vo
	 *            - 아이디, 비밀번호가 담긴 LoginVO
	 * @param request
	 *            - 세션처리를 위한 HttpServletRequest
	 * @return result - 로그인결과(세션정보)
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/login/actionAdmToUsrLogin.do")
	public String actionAdmToUsrSecurityLogin(HttpServletResponse response, HttpServletRequest request,
			@RequestParam Map<String, Object> commandMap, ModelMap model, RedirectAttributes redirectAttributes)
			throws Exception {

		/*
		 * // 해킹 의심 IP 차단상태의 경우 로그인 불가 String userIp = EgovClntInfo.getClntIP(request);
		 * HackIpVO hackIpVO = new HackIpVO(); hackIpVO.setAccessIp(userIp);
		 * hackIpVO.setBlockYn("Y"); if (null != hackIpService.selectHackIpVO(hackIpVO))
		 * { String message = "차단된 아이피입니다. 관리자에게 문의해 주십시요.";
		 * redirectAttributes.addFlashAttribute("message", message); return
		 * "redirect:/"; }
		 * 
		 * ScriptEngineManager engine = new ScriptEngineManager(); if
		 * (loginVO.getSnsSite() != null) { int snsIdCnt =
		 * loginService.selectSnsIdCount(loginVO); LoginVO snsInfo =
		 * loginService.selectSnsId(loginVO); if (snsIdCnt == 0) { LoginVO snsLoginVO =
		 * new LoginVO(); snsLoginVO.setSnsSite(loginVO.getSnsSite());
		 * snsLoginVO.setSnsId(loginVO.getSnsId());
		 * snsLoginVO.setName(loginVO.getName());
		 * snsLoginVO.setSnsEmail(loginVO.getSnsEmail());
		 * 
		 * if (null != snsInfo) { snsLoginVO.setId(snsInfo.getId());
		 * redirectAttributes.addFlashAttribute("loginVO", snsLoginVO); return
		 * "redirect:/web/user/join/snsLink.do"; } else {
		 * 
		 * redirectAttributes.addFlashAttribute("loginVO", snsLoginVO); return
		 * "redirect:/web/user/join/usrJoinIntro.do"; } } else {
		 * loginVO.setId(snsInfo.getId()); loginVO.setPassword(snsInfo.getPassword()); }
		 * 
		 * }
		 */

    	String adminId = request.getParameter("adminId");
    	
		String mberId = request.getParameter("mberId");

		MberManageVO mberManageVO = mberManageService.selectMber(mberId);

		LoginVO usrLoginVO = new LoginVO();

		usrLoginVO.setId(mberManageVO.getMberId());
		usrLoginVO.setPassword(mberManageVO.getPassword());

		usrLoginVO.setUserSe("USR");
		// 로그인 정보 check

		if (usrLoginVO.getId() == null || usrLoginVO.getPassword() == null) {
			// 회원가입 시 로그인 처리
			LoginVO pLoginVO = (LoginVO) request.getAttribute("pLoginVO");
			if (pLoginVO == null) {
				// RSA 키 생성
				initRsa(request);
				/* return "redirect:/web/user/login/login.do"; */
				return "redirect:/";
			} else {
				usrLoginVO.setId(pLoginVO.getId());
				usrLoginVO.setPassword(pLoginVO.getPassword());
				usrLoginVO.setBeforeUrl(pLoginVO.getBeforeUrl());
				usrLoginVO.setMessage(pLoginVO.getMessage());
			}
		}

		// 1. 일반 로그인 처리
		LoginVO resultVO;
		if (usrLoginVO.getSnsSite() == null) {
			usrLoginVO.setIp(EgovClntInfo.getClntIP(request));
			usrLoginVO.setUserSe("GNR");
			usrLoginVO.setStatusAll("Y"); // 신청대기중인 사용자까지 조회
			resultVO = loginService.actionLoginAdmToUsr(usrLoginVO);

			String alertMessage = "";
			if (!"admin".equals(usrLoginVO.getId())) {
				if (null == resultVO.getId()) { // 로그인 실패
					/* loginService.updatePassMissPlus(loginVO); */
					alertMessage = egovMessageSource.getMessage("fail.common.login");

					// 로그인 실패시 해킹의심 IP 테이블에 등록
					/// HackIpVO hackIpVO = new HackIpVO();
					/*
					 * hackIpVO.setHackUserId(loginVO.getId());
					 * hackIpVO.setAccessIp(EgovClntInfo.getClntIP(request));
					 * hackIpService.insertHackIp(hackIpVO);
					 */
					if (usrLoginVO.getBeforeUrl().toString().contains("/web/user/login/login.do")) {
						redirectAttributes.addFlashAttribute("fail", true);
						return "redirect:/web/user/login/login.do";
					}

					return goUserLoginPage(redirectAttributes, usrLoginVO, request, model, alertMessage);
				} else {
					if (resultVO.getPassMiss() > 5) {
						alertMessage = "패스워드가 5회 이상 틀려 로그인 할수 없습니다. 관리자에게 문의하시기 바랍니다.";
						return goUserLoginPage(redirectAttributes, usrLoginVO, request, model, alertMessage);
					} /*
						 * else if("A".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "신청하신 아이디가 현제 승인대기 상" + "태입니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }else
						 * if("B".equals(resultVO.getEmplyrSttusCode())){ //신청상태 alertMessage =
						 * "아이디가 차단상태가 되어 사용할수 없습니다."; return goUserLoginPage(redirectAttributes,
						 * request, model, alertMessage); }
						 */
					loginService.updatePassMissReset(usrLoginVO);
				}
			}

		} else {
			resultVO = loginService.actionSnsLogin(usrLoginVO);
		}

		boolean loginPolicyYn = true;

		// 접속IP
		// userIp = EgovClntInfo.getClntIP(request);

		// resultVO.siteId 의 각 로그인 ip를 조회함
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("") && loginPolicyYn) {
			// 세션에다 ip 등록
			// resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);
			UsernamePasswordAuthenticationFilter springSecurity = null;
			ApplicationContext act = WebApplicationContextUtils
					.getRequiredWebApplicationContext(request.getSession().getServletContext());
			Map<String, UsernamePasswordAuthenticationFilter> beans = act
					.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(
						request.getServletContext().getContextPath() + "/egov_security_login", "POST"));

			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}

			//로그인 필터를 태우는 부분으로 필터를 호출해줌
			//현재 기능에서는 불필요한 기능이라서 주석처리함
			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(),
					resultVO.getUniqId()), response, null);
			{ // 관리자 로그인 log 저장
				String uniqId = ""; 
				String ip = "";

				/* Authenticated */
				LoginLog loginLog = new LoginLog();
				Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
				if (isAuthenticated.booleanValue()) {
					LoginVO user = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
					uniqId = user.getUniqId();
					ip = EgovClntInfo.getClntIP(request);

					HttpSession httpSession = request.getSession(true);
					{
						List<SiteManagerVO> siteManageList = new ArrayList<SiteManagerVO>();
						SiteManagerVO siteManagerVO = new SiteManagerVO();
						siteManagerVO.setFirstIndex(0);
						siteManagerVO.setRecordCountPerPage(100);
						siteManageList = egovSiteManagerService.selectSiteManagerList(siteManagerVO);
						httpSession.setAttribute("siteManageList", siteManageList);
						httpSession.setAttribute("loginId", user.getId()); // 자동완성 공통으로 쓰기위해
						httpSession.setAttribute("esntlId", user.getPassword());

					}
				}
				usrLoginVO.setAdminId(adminId);
				usrLoginVO.getId();
				usrLoginVO.getIp();
				usrLoginVO.setMessage("로그인 성공되었습니다.");
				usrLoginVO.setLoginYn("Y");
				loginService.insertActionLoginLog(usrLoginVO);

			}

			//이전 접속 주소를 메인화면 주소로 입력해 준디ㅏ.
			String beforeUrl = "/web/main/mainPage.do";//(String) commandMap.get("beforeUrl");
			usrLoginVO.setBeforeUrl(beforeUrl);
			
			// 로그인 전 URL 호출 시
			if (usrLoginVO.getBeforeUrl() != null && !("").equals(usrLoginVO.getBeforeUrl())) {
				request.getSession().setAttribute("usrBeforeUrl", usrLoginVO.getBeforeUrl());
				// 회원가입 시 메세지 처리
				if (usrLoginVO.getMessage() != null && !("").equals(usrLoginVO.getMessage())) {
					request.getSession().setAttribute("registMessage", usrLoginVO.getMessage());
				}
			}

			// 개인키 삭제
			// 성공시 웹페이지 분기로 인해 session에 페이지 타입을 넣어준다.
			request.getSession().setAttribute("pageType", "web");
			return "blank"; // 성공 시 페이지.. (redirect 불가)

			// uat/uia/actionMain.do 실제 성공시 무조건 좌측 메소드로 감.
			// return "forward:/web/main/mainPage.do";
		} else {
			String message = egovMessageSource.getMessage("fail.common.login");
			redirectAttributes.addFlashAttribute("beforeUrl", usrLoginVO.getBeforeUrl());
			redirectAttributes.addFlashAttribute("message", message);
			return "redirect:/";
		}
	}

	/**
	 * (관리자)로그아웃한다.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/uat/uia/actionLogout.do")
	public String selectActionLogout(HttpServletRequest request, ModelMap model) throws Exception {
		request.getSession().invalidate();
		return "redirect:/uat/uia/EgovLoginUsr.do";
	}

	/**
	 * (사용자)로그아웃한다.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/uat/uia/actionLogout.do")
	public String selectActionLogoutWeb(HttpServletRequest request, ModelMap model) throws Exception {

		request.getSession().invalidate();

		/* return "redirect:/web/main/mainPage.do"; */ // 기존 로그아웃 시 이동 페이지
		return "redirect:/";
	}

	/* 캡차 테스트 */
	@RequestMapping(value = "/captcha/captchaTest.do")
	public String captchaTest(@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO, ModelMap model)
			throws Exception {
		return "cmm/chptcha/captchaTest";
	}

	/* 캡차 이미지 */
	@RequestMapping(value = "/captcha/captchaImg.do")
	public String captchaImg1(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {

		return "cmm/chptcha/captchaImg";
	}

	/* 캡차 오디오 */
	@RequestMapping(value = "/captcha/captchaAudio.do")
	public String captchaAudio1(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {
		return "cmm/chptcha/captchaAudio";
	}

	/* 캡차 submit */
	@RequestMapping(value = "/captcha/captchaSubmit.do")
	public ModelAndView captchaSubmit(@RequestParam Map<String, Object> commandMap, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		String answer = (String) commandMap.get("answer");
		String captcha = (String) request.getSession().getAttribute("captcha");
		String message = "캡차 입력값이 일치하지 않습니다.";
		if (answer != null && !"".equals(answer)) {
			if (answer.equals(captcha)) {
				message = "캡차 입력값이 일치합니다.";
			}
		}
		modelAndView.addObject("message", message);
		return modelAndView;
	}

	/* 캡차 이미지 */
	@RequestMapping(value = "captchaImg.do")
	public void cpatchaImg(HttpServletRequest request, HttpServletResponse response) throws Exception {
		new CaptchaUtil().captchaImg(request, response);
	}

	@RequestMapping(value = "captchaAudio.do")
	public void cpatchaAudio(HttpServletRequest request, HttpServletResponse response) throws Exception {
		new CaptchaUtil().captchaAudio(request, response);
	}

	/**
	 * 로그인 후 메인화면으로 들어간다
	 * 
	 * @param
	 * @return 로그인 페이지
	 * @exception Exception
	 */
	@RequestMapping(value = "/{siteId}/web/actionLoign.do")
	public String siteActionMain(@PathVariable("siteId") String siteId, HttpServletResponse response,
			HttpServletRequest request, ModelMap model, HttpSession session) throws Exception {

		// initial target url. 첫 호출 URL
		SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response);
		String initialTargetUrl = "";
		if (savedRequest != null) {
			initialTargetUrl = savedRequest.getRedirectUrl();
		}

		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;

		// 1. Spring Security 사용자권한 처리
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (!isAuthenticated) {
			// model.addAttribute("message",
			// egovMessageSource.getMessage("fail.common.login"));

			if ("linc".equals(siteId) || "klc".equals(siteId)) {
				return "web/" + siteFolder + "/main/MemberLogin";
			} else {
				SiteManagerVO siteManagerVO = new SiteManagerVO();
				siteManagerVO.setSiteId(siteId);
				setSiteinfo(siteManagerVO, model, request);
				// return
				// "web/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile()+"/main/MemberLogin";
				return "web/site/" + siteId + "/" + siteManagerVO.getIsMobile() + "/main/MemberLogin";
			}
		}

		LoginVO loginVO = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
		if (null != loginVO && !"super".equals(loginVO.getSiteId())) { // 리스트, 수정, 입력
			if (siteId.equals(loginVO.getSiteId())) { // 사이트 아이디가 다르면
				session.setAttribute("pageType", "web");
				return "web/" + siteFolder + "/main/MemberLogin";
			}
		}

		// 2. 메인 페이지 이동
		return "forward:/" + siteId + "/web/main/mainPage.do";
	}

	/**
	 * 일반사용자 (스프링 시큐리티) 로그인을 처리한다
	 * 
	 * @param vo
	 *            - 아이디, 비밀번호가 담긴 LoginVO
	 * @param request
	 *            - 세션처리를 위한 HttpServletRequest
	 * @return result - 로그인결과(세션정보)
	 * @exception Exception
	 */
	@RequestMapping(value = "/{siteId}/web/actionSecurityLogin.do")
	public String selectActionSiteSecurityLogin(@PathVariable("siteId") String siteId,
			@ModelAttribute("loginVO") LoginVO loginVO, HttpServletResponse response, HttpServletRequest request,
			ModelMap model) throws Exception {
		// 로그인 정보 check
		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;
		if (loginVO.getId() == null || loginVO.getPassword() == null) {
			return "web/" + siteFolder + "/main/MemberLogin";
		}

		// 1. 일반 로그인 처리(사이트)
		LoginVO resultVO = loginService.siteActionLogin(loginVO);
		// 접속IP
		String userIp = EgovClntInfo.getClntIP(request);
		if (resultVO != null && resultVO.getId() != null && !resultVO.getId().equals("")) {
			// 세션에다 ip 등록
			resultVO.setIp(userIp);
			// 2. spring security 연동
			request.getSession().setAttribute("LoginVO", resultVO);
			request.getSession().setAttribute("pageType", "web");
			UsernamePasswordAuthenticationFilter springSecurity = null;
			ApplicationContext act = WebApplicationContextUtils
					.getRequiredWebApplicationContext(request.getSession().getServletContext());
			Map<String, UsernamePasswordAuthenticationFilter> beans = act
					.getBeansOfType(UsernamePasswordAuthenticationFilter.class);
			if (beans.size() > 0) {
				springSecurity = (UsernamePasswordAuthenticationFilter) beans.values().toArray()[0];
				springSecurity.setUsernameParameter("egov_security_username");
				springSecurity.setPasswordParameter("egov_security_password");
				springSecurity.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher(
						request.getServletContext().getContextPath() + "/egov_security_login", "POST"));

			} else {
				throw new IllegalStateException("No AuthenticationProcessingFilter");
			}
			springSecurity.doFilter(new RequestWrapperForSecurity(request, resultVO.getUserSe() + resultVO.getId(),
					resultVO.getUniqId()), response, null);
			return "blank"; // action.do 에서 일반사용자 분기처리
		} else {
			model.addAttribute("message", egovMessageSource.getMessage("fail.common.login"));
			return "web/" + siteFolder + "/main/MemberLogin";
		}
	}

	/**
	 * (사용자) 아이디 찾기 본인인증.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/findUserId.do")
	public String findUserId(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		// 로그인한 유저는 튕기기
		if (isAuthenticated) {
			return "redirect:/";
		}
		
		String radioType = request.getParameter("radioType");

		model.addAttribute("radioType", radioType);
		
		return "web/login/findUserId";
	}

	/**
	 * (사용자) 비밀번호 재설정.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = { "/web/user/rePassword.do"

	})
	public String rePassword(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		// 로그인한 유저는 튕기기
		if (isAuthenticated) {
			return "redirect:/";
		}

		model.addAttribute("types", "2");

		return "web/login/findUserId";
	}
	/**
	  * @Method Name	: selectUserSttusAjax
	  * @작성일 			: 2024. 3. 27.
	  * @작성자			: WYH
	  * @변경이력			: 
	  * @Method 설명 		: 회원상태 조회 (Y:일반회원, B:이용정지 회원, N:탈퇴회원) 
	  */
	@RequestMapping(value = { "/web/user/selectUserSttusAjax.do" })
	public ModelAndView selectUserSttusAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO
			, RedirectAttributes redirectAttributes
			, ModelMap model) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		try {
			
			String userId = mjonMsgVO.getUserId();
			String userSttus = userManageService.selectUserStatusInfoCheck(userId);
			
			modelAndView.addObject("status", "success");
			modelAndView.addObject("userSttus", userSttus);
			
		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", "인증에 실패하였습니다.");
		}
		
		return modelAndView;
	}
	
	
	/**
	 * 아이디 비밀번호 찾기 시스템 문자발송
	 * 
	 * @param searchVO
	 * @param model
	 * @return ""
	 * @throws Exception
	 */
	@RequestMapping(value = { "/web/user/sendSysMsgDataAjax.do" })
	public ModelAndView sendSysMsgDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			RedirectAttributes redirectAttributes, ModelMap model) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		String resultSts = "0";
		String resultBlockSts = "0";

		// 문자 수신 번호 jsp에서 받아와야함!
		/* mjonMsgVO.setCallTo(callTo); */

		// System.out.println("mjonMsgVO.toString()");
		// System.out.println(mjonMsgVO.toString());
		// System.out.println("mjonMsgVO.toString()");

		// 사용자 유효성 검사
		// id, hp, nm
		try {
			

			List<MberCertPhoneVO> mberCertPhoneList = certPhoneService.selectMberCertPhoneList(mjonMsgVO.getUserId());
			
			
			
			

			boolean TorF = mberCertPhoneList.size() > 0 ? true : false;

			
			if (!TorF) {

				modelAndView.addObject("message", "입력하신 아이디/이름/휴대폰 번호에 맞는 회원 정보가 없습니다.");
				modelAndView.addObject("result", "fail-check");
				modelAndView.addObject("resultSts", "0");
				modelAndView.addObject("resultBlockSts", "0");

				return modelAndView;
			}

			UserManageVO userManageVO = new UserManageVO();

			userManageVO.setEmplyrId(mjonMsgVO.getUserId());
			userManageVO.setEmplyrNm(mjonMsgVO.getSearchNm());
			userManageVO.setMoblphonNo(mjonMsgVO.getCallTo());


			List<UserManageVO> usedNmList = userManageService.selectUserIdAjax2(userManageVO);
			if(!usedNmList.get(0).getMberSttus().equals("Y")) {
				
				String mberSttus = usedNmList.get(0).getMberSttus();
				String message = "";
				if(mberSttus.equals("B")) {
					message = "문자온 이용이 정지 된 회원 정보입니다.";
					
				}else {
					message = "문자온에서 탈퇴한 회원 정보입니다.";
				}
				
				modelAndView.addObject("message", message);
				modelAndView.addObject("result", "fail-check");
				modelAndView.addObject("resultSts", "0");
				modelAndView.addObject("resultBlockSts", "0");
				return modelAndView;
			}
			
		} catch (Exception e) {

			logger.error(e.getMessage(), e);
			// modelAndView.addObject("result", "fail");
			// modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());

		}

		try {
			
			
			
			
			MjonMsgReturnVO returnVO = mjonMsgDataService.sendSysMsgData(mjonMsgVO);

			resultSts = returnVO.getSendMsgCnt();
			resultBlockSts = returnVO.getSendMsgBlockCnt();


		} catch (Exception e) {

			logger.error(e.getMessage(), e);
			modelAndView.addObject("result", "fail");
			modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());

		}

		if (!resultSts.equals("0")) {

			modelAndView.addObject("message", "문자 전송이 완료되었습니다.");
			modelAndView.addObject("result", "success");
			modelAndView.addObject("resultSts", resultSts);
			modelAndView.addObject("resultBlockSts", resultBlockSts);

		} else {

			modelAndView.addObject("message", "문자 전송에 오류가 발생하였습니다.");
			modelAndView.addObject("result", "fail");
			modelAndView.addObject("resultSts", "0");
			modelAndView.addObject("resultBlockSts", "0");

		}

		return modelAndView;
	}
	
	/**
	 * 이용정치 회원 주소록 다운로드 본인인증 시스템 문자발송
	 * 
	 * @param searchVO
	 * @param model
	 * @return ""
	 * @throws Exception
	 */
	@RequestMapping(value = { "/web/user/sendAddrRequestMsgDataAjax.do" })
	public ModelAndView sendAddrRequestMsgDataAjax(@ModelAttribute("searchVO") MjonMsgVO mjonMsgVO,
			RedirectAttributes redirectAttributes, ModelMap model) throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		String resultSts = "0";
		String resultBlockSts = "0";
		
		// 비밀번호 찾기 문자내용
		String contents = "주소록 요청 인증번호입니다. 인증번호는 : %code% 입니다.";
		String code = "";
		long seed = System.currentTimeMillis();
		Random random = new Random(seed);
		// code = Integer.toString(random.nextInt(4));
		StringBuffer randomCode = new StringBuffer();
		for (int i = 0; i < 5; i++) {
			code = randomCode.append(Integer.toString(random.nextInt(10))).toString();
		}
		contents = contents.replace("%code%", code);
		
		mjonMsgVO.setSmsTxt(contents);
		mjonMsgVO.setReserveYn("N");
		// 시스템 문자발송 번호
		mjonMsgVO.setCallFrom("15518011");
		
		try {
			
			mjonMsgVO.setUserId("system");
			
			String msgType = "4";
			
			// 전송사 전송 배분
			MjonMsgVO pramVO = new MjonMsgVO();
			List<MjonMsgVO> sendRateList = mjonMsgService.selectTodayAgentSendCntList(pramVO); // 전송사 전송 배분률 및 현재 전송건수
			// 조회
			for (MjonMsgVO tmpVO : sendRateList) {
				float cnt = Float.parseFloat(tmpVO.getMsgGroupCnt());
				float totCnt = tmpVO.getTotCnt();
				tmpVO.setSendRateInfo(Float.parseFloat(tmpVO.getSendRate()) - (cnt / totCnt * 100)); // 배분률 - 현재전송 비율
			}
			
			String sendAgent = sendRateList.get(0).getAgentCode();
			float maxRate = sendRateList.get(0).getSendRateInfo();
			for (MjonMsgVO tmpVO : sendRateList) { // 배분률 대비 현재전송 비율이 가장 적은거 찾기
				if (maxRate < tmpVO.getSendRateInfo()) {
					maxRate = tmpVO.getSendRateInfo();
					sendAgent = tmpVO.getAgentCode();
				}
			}
			
			mjonMsgVO.setMsgType("4");
			mjonMsgVO.setMsgDiv("S");	// 단문	
			
    		// 문자타입별 대표전송사 정보
			MjonMsgVO mjonMsgVO2 = new MjonMsgVO();
			mjonMsgVO2 = mjonMsgService.selectRepMsgAgetnInfo(mjonMsgVO);
			// 전송사 구분 코드 - 01 : 아이하트, 02 : 현대 퓨쳐넷, 03 : 아이엠오, 04 : 다우기술
        	mjonMsgVO.setAgentCode(mjonMsgVO2.getAgentCode()); //전송사 선택			
        	// 전송금액
			mjonMsgVO.setTotPrice(mjonMsgVO2.getAgentPrice().toString());	//총금액
			mjonMsgVO.setEachPrice(mjonMsgVO2.getAgentPrice().toString());	//한건 금액			
			
			MjonMsgReturnVO returnVO = mjonMsgDataService.insertSysMsgDataInfo(mjonMsgVO);
			
			resultSts = returnVO.getSendMsgCnt();
			resultBlockSts = returnVO.getSendMsgBlockCnt();
			
			// 시스템 발송 로그
			SendLogVO sendLogVO = new SendLogVO();
			// SendType 1:문자로 발송 2:이메일로 발송
			sendLogVO.setSendId(returnVO.getMsgGroupId());
			sendLogVO.setSendType("1");
			sendLogVO.setFrstSendInfo(mjonMsgVO.getCallFrom());
			sendLogVO.setReceive(mjonMsgVO.getCallTo());
			sendLogVO.setCheckNo(code);
			sendLogVO.setContents(contents);
			
			mjonMsgDataService.insertSysMsgLog(sendLogVO);
			
		} catch (Exception e) {
			
			logger.error(e.getMessage(), e);
			modelAndView.addObject("result", "fail");
			modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());
			
		}
		
		if (!resultSts.equals("0")) {
			
			modelAndView.addObject("message", "휴대폰으로 전송된 인증번호 5자리를 입력해주시기 바랍니다.");
			modelAndView.addObject("certCode", code);
			modelAndView.addObject("result", "success");
			modelAndView.addObject("resultSts", resultSts);
			modelAndView.addObject("resultBlockSts", resultBlockSts);
			
		} else {
			
			modelAndView.addObject("message", "문자 전송에 오류가 발생하였습니다.");
			modelAndView.addObject("result", "fail");
			modelAndView.addObject("resultSts", "0");
			modelAndView.addObject("resultBlockSts", "0");
			
		}
		
		return modelAndView;
	}

	// 아이디 비밀번호 찾기 시스템 인증번호발송 조회
	@RequestMapping(value = "/web/user/sendSysMsgSelectAjax.do")
	public ModelAndView sendSysMsgSelectAjax(@ModelAttribute("SendLogVO") SendLogVO sendLogVO) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try {
			sendLogVO = mjonMsgDataService.selectSysMsgLog(sendLogVO);
			if (sendLogVO == null) {
				modelAndView.addObject("compare", true);
			} else {
				// 시간 비교
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date nowdate = new Date();
				Date compareDate = format.parse(sendLogVO.getFrstSendPnttm());

				Calendar cal = Calendar.getInstance();
				cal.setTime(compareDate);
				// 1분 추가
				cal.add(Calendar.MINUTE, +1);

				compareDate = cal.getTime();

				if (compareDate.compareTo(nowdate) < 0) {
					modelAndView.addObject("compare", true);
				} else if (compareDate.compareTo(nowdate) > 0) {
					modelAndView.addObject("compare", false);
				}
			}

			modelAndView.addObject("status", "success");

		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
		}
		return modelAndView;
	}

	// 아이디 비밀번호 찾기 kmc본인인증
	@RequestMapping(value = "/web/user/login/kmcPopupIdPwPramAjax.do")
	public ModelAndView kmcPopupIdPwPramAjax(@ModelAttribute("mberManageVO") MberManageVO mberManageVO,
			HttpServletRequest request) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		System.out.println("mberManageVO.toString()");
		System.out.println(mberManageVO.toString());
		System.out.println("mberManageVO.toString()");

		
		// 사용자 유효성 검사
		// id, hp, nm
		try {
			UserManageVO userManageVO = new UserManageVO();

			userManageVO.setEmplyrId(mberManageVO.getMberId());
			userManageVO.setEmplyrNm(mberManageVO.getMberNm());
			userManageVO.setMoblphonNo(mberManageVO.getMoblphonNo());

			boolean TorF = true; 
			if("USR".equals(mberManageVO.getUserSe()))
			{
				TorF = userManageService.selectAdminIdAjax(userManageVO) > 0 ? true : false;
				
				mberManageVO.setMberNm("");
				// 관리자 로그인 본인인증은 name이 null이여야함
				
			}
			else
			{
				
				/*
				 * 일   시 : 2023.07.25
				 * 담당자 : 원영현 과장 수정
				 * 내   용 : Dn 으로 회원정보 조회가 가능하도록 기능 수정
				 *       변경된 핸드폰 번호로 조회시 정보조회가 안되기 때문에  이름과 ID를 이용하여 조건 수정
				 * */
				userManageVO.setMoblphonNo("");
				List<UserManageVO> usedNmList = new ArrayList<>();
				usedNmList = userManageService.selectUserIdAjax2(userManageVO);
				TorF = usedNmList.size() > 0 ? true : false; 
			}


			System.out.println("Out if TorF :: "+TorF);

			if (!TorF) {
				System.out.println(" In if TorF :: "+TorF);

				modelAndView.addObject("message", "입력하신 아이디/이름에 맞는 회원이 없습니다.");
				modelAndView.addObject("result", "fail-check");
				modelAndView.addObject("resultSts", "0");
				modelAndView.addObject("resultBlockSts", "0");

				return modelAndView;
			}

		} catch (Exception e) {

			logger.error(e.getMessage(), e);
			// modelAndView.addObject("result", "fail");
			// modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());

		}

		// modelAndView.addObject("status", "fail");

		try {
			KmcCertChecker kmcCertCheck = new KmcCertChecker();

			// mberId null일경우 ""로
			mberManageVO.setMberId(EgovStringUtil.isNullToString(mberManageVO.getMberId()));

			// kmc 본인인증 실/개발 서버 구분
			String serverNm = "";
			if (request.getServerName().contains("119.193.215.98") || request.getServerName().contains("localhost")) {
				serverNm = request.getScheme() + "://119.193.215.98:8095";
			} else {
				serverNm = request.getScheme() + "://www.munjaon.co.kr";
			}
			String authRUrl = serverNm + mberManageVO.getAuthRUrl();
			
			AuthCertVO certVO = kmcCertCheck.authCertCheckThree(authRUrl, mberManageVO);

			modelAndView.addObject("tr_cert", certVO.getTr_cert());
			modelAndView.addObject("tr_url", certVO.getTr_url());
			modelAndView.addObject("tr_add", certVO.getTr_add());

			modelAndView.addObject("result", "success");

		} catch (Exception e) {
			modelAndView.addObject("result", "fail");
			modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());
		}

		return modelAndView;
	}

	/**
	 * 아이디 비밀번호 찾기 kmc 본인인증(PG사 전송화면)
	 *
	 * @param
	 * @return
	 * @throws Exception
	 */

	@RequestMapping("/web/cop/kmc/authRequestFindIdPwAjax.do")
	public String authRequestFindIdPwAjax(HttpServletRequest request, ModelMap model,
			@RequestParam Map<String, Object> commandMap, @ModelAttribute("searchVO") KmcVO kmcVO,
			RedirectAttributes redirectAttributes) throws Exception {
		
		KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO);
		
		String msg = "";
		if (!findIdKmcCheck(kmcRVO.getDI(), kmcRVO.getName(), kmcRVO.getPhoneNo())) {
			msg = "일치하는 정보가 없습니다.";
			redirectAttributes.addFlashAttribute("message", msg);
			return "redirect:/web/user/findUserId.do";
		}
		
		kmcRVO.setCertType("KMC_아이디패스워드찾기");
		// 디비 테이블에 저장하기
		mberManageService.insertCertInfoLogBn(kmcRVO);

		model.addAttribute("kmcVO", kmcVO);
		return "web/login/findUserIdKmcReqPage";
	}
	
	/**
	 * @param request
	 * @param model
	 * @param commandMap
	 * @param kmcVO
	 * @param redirectAttributes
	 * @return
	 * @throws Exception
	 * @discription 관리자 로그인 DN 값 최초 등록
	 */
	@RequestMapping("/web/cop/kmc/authRequestSelfLoginAjax.do")
	public String authRequestSelfLoginAjax(HttpServletRequest request, ModelMap model,
			@RequestParam Map<String, Object> commandMap, @ModelAttribute("searchVO") KmcVO kmcVO,
			RedirectAttributes redirectAttributes, HttpSession session) throws Exception {

		UserManageVO userManageVO = new UserManageVO();
		
		KmcVO kmcRVO = loginService.kmcDecryption(request, kmcVO);

		userManageVO.setCrtfcDnValue(kmcRVO.getDI());
		userManageVO.setEmplyrNm(kmcRVO.getName());
		userManageVO.setEmplyrId(kmcRVO.getPlusInfo().split(",,,")[0]);
		userManageVO.setPassword(kmcRVO.getPlusInfo().split(",,,")[1]);
		
		userManageService.updateCrtfcDnValue(userManageVO);
		
		try {
		
			String msg = "";
			if (!findIdKmcAdmCheck(userManageVO)) {
				msg = "일치하는 정보가 없습니다.";
				redirectAttributes.addFlashAttribute("message", msg);
				return "redirect:/uat/uia/EgovLoginUsr.do";
			}
		
		} catch (Exception e) {
			System.out.println("???????????????????????");
			e.printStackTrace();
			// TODO: handle exception
		}
		kmcRVO.setCertType("KMC_관리자미인증IP접속인증");
		// 디비 테이블에 저장하기
		
		try {
			mberManageService.insertCertInfoLogBn(kmcRVO);
			
		}  catch (Exception e) {
			System.out.println("!!!!!!!!!!!!!!!!!");
			e.printStackTrace();
			// TODO: handle exception
		}
		
		
		model.addAttribute("kmcVO", kmcRVO);
		
		System.out.println("======================================");
		model.addAttribute("userManageVO", userManageVO);
		
		

		return "web/login/EgovLoginUsrKmcReqPage";
	}

	// 파라미터 유효성 검증 --------------------------------------------
	public Boolean paramChk(String patn, String param) {
		Pattern pattern = Pattern.compile(patn);
		Matcher matcher = pattern.matcher(param);
		boolean b = matcher.matches();
		return b;
	}

	// 파라미터 유효성 검증 --------------------------------------------
	public String returnPage(ModelMap model, String errMessage, KmcVO kmcVO) {
		kmcVO.setErrMessage(errMessage);
		model.addAttribute("kmcVO", kmcVO);
		return "web/cop/nicepay/payRequestAjax";
	}

	// kmc 본인인증 DI 값으로 회원이 있는지 검사
	public Boolean findIdKmcCheck(String DI, String Name, String PhoneNo) throws Exception {
		UserManageVO userManageVO = new UserManageVO();

		/*
		 * 일   시 : 2023.07.25
		 * 담당자 : 원영현 과장 수정
		 * 내   용 : Dn 으로 회원정보 조회가 가능하도록 기능 수정
		 *        쿼리 조회시 번호를 제외한 이름과 Dn으로 조회
		 * */
		
		userManageVO.setEmplyrNm(Name); 	// 이름
//		userManageVO.setMoblphonNo(PhoneNo);
		userManageVO.setMblDn(DI);			// Dn

		List<UserManageVO> usedNmList = userManageService.selectUserIdAjax(userManageVO);

		boolean TorF = usedNmList.size() > 0 ? true : false;

		return TorF;
	}
	
	// kmc 본인인증 DI 값으로 회원이 있는지 검사
	public Boolean findIdKmcAdmCheck(UserManageVO userManageVO) throws Exception {
		return userManageService.selectAdminDiChk(userManageVO) > 0 ? true : false;
	}

	/**
	 * (사용자) 아이디 찾기 결과 화면.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/findUserIdResult.do")
	public String findUserIdResult(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("userManageVO") UserManageVO userManageVO) throws Exception {

		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		// 로그인한 유저는 튕기기
		if (isAuthenticated) {
			return "redirect:/";
		}
		/*
		 * 일   시 : 2023.07.25
		 * 담당자 : 원영현 과장 수정
		 * 내   용 : Dn 으로 회원정보 조회가 가능하도록 기능 수정
		 *        쿼리 조회시 번호를 제외한 이름과 Dn으로 조회
		 * */
		UserManageVO userInfoVO = new UserManageVO();
		userInfoVO.setEmplyrNm(userManageVO.getEmplyrNm()); // 이름
		if (StringUtils.isEmpty(userManageVO.getMblDn())) {
			userInfoVO.setMoblphonNo(userManageVO.getMoblphonNo()); // 휴대폰번호
		}
		userInfoVO.setEmailAdres(userManageVO.getEmailAdres()); // 이메일주소
		userInfoVO.setMblDn(userManageVO.getMblDn());		// Dn
		
		String isFullUserid = "Y";
		List<UserManageVO> usedNmList = userManageService.selectUserIdAjax(userInfoVO);
		try {
			if (!"kmc".equals(userManageVO.getFindType())) {
				for (UserManageVO tmpVO : usedNmList) {
					String emplyrId = "";
					emplyrId = tmpVO.getEmplyrId();
					tmpVO.setEmplyrIdDec(emplyrId);
					emplyrId = emplyrId.substring(0, emplyrId.length() - 3) + "***";
					tmpVO.setEmplyrId(emplyrId);
				}
				
				isFullUserid = "N";
			}

			model.addAttribute("isFullUserid", isFullUserid);
			model.addAttribute("usedNmList", usedNmList);
			
		} catch (Exception e) {
			return "/";
		}

		return "web/login/findUserIdResult";
	}

	/**
	 * (사용자) 비밀번호 재설정 결과 화면.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/findUserPwResult.do")
	public String findUserPwResult(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("userManageVO") UserManageVO userManageVO, RedirectAttributes redirectAttributes)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		// 로그인한 유저는 튕기기
		if (isAuthenticated) {
			redirectAttributes.addFlashAttribute("message", "로그인한 회원은 접근할수 없습니다.");
			return "redirect:/";
		}

		try {
			UserManageVO checkUser = userManageService.selectUserPw2Ajax(userManageVO);

			if (checkUser != null) {
				model.addAttribute("userManageVO", userManageVO);
				return "/web/login/findUserPwResult";
			} else {
				redirectAttributes.addFlashAttribute("message", "입력한 정보를 다시 확인해 주세요.");
				return "redirect:/web/user/findUserId.do";
			}

		} catch (Exception e) {
			redirectAttributes.addFlashAttribute("message", "입력한 정보를 다시 확인해 주세요.");
			return "redirect:/web/user/findUserId.do";
		}
	}

	/**
	 * (사용자) 비밀번호 재설정 update ajax
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/updateUserPwAjax.do")
	public ModelAndView updateUserPwAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("userManageVO") UserManageVO userManageVO) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try {
			
			//비밀번호 규칙성 검증 추가 - 취약점 조치
			userManageVO.setPassword(userManageVO.getPassword().trim());
			String passWord = userManageVO.getPassword();
			
	        Pattern digitPattern = Pattern.compile("[0-9]");
	        Matcher digitMatcher = digitPattern.matcher(passWord);
	        boolean hasDigit = digitMatcher.find();

	        Pattern letterPattern = Pattern.compile("[a-zA-Z]");
	        Matcher letterMatcher = letterPattern.matcher(passWord);
	        boolean hasLetter = letterMatcher.find();

	        Pattern specialPattern = Pattern.compile("[`~!@@#$%^&*|\\\\'\";:/?]");
	        Matcher specialMatcher = specialPattern.matcher(passWord);
	        boolean hasSpecialCharacter = specialMatcher.find();
	        
	        
			if(hasDigit == false || hasLetter == false || hasSpecialCharacter == false || passWord.length() < 8  || passWord.length() > 20) {
				modelAndView.addObject("pwRuleCheck", false);
				return modelAndView;
			}else {
				modelAndView.addObject("pwRuleCheck", true);
			}

			// 해당 정보의 등록 페스워드 조회
			int pwCheck = mberManageService.selectMberPWOverlapCheck(userManageVO);
			
			if (pwCheck != 0) {
				modelAndView.addObject("pwCheck", false);
			} else {
				modelAndView.addObject("pwCheck", true);
				
				// 해당 정보의 유저가 있으면
				UserManageVO checkUser = userManageService.selectUserPw2Ajax(userManageVO);

				if (checkUser != null) {
					// 비밀번호 업데이트
					userManageService.updateUserPWAjax(userManageVO);
					modelAndView.addObject("used", true);
				} else {
					modelAndView.addObject("used", false);
				}
				
			}
		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
		}

		return modelAndView;
	}

	/**
	 * (사용자) 비밀번호 재설정 gmail SMTP 전송 하기
	 * 
	 * @param commandMap
	 *            파라메터전달용 commandMap
	 * @param model
	 *            화면모델
	 * @return /web/member/mypage/updateMemberInfo.do
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/user/sendSysEmailAjax.do")
	public ModelAndView sendSysEmailAjax(@ModelAttribute("SendLogVO") SendLogVO sendLogVO, HttpServletRequest request)
			throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		// 사용자 유효성 검사
		// id, hp, nm
		try {
			UserManageVO userManageVO = new UserManageVO();

			userManageVO.setEmplyrId(sendLogVO.getSendId());
			userManageVO.setEmplyrNm(sendLogVO.getSendType());
			userManageVO.setEmailAdres(sendLogVO.getReceive());

			List<UserManageVO> usedNmList = userManageService.selectUserIdAjax2(userManageVO);

			boolean TorF = usedNmList.size() > 0 ? true : false;


			if (!TorF) {

				modelAndView.addObject("message", "입력하신 아이디/이름/휴대폰 번호에 맞는 회원 정보가 없습니다.");
				modelAndView.addObject("result", "fail-check");
				modelAndView.addObject("resultSts", "0");
				modelAndView.addObject("resultBlockSts", "0");

				return modelAndView;
			}
			
			if(!usedNmList.get(0).getMberSttus().equals("Y")) {
				
				String mberSttus = usedNmList.get(0).getMberSttus();
				String message = "";
				if(mberSttus.equals("B")) {
					message = "문자온 이용이 정지 된 회원 정보입니다.";
					
				}else {
					message = "문자온에서 탈퇴한 회원 정보입니다.";
				}
				
				modelAndView.addObject("message", message);
				modelAndView.addObject("result", "fail-check");
				modelAndView.addObject("resultSts", "0");
				modelAndView.addObject("resultBlockSts", "0");
				return modelAndView;
			}
			

		} catch (Exception e) {

			logger.error(e.getMessage(), e);
			// modelAndView.addObject("result", "fail");
			// modelAndView.addObject("message", "기타 시스템 오류 : " + e.getMessage());

		}

		try {

			// 비밀번호 찾기 내용
			/* String contents = "비밀번호 변경 인증번호입니다. <br> 인증번호는 : <br> %code% <br> 입니다."; */
			String contents = "";
			contents += "<!DOCTYPE html>";
			contents += "<html lang=\"ko\">";

			contents += "<head>";
			contents += "<meta charset=\"UTF-8\">";
			contents += "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">";
			contents += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">";
			contents += "<title>비밀번호 재발급 인증 메일 입니다.</title>";
			contents += "<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">";
			contents += "<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>";
			contents += "<link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap\" rel=\"stylesheet\">";
			contents += "</head>";
			contents += "";
			contents += "<body>";
			contents += "<div class=\"wrap\" style=\"width: 100%; height: 100%; background-color: #e3e8f0; padding: 70px 0;\">";
			contents += "<div class=\"box\" style=\"max-width: 700px; width: 98%; background-color: #fff; box-shadow: 0 0 5px rgba(0,0,0,0.2); border-radius: 20px; overflow: hidden; margin: 0 auto;\">";
			contents += "<div class=\"area_top\" style=\"background-color: #2e5ac8; width: 100%; height: 80px; padding: 0 40px; box-sizing: border-box;\">";
		    contents += "<p style=\"display:inline-block; color: #fff; font-size: 24px; margin: 0; font-family: 'Noto Sans KR', sans-serif; line-height: 80px;\">";
		    contents += "<span style=\"font-weight: 600;\">비밀번호 재발급 인증</span> 메일입니다.</p> <a href=\"http://www.munjaon.co.kr\" target='_blank' style='text-decoration:none'><img src=\"http://www.munjaon.co.kr/publish/images/emailForm/top_logo.png\" alt=\"\" style=\"width: 94px; height: 53px; float: right; margin-top: 12px; vertical-align:top;\"></a>";
		    contents += "</div>";
			/*contents += "<div class=\"area_top\" style=\"width: 100%; box-sizing: border-box; text-align:center; margin: 0;\">";
			contents += "<img src=\"http://www.munjaon.co.kr/publish/images/emailForm/mail_top.png\" style=\"width: 100%; margin-top: -1px;\">";
			contents += "</div>";*/
			contents += "<div class=\"area_content\" style=\"padding: 6%;\">";
			contents += "<p style=\"font-size: 18px; letter-spacing: -0.5px; line-height: 1.5; color: #222; margin: 0; font-weight: 400; font-family: 'Noto Sans KR', sans-serif;\">";
			contents += "안녕하세요. 대량문자 발송 사이트 문자온입니다.<br>비밀번호 재설정을 위해 인증번호를 입력해주세요.</p>";
			contents += "<p class=\"area_num\" style=\"background-color: #f3f4f5; width: 100%; font-family: 'Noto Sans KR', sans-serif; font-size: 36px; font-weight: 600; box-sizing: border-box; border-radius: 5px; letter-spacing: 3px; padding: 8px 30px; margin: 20px 0;\">%code%</p>";
			contents += "<p style=\"font-size: 18px; font-family: 'Noto Sans KR', sans-serif; letter-spacing: -0.5px; line-height: 1.5; color: #222; margin: 0;\">본 인증번호는 5분간 유효합니다. <br>비밀번호 재설정 신청 시각&ensp;:&ensp;<span style=\"margin: 0; color: #002c9a; font-weight: 500; vertical-align: top;\">%date%</span></p>";
			contents += "<p style=\"padding-top: 40px; font-size: 18px; font-family: 'Noto Sans KR', sans-serif; letter-spacing: -0.5px; line-height: 1.5; color: #222; margin: 0;\">문자온 서비스를 이용해 주셔서 감사합니다.</p>";
			contents += "<div class=\"info_mail\" style=\"width: 100%; border-top: 1px solid #d5d5d5; margin-top: 20px;\">";
			contents += "<p style=\"font-size: 15px; font-weight: 400; color: #999; line-height: 1.3; letter-spacing: -0.5px; font-family: 'Noto Sans KR', sans-serif;\">본 메일은 <span style=\"font-weight: 500;\">발신전용</span>이며, 문의에 대한 회신은 처리되지 않습니다. 문자온 관련하여 궁금하신 점이나 불편한 사항은 <span style=\"font-weight: 500;\">고객센터</span>를 통해 문의하여 주시기 바랍니다.</p>";
			contents += "<p style=\"margin-top: 20px; font-size: 15px; font-weight: 400; color: #999; line-height: 1.3; letter-spacing: -0.5px; font-family: 'Noto Sans KR', sans-serif;\">주소 : (12248) 경기도 남양주시 다산순환로 20, A동 735호(다산동, 현대프리미어캠퍼스) <br> 사업자 번호 : 653-87-00858 ｜ 대표 : 유인식 ｜ 통신판매등록번호 : 제 2021-다산-0422 <br> 문의전화 : 1551-8011 ｜ E-mail : help@iten.co.kr</p>";
			contents += "<p style=\"margin-top: 20px; font-size: 15px; font-weight: 400; color: #999; line-height: 1.3; letter-spacing: -0.5px; font-family: 'Noto Sans KR', sans-serif;\">Copyright 2020 ⓒ MUNJAON co. Ltd, All rights reserved.</p>";
			contents += "</div>";
			contents += "</div>";
			contents += "</div>";
			contents += "</div>";
			contents += "</body>";
			contents += "";
			contents += "</html>";

			String repContents = contents;

			String code = "";
			long seed = System.currentTimeMillis();
			Random random = new Random(seed);
			// code = Integer.toString(random.nextInt(4));
			StringBuffer randomCode = new StringBuffer();
			for (int i = 0; i < 5; i++) {

				code = randomCode.append(Integer.toString(random.nextInt(10))).toString();

			}

			repContents = repContents.replace("%code%", code);

			SimpleDateFormat format = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분");
			Date nowdate = new Date();
			String date = format.format(nowdate);

			repContents = repContents.replace("%date%", date);

			// 임시비밀번호 이메일로 보내기
			SendMail sMail = new SendMail();
			EmailVO mailSender = new EmailVO();

			// 사용자 이메일 주소
			mailSender.setSend_from("noreply@munjaon.co.kr");

			// 발송자 이메일 주소
			mailSender.setSend_to(sendLogVO.getReceive());

			// 메일 제목
			mailSender.setTitle("문자온 비밀번호 재설정 인증번호입니다.");

			// 메일 내용
			mailSender.setContents(repContents);

			// 메일 발송하기
			/*sMail.sendMail(mailSender);*/
			sMail.sendMail2(mailSender);
			

			// 발송 이력 저장 SendType 1:문자로 발송 2:이메일로 발송
			sendLogVO.setSendType("2");
			sendLogVO.setFrstSendInfo("noreply@munjaon.co.kr");
			sendLogVO.setCheckNo(code);
			sendLogVO.setContents(repContents);

			mjonMsgDataService.insertSysMsgLog(sendLogVO);

			modelAndView.addObject("result", "success");
			modelAndView.addObject("message", "인증번호가 이메일주소로 발송되었습니다.");

		} catch (Exception e) {
			modelAndView.addObject("result", "fail");
			modelAndView.addObject("message", "이메일 발송 중에 오류가 발생하였습니다.\n(F5)새로고침 후 다시 진행 부탁드립니다.");
		}

		return modelAndView;
	}

	/**
	 * (사용자) 비밀번호 찾기.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/{siteId}/web/user/findPassword.do")
	public String findPassword(@PathVariable("siteId") String siteId, HttpServletRequest request,
			HttpServletResponse response, ModelMap model) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/{siteId}/web/main/mainPage.do";

		return "web/site/itn/login/findPassword";
	}

	/**
	 * (사용자) 아이디 비밀번호 안내.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/{siteId}/web/user/findView.do")
	public String findView(@PathVariable("siteId") String siteId, HttpServletRequest request,
			HttpServletResponse response, ModelMap model) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/cmm/main/mainPage.do";

		return "web/site/itn/login/findView";
	}

	/**
	 * (사용자) 비밀번호 변경 화면.
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/{siteId}/web/user/changePassword.do")
	public String changePassword(@PathVariable("siteId") String siteId, HttpServletRequest request,
			HttpServletResponse response, ModelMap model) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/cmm/main/mainPage.do";

		return "web/site/itn/login/changePassword";
	}

	@RequestMapping(value = "/{siteId}/web/user/join/snsLink.do")
	public String snsLink(@ModelAttribute("loginVO") LoginVO loginVO, ModelMap model, HttpSession session) {
		String siteId = (String) session.getAttribute("siteId");
		model.addAttribute("loginVO", loginVO);
		return "web/site/" + siteId + "/login/snsLinkPage";
	}

	@RequestMapping(value = "/{siteId}/web/user/join/snsLinkUpdate.do")
	public String snsLinkUpdate(@ModelAttribute("loginVO") LoginVO loginVO, ModelMap model, HttpSession session)
			throws Exception {
		String siteId = (String) session.getAttribute("siteId");
		String siteFolder = "site/" + siteId;

		loginService.updateSnsLink(loginVO);

		return "web/" + siteFolder + "/login/usrJoinComplete";
	}

	// (사용자) 회원가입 동의 화면
	@RequestMapping(value = "/{siteId}/web/user/join/usrJoinIntro.do")
	public String usrJoinIntro(@PathVariable("siteId") String siteId, @RequestParam Map<String, Object> commandMap,
			HttpServletRequest request, @ModelAttribute("loginVO") LoginVO loginVO, ModelMap model) throws Exception {

		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/{siteId}/web/main/mainPage.do";

		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;
		model.addAttribute("site_path", "/" + siteFolder);

		MberManageConfigVO mberConfigVO = new MberManageConfigVO(); // 회원가입 환경설정
		mberConfigVO.setUseYn("Y"); // 사용하는것만
		mberConfigVO.setIsSns("N");
		mberConfigVO.setSiteId(siteId);
		List<MberManageConfigVO> mberManageCnfList = mberManageService.selectMberCnf(mberConfigVO);
		model.addAttribute("mberManageCnfList", mberManageCnfList);
		model.addAttribute("loginVO", loginVO);

		// 약관가져오기
		SiteManagerVO termsVO = new SiteManagerVO();
		termsVO.setSiteId(siteId);
		termsVO = egovSiteManagerService.selectSiteManagerVO(termsVO);
		if (null != termsVO) {
			if (!"N".equals(termsVO.getTermsYn())) {
				model.addAttribute("termsVO", termsVO);
			}
		}
		return "web/" + siteFolder + "/login/usrJoinIntro";

	}

	// (사용자) 회원가입 화면
	@RequestMapping(value = "/{siteId}/web/user/join/usrJoinRegist.do")
	public String usrJoinView(@PathVariable("siteId") String siteId, @RequestParam Map<String, Object> commandMap,
			HttpServletRequest request, @ModelAttribute("menuManageVO") MenuManageJTreeVO menuManageVO, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/{siteId}/web/main/mainPage.do";

		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;
		model.addAttribute("site_path", "/" + siteFolder);
		return "web/" + siteFolder + "/login/usrJoinRegist";
	}

	/**
	 * (사용자) 회원가입 처리
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/{siteId}/web/user/join/usrJoinInsert.do")
	public String usrJoinInsert(@PathVariable("siteId") String siteId,
			@ModelAttribute("userManageVO") UserGuestVO userManageVO, HttpServletRequest request,
			HttpServletResponse response, ModelMap model, @RequestParam Map<String, Object> commandMap,
			RedirectAttributes redirectAttributes) throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		if (isAuthenticated)
			return "redirect:/{siteId}/web/main/mainPage.do";

		model.addAttribute("siteId", siteId);
		String siteFolder = "site/" + siteId;
		model.addAttribute("site_path", "/" + siteFolder);

		// UserVO userVO = (UserVO) request.getSession().getAttribute("selfauthUserVO");
		// // 본인인증 정보가 없거나, 인증정보와 번호가 다를때
		// if (userVO == null ||
		// !userManageVO.getMoblphonNo().equals(userVO.getMblNum())) {
		// model.addAttribute("message", "비 정상적인 접근입니다. 본인인증을 해주세요.");
		// return "web/login/usrJoinRegist";
		// }
		// request.getSession().setAttribute("selfauthUserVO", null);

		// 본인인증 데이터
		// userManageVO.setEmplyrNm(userVO.getName());
		// userManageVO.setBrth(userVO.getBirYMD());
		// userManageVO.setMblDn(userVO.getMblDn());
		// userManageVO.setMoblphonNo(userVO.getMblNum());

		// 기 가입된 휴대폰번호인지 확인
		// LoginVO vo = new LoginVO();
		// vo.setMblDn(userVO.getMblDn());
		// vo = loginService.searchIdByMblDn(vo);
		//
		// if (vo != null && vo.getId() != null) {
		// }

		if (1 == 2) {
			model.addAttribute("message", "이미 가입된 휴대폰 번호입니다.");
			return "web/" + siteFolder + "/login/usrJoinRegist";
		}

		userManageVO.setAuthorCode("ROLE_GNRL_USER");
		userManageVO.setJoinType("2"); // 직접가입:2
		userManageVO.setCondition("1"); // 정상:1, 휴면:2, 탈퇴:3
		userManageVO.setUseYn("0"); // 사용:0

		userManageService.insertUser(userManageVO);

		return "web/" + siteFolder + "/login/usrJoinComplete";
	}

	/**
	 * (사용자) 아이디 중복 확인
	 * 
	 * @return model
	 * @throws Exception
	 */
	@RequestMapping(value = "{siteId}/web/user/join/usrIdDplctCnfirmAjax.do")
	public ModelAndView usrIdDplctCnfirmAjax(@PathVariable("siteId") String siteId,
			@RequestParam Map<String, Object> commandMap) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		String checkId = (String) commandMap.get("checkId");
		// checkId = new String(checkId.getBytes("ISO-8859-1"), "UTF-8");

		int usedCnt = userManageService.checkIdDplct(checkId);
		modelAndView.addObject("usedCnt", usedCnt);
		modelAndView.addObject("checkId", checkId);

		return modelAndView;
	}

	/**
	 * (사용자) 아이디 찾기 Ajax
	 * 
	 * @return model
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/user/join/selectUserIdAjax.do")
	public ModelAndView selectUserIdAjax(@ModelAttribute("userManageVO") UserManageVO userManageVO) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try {
			List<UserManageVO> usedNmList = userManageService.selectUserIdAjax(userManageVO);

			/* modelAndView.addObject("usedNmList", usedNmList); */

			if (usedNmList.size() > 0) {
				modelAndView.addObject("status", "success");
			} else {
				modelAndView.addObject("status", "fail");
			}
		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
		}
		return modelAndView;
	}

	/**
	 * (사용자) 비밀번호 변경 Ajax
	 * 
	 * @return model
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/user/join/selectUserPwAjax.do")
	public ModelAndView selectUserPwAjax(@ModelAttribute("userManageVO") UserManageVO userManageVO) throws Exception {

		userManageVO.setEmplyrId(userManageVO.getEmplyrId().toLowerCase());
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try {
			SendLogVO sendLogVO = new SendLogVO();
			if (!"".equals(userManageVO.getMoblphonNo()) && userManageVO.getMoblphonNo() != null) {
				sendLogVO.setReceive(userManageVO.getMoblphonNo());
			} else if (!"".equals(userManageVO.getEmailAdres()) && userManageVO.getEmailAdres() != null) {
				sendLogVO.setReceive(userManageVO.getEmailAdres());
			}

			sendLogVO = mjonMsgDataService.selectSysMsgLog(sendLogVO);
			if (sendLogVO == null) {
				modelAndView.addObject("status", "fail");
				modelAndView.addObject("msg", "인증번호 받기 버튼을 누르고 인증번호를 입력해주세요.");
			} else {
				// 시간 비교
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date nowdate = new Date();
				Date compareDate = format.parse(sendLogVO.getFrstSendPnttm());

				Calendar cal = Calendar.getInstance();
				cal.setTime(compareDate);
				// 5분 추가
				cal.add(Calendar.MINUTE, +5);

				compareDate = cal.getTime();

				// 인증번호을 발송한지 5분 이내일때
				if (compareDate.after(nowdate)) {
					UserManageVO checkUser = userManageService.selectUserPw2Ajax(userManageVO);

					if (checkUser != null) {
						modelAndView.addObject("status", "success");
					} else {
						modelAndView.addObject("status", "fail");
						modelAndView.addObject("msg", "인증번호를 확인해 주세요.");
					}
				} else{
					modelAndView.addObject("status", "fail");
					modelAndView.addObject("msg", "인증번호 시간이 초과되었습니다.");
				}
			}

		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", "새로고침 후 다시 진행해 주세요");
		}
		return modelAndView;
	}

	
	/**
	 * (사용자) 주소록 요청 인증번호 확인 Ajax
	 * 
	 * @return model
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/user/selectAddrRequestMsgChkAjax.do")
	public ModelAndView selectAddrRequestMsgChkAjax(@ModelAttribute("userManageVO") UserManageVO userManageVO) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try {
			SendLogVO sendLogVO = new SendLogVO();
			sendLogVO.setReceive(userManageVO.getMoblphonNo());

			sendLogVO = mjonMsgDataService.selectSysMsgLog(sendLogVO);
			if (sendLogVO == null) {
				modelAndView.addObject("status", "fail");
				modelAndView.addObject("msg", "인증번호 받기 버튼을 누르고 인증번호를 입력해주세요.");
			} else {
				// 시간 비교
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				Date nowdate = new Date();
				Date compareDate = format.parse(sendLogVO.getFrstSendPnttm());

				Calendar cal = Calendar.getInstance();
				cal.setTime(compareDate);
				// 5분 추가
				cal.add(Calendar.MINUTE, -5);

				compareDate = cal.getTime();

				// 인증번호을 발송한지 5분 이내일때
				if (compareDate.compareTo(nowdate) < 0) {
					UserManageVO checkUser = userManageService.selectAddrRequestMsgAjax(userManageVO);

					if (checkUser != null) {
						modelAndView.addObject("status", "success");
					} else {
						modelAndView.addObject("status", "fail");
						modelAndView.addObject("msg", "입력한 정보를 확인해 주세요.");
					}
				} else if (compareDate.compareTo(nowdate) > 0) {
					modelAndView.addObject("status", "fail");
					modelAndView.addObject("msg", "인증번호 시간이 초과되었습니다.");
				}
			}

		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
			modelAndView.addObject("msg", "새로고침 후 다시 진행해 주세요");
		}
		return modelAndView;
	}
	
	/**
	 * (사용자) password 찾기
	 * 
	 * @return model
	 * @throws Exception
	 */
	/*
	 * @RequestMapping(value = "{siteId}/web/user/join/selectUserPWAjax.do") public
	 * ModelAndView selectPasswordAjax(@PathVariable("siteId") String siteId,
	 * 
	 * @ModelAttribute("userManageVO") UserManageVO userManageVO) throws Exception {
	 * ModelAndView modelAndView = new ModelAndView();
	 * modelAndView.setViewName("jsonView"); int usedCnt =
	 * userManageService.selectUserPWAjax(userManageVO);
	 * 
	 * if (usedCnt > 0) { String id = userManageVO.getEmplyrId() + "!!";
	 * userManageVO.setPassword(id);
	 * userManageService.updateUserPWAjax(userManageVO); }
	 * modelAndView.addObject("usedCnt", usedCnt); return modelAndView; }
	 */

	private void setSiteinfo(SiteManagerVO siteManagerVO, ModelMap model, HttpServletRequest request) throws Exception {
		SiteManagerVO tempSiteManagerVO = egovSiteManagerService.selectSiteManagerVO(siteManagerVO);
		if (tempSiteManagerVO != null) {
			siteManagerVO.setIsMobile("pc");
			siteManagerVO.setTheme(tempSiteManagerVO.getTheme());
		} else {
			siteManagerVO.setTheme("01");
		}
		WebUtil util = new WebUtil();
		if (util.isMobile(request)) {
			siteManagerVO.setIsMobile("mobile");
		}
		model.addAttribute("siteId", siteManagerVO.getSiteId());
		// model.addAttribute("site_path" ,
		// "/site/theme_"+siteManagerVO.getTheme()+"/"+siteManagerVO.getIsMobile());
		model.addAttribute("site_path", "/site/" + siteManagerVO.getSiteId() + "/" + siteManagerVO.getIsMobile());
	}

	/**
	 * 복호화
	 * 
	 * @param privateKey
	 * @param securedValue
	 * @return
	 * @throws Exception
	 */
	private String decryptRsa(PrivateKey privateKey, String securedValue) throws Exception {
		Cipher cipher = Cipher.getInstance(EgovLoginController.RSA_INSTANCE);
		byte[] encryptedBytes = hexToByteArray(securedValue);
		cipher.init(Cipher.DECRYPT_MODE, privateKey);
		byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
		String decryptedValue = new String(decryptedBytes, "utf-8"); // 문자 인코딩 주의.
		return decryptedValue;
	}

	/**
	 * 16진 문자열을 byte 배열로 변환한다.
	 * 
	 * @param hex
	 * @return
	 */
	public static byte[] hexToByteArray(String hex) {
		if (hex == null || hex.length() % 2 != 0) {
			return new byte[] {};
		}

		byte[] bytes = new byte[hex.length() / 2];
		for (int i = 0; i < hex.length(); i += 2) {
			byte value = (byte) Integer.parseInt(hex.substring(i, i + 2), 16);
			bytes[(int) Math.floor(i / 2)] = value;
		}
		return bytes;
	}

	/**
	 * rsa 공개키, 개인키 생성
	 * 
	 * @param request
	 */
	public void initRsa(HttpServletRequest request) {
		HttpSession session = request.getSession();

		KeyPairGenerator generator;
		try {
			generator = KeyPairGenerator.getInstance(EgovLoginController.RSA_INSTANCE);
			generator.initialize(1024);

			KeyPair keyPair = generator.genKeyPair();
			KeyFactory keyFactory = KeyFactory.getInstance(EgovLoginController.RSA_INSTANCE);
			PublicKey publicKey = keyPair.getPublic();
			PrivateKey privateKey = keyPair.getPrivate();

			session.setAttribute(EgovLoginController.RSA_WEB_KEY, privateKey); // session에 RSA 개인키를 세션에 저장

			RSAPublicKeySpec publicSpec = (RSAPublicKeySpec) keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);
			String publicKeyModulus = publicSpec.getModulus().toString(16);
			String publicKeyExponent = publicSpec.getPublicExponent().toString(16);

			request.setAttribute("RSAModulus", publicKeyModulus); // rsa modulus 를 request 에 추가
			request.setAttribute("RSAExponent", publicKeyExponent); // rsa exponent 를 request 에 추가
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			System.out.println("======================================================");
			System.out.println("=                RSA generator is fail               =");
			System.out.println("=                 EgovLoginController                =");
			System.out.println("======================================================");
		}
	}

	// 사용자 에러페이지 표시후 로그인 페이지로
	private String goUserLoginPage(RedirectAttributes redirectAttributes, LoginVO loginVO, HttpServletRequest request,
			ModelMap model, String alertMessage) throws Exception {
		loginVO.setLoginYn("N");
		loginVO.setMessage(alertMessage);
		loginService.insertActionLoginLog(loginVO);
		redirectAttributes.addFlashAttribute("message", alertMessage);
		if (!"".equals(loginVO.getBeforeUrl())) {
			return "redirect:" + loginVO.getBeforeUrl();
		}
		/* return "redirect:/web/user/login/login.do"; */
		return "redirect:/";
	}
	
	// 사용자 에러페이지 표시후 비밀번호 실패 횟수 초과 페이지로
	private String goUserPassMissPage(RedirectAttributes redirectAttributes, LoginVO loginVO, HttpServletRequest request,
			ModelMap model, String alertMessage) throws Exception {
		loginVO.setLoginYn("N");
		loginVO.setMessage(alertMessage);
		loginService.insertActionLoginLog(loginVO);
		redirectAttributes.addFlashAttribute("message", alertMessage);
		return "redirect:/web/user/loginLimitedFailed.do";
	}

	/* SNS 추가 내역 */

	@RequestMapping(value = "/snsLogin/naverOauth.do", produces = "application/json", method = { RequestMethod.GET,
			RequestMethod.POST })
	public String naverRedirect(Model model, @RequestParam("code") String code, @RequestParam String state,
			HttpSession session, HttpServletRequest req, RedirectAttributes redirectAttributes) {

		String siteId = (String) session.getAttribute("siteId");
		JsonNode node = getAccessToken("naver", code, state);

		// 결과값 출력
		System.out.println("node : " + node);

		// 노드 안에 있는 access_token값을 꺼내 문자열로 변환
		String token = node.get("access_token").toString();

		// 세션에 담아준다.
		session.setAttribute("token", token);
		JsonNode userInfo = getUserInfo("naver", node.get("access_token"));
		JsonNode response = userInfo.path("response");

		String id = response.path("id").asText();
		String name = response.path("name").asText();
		String snsEmail = response.path("email").asText();

		LoginVO loginVO = new LoginVO();
		loginVO.setSnsId(id);
		loginVO.setName(name);
		loginVO.setSnsEmail(snsEmail);
		loginVO.setSnsSite("naver");
		model.addAttribute("loginVO", loginVO);
		return "web/login/EgovUserSNSLogin";
	}

	@RequestMapping(value = "/snsLogin/kakaoOauth.do", produces = "application/json", method = { RequestMethod.GET,
			RequestMethod.POST })
	public String kakaoRedirect(Model model, @RequestParam("code") String code, HttpSession session,
			HttpServletRequest req, RedirectAttributes redirectAttributes) {
		JsonNode node = getAccessToken("kakao", code, "");

		// 노드 안에 있는 access_token값을 꺼내 문자열로 변환
		String token = node.get("access_token").toString();
		// 세션에 담아준다.
		session.setAttribute("token", token);
		JsonNode userInfo = getUserInfo("kakao", node.get("access_token"));

		String id = userInfo.path("id").asText();
		String name = userInfo.path("name").asText();
		String snsEmail = userInfo.path("email").asText();

		// 유저정보 카카오에서 가져오기 Get properties
		JsonNode properties = userInfo.path("properties");
		JsonNode kakao_account = userInfo.path("kakao_account");

		id = userInfo.path("id").asText();
		name = null;
		snsEmail = null;

		name = properties.path("nickname").asText();
		snsEmail = kakao_account.path("email").asText();

		LoginVO loginVO = new LoginVO();
		loginVO.setSnsId(id);
		loginVO.setName(name);
		loginVO.setSnsEmail(snsEmail);
		loginVO.setSnsSite("kakao");
		model.addAttribute("loginVO", loginVO);

		// return
		// "forward:/"+siteId+"/web/user/login/actionSecurityLogin.do?snsnsId="+id+"&name="+name+"&email="+email+"&snsSite=kakao";
		return "web/login/EgovUserSNSLogin";

	}

	public JsonNode getAccessToken(String site, String code, String state) {

		String RequestUrl = "";
		List<NameValuePair> postParams = new ArrayList<NameValuePair>();

		if (site.equals("kakao")) {
			RequestUrl = "https://kauth.kakao.com/oauth/token";
			postParams.add(new BasicNameValuePair("grant_type", "authorization_code"));
			postParams.add(new BasicNameValuePair("client_id", itnKakaoRestApiKey));
			postParams.add(new BasicNameValuePair("code", code));

		} else if (site.equals("naver")) {
			RequestUrl = "https://nid.naver.com/oauth2.0/token";

			postParams.add(new BasicNameValuePair("grant_type", "authorization_code"));
			postParams.add(new BasicNameValuePair("client_id", itnNaverClientId));
			postParams.add(new BasicNameValuePair("client_secret", itnNaverClientSecret));
			postParams.add(new BasicNameValuePair("code", code));
			postParams.add(new BasicNameValuePair("state", state));

		} else if (site.equals("google")) {

		}

		final HttpClient client = HttpClientBuilder.create().build();
		final HttpPost post = new HttpPost(RequestUrl);

		JsonNode returnNode = null;

		try {
			post.setEntity(new UrlEncodedFormEntity(postParams));
			final HttpResponse response = client.execute(post);
			final int responseCode = response.getStatusLine().getStatusCode();

			// JSON 형태 반환값 처리
			ObjectMapper mapper = new ObjectMapper();
			returnNode = mapper.readTree(response.getEntity().getContent());

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
		}
		return returnNode;
	}

	public JsonNode getUserInfo(String site, JsonNode accessToken) {

		// String CLIENT_ID = K_CLIENT_ID; // REST API KEY
		// String REDIRECT_URI = K_REDIRECT_URI; // 리다이렉트 URI
		// String code = autorize_code; // 로그인 과정중 얻은 토큰 값
		String RequestUrl = "";

		if (site.equals("kakao")) {
			RequestUrl = "https://kapi.kakao.com/v2/user/me";

		} else if (site.equals("naver")) {
			RequestUrl = "https://openapi.naver.com/v1/nid/me";

		} else if (site.equals("google")) {

		}

		final HttpClient client = HttpClientBuilder.create().build();
		final HttpPost post = new HttpPost(RequestUrl);

		// add header
		post.addHeader("Authorization", "Bearer " + accessToken);

		JsonNode returnNode = null;

		try {
			final HttpResponse response = client.execute(post);
			final int responseCode = response.getStatusLine().getStatusCode();
			// JSON 형태 반환값 처리
			ObjectMapper mapper = new ObjectMapper();
			returnNode = mapper.readTree(response.getEntity().getContent());

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// clear resources
		}
		return returnNode;
	}

	/* nice체크 오프너로 이용 */
	@RequestMapping("/web/user/login/niceCheckAjax.do")
	public String niceCheckWeb(HttpServletRequest request, @RequestParam Map<String, Object> commandMap,
			@ModelAttribute("userSearchVO") UserDefaultVO userSearchVO,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO, ModelMap model, HttpSession session)
			throws Exception {

		String niceMessage = niceCheck(request, session, mberManageVO).getNiceMessage();

		System.out.println("niceMessage --- " + niceMessage);
		if ("".equals(niceMessage)) { // 정상의 경우 세션 생성 후 오프너 close
			/*
			 * UserVO tempVO = new UserVO(); //
			 * tempVO.setMblDn(damoEnc(userSearchVO.getMblDn(), request)); //DI암호화 //테스트라 주석
			 * tempVO.setName(userSearchVO.getNiceNm());
			 */

			MberManageVO tempVO = new MberManageVO();
			tempVO.setNiceNm(mberManageVO.getNiceNm());
			tempVO.setBirthDay(mberManageVO.getBirthDay());
			tempVO.setMoblphonNo(mberManageVO.getMoblphonNo());
			tempVO.setSexdstnCode(mberManageVO.getSexdstnCode());
			tempVO.setMblDn(mberManageVO.getMblDn()); // DI암호화
			request.getSession().setAttribute("userSearchVO", tempVO);
		}

		return "web/cop/selfauth/niceCheckAjax";
	}

	public MberManageVO niceCheck(HttpServletRequest request, HttpSession session, MberManageVO mberManageVO) {

		CPClient niceCheck = new CPClient();
		String sEncodeData = requestReplace(request.getParameter("EncodeData"), "encodeData");
		String sSiteCode = "BS933"; // NICE로부터 부여받은 사이트 코드
		String sSitePassword = "2CU5kY9wpppk"; // NICE로부터 부여받은 사이트 패스워드

		String sCipherTime = ""; // 복호화한 시간
		String sRequestNumber = ""; // 요청 번호
		String sResponseNumber = ""; // 인증 고유번호
		String sAuthType = ""; // 인증 수단
		String sName = ""; // 성명
		String sDupInfo = ""; // 중복가입 확인값 (DI_64 byte)
		String sConnInfo = ""; // 연계정보 확인값 (CI_88 byte)
		String sBirthDate = ""; // 생년월일(YYYYMMDD)
		String sGender = ""; // 성별
		String sNationalInfo = ""; // 내/외국인정보 (개발가이드 참조)
		String sMobileNo = ""; // 휴대폰번호
		String sMobileCo = ""; // 통신사
		String sMessage = "";
		String sPlainData = "";

		int iReturn = niceCheck.fnDecode(sSiteCode, sSitePassword, sEncodeData);
		if (iReturn == 0) {
			sPlainData = niceCheck.getPlainData();
			sCipherTime = niceCheck.getCipherDateTime();

			// 데이타를 추출합니다.
			java.util.HashMap mapresult = niceCheck.fnParse(sPlainData);

			sRequestNumber = (String) mapresult.get("REQ_SEQ");
			sResponseNumber = (String) mapresult.get("RES_SEQ");
			sAuthType = (String) mapresult.get("AUTH_TYPE");
			sName = (String) mapresult.get("NAME");
			// sName = (String)mapresult.get("UTF8_NAME"); //charset utf8 사용시 주석 해제 후 사용
			sBirthDate = (String) mapresult.get("BIRTHDATE");
			sGender = (String) mapresult.get("GENDER");
			sNationalInfo = (String) mapresult.get("NATIONALINFO");
			sDupInfo = (String) mapresult.get("DI");
			sConnInfo = (String) mapresult.get("CI");
			sMobileNo = (String) mapresult.get("MOBILE_NO");
			sMobileCo = (String) mapresult.get("MOBILE_CO");

			String session_sRequestNumber = (String) session.getAttribute("REQ_SEQ");
			if (!sRequestNumber.equals(session_sRequestNumber)) {
				sMessage = "세션값 불일치 오류입니다.";
				sResponseNumber = "";
				sAuthType = "";
			}
		} else if (iReturn == -1) {
			sMessage = "복호화 시스템 오류입니다.";
		} else if (iReturn == -4) {
			sMessage = "복호화 처리 오류입니다.";
		} else if (iReturn == -5) {
			sMessage = "복호화 해쉬 오류입니다.";
		} else if (iReturn == -6) {
			sMessage = "복호화 데이터 오류입니다.";
		} else if (iReturn == -9) {
			sMessage = "입력 데이터 오류입니다.";
		} else if (iReturn == -12) {
			sMessage = "사이트 패스워드 오류입니다.";
		} else {
			sMessage = "알수 없는 에러 입니다. iReturn : " + iReturn;
		}

		try {
			mberManageVO.setNiceMessage(sMessage);
			mberManageVO.setNiceNm(sName);
			mberManageVO.setMblDn(sDupInfo);
			mberManageVO.setSexdstnCode(sGender);
			mberManageVO.setMoblphonNo(sMobileNo);
			mberManageVO.setBirthDay(sBirthDate);

		} catch (Exception e) {
			e.printStackTrace();
		}
		return mberManageVO;

	}

	// 나이스 인증
	public String requestReplace(String paramValue, String gubun) {

		String result = "";

		if (paramValue != null) {

			paramValue = paramValue.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

			paramValue = paramValue.replaceAll("\\*", "");
			paramValue = paramValue.replaceAll("\\?", "");
			paramValue = paramValue.replaceAll("\\[", "");
			paramValue = paramValue.replaceAll("\\{", "");
			paramValue = paramValue.replaceAll("\\(", "");
			paramValue = paramValue.replaceAll("\\)", "");
			paramValue = paramValue.replaceAll("\\^", "");
			paramValue = paramValue.replaceAll("\\$", "");
			paramValue = paramValue.replaceAll("'", "");
			paramValue = paramValue.replaceAll("@", "");
			paramValue = paramValue.replaceAll("%", "");
			paramValue = paramValue.replaceAll(";", "");
			paramValue = paramValue.replaceAll(":", "");
			paramValue = paramValue.replaceAll("-", "");
			paramValue = paramValue.replaceAll("#", "");
			paramValue = paramValue.replaceAll("--", "");
			paramValue = paramValue.replaceAll("-", "");
			paramValue = paramValue.replaceAll(",", "");

			if (gubun != "encodeData") {
				paramValue = paramValue.replaceAll("\\+", "");
				paramValue = paramValue.replaceAll("/", "");
				paramValue = paramValue.replaceAll("=", "");
			}

			result = paramValue;

		}
		return result;
	}

	// 회원타입(개인,기업) 세션에 저장
	@RequestMapping("/web/user/login/joinInsertAjax.do")
	public ModelAndView testmapajax(HttpServletRequest request, HttpSession session, ModelMap model,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		// HttpSession session = request.getSession();

		// 기존 mberSession 세션 삭제
		session.removeAttribute("mberSession");

		// 선택약관(이벤트 및 혜택 문자, 카카오, 메일 수신)세션에 저장
		// request.getSession().setAttribute("mberSession", mberManageVO);
		session.setAttribute("mberSession", mberManageVO);

		/*
		 * HttpSession session = request.getSession();
		 * session.setAttribute("mberSession", mberManageVO);
		 */

		return modelAndView;
	}

	/**
	 * 첨부파일 개수, 사이즈, 확장자 체크
	 * 
	 * @param fileList
	 *            파일리스트
	 * @param boardMasterVO
	 *            게시판마스터
	 * @param atchFileCnt
	 *            업로드된 파일 수
	 * @return boolean
	 * @return 체크 오류 메세지 model 'flashMessage' 에 set
	 * @throws Exception
	 */
	private boolean isPosblAtchFile(List<FileVO> fileList, MberManageVO mberManageVO, ModelMap model, int atchFileCnt)
			throws Exception {
		int fileCnt = 0;
		long posblAtchFileSize = Long.parseLong(mberManageVO.getPosblAtchFileSize()) * 1024 * 1024;
		String flashMessage = "";
		boolean posblAtchFileFlag = true;
		boolean posblAtchFileSizeFlag = true;
		boolean posblAtchFileExtFlag = true;

		Iterator<?> iter = fileList.iterator();
		while (iter.hasNext()) {
			FileVO vo = (FileVO) iter.next();
			long fileMg = Long.parseLong(vo.getFileMg());
			String fileExt = vo.getFileExtsn();

			if (fileMg > posblAtchFileSize)
				posblAtchFileSizeFlag = false;

			String[] imgExts = { "gif", "jpg", "bmp", "jpeg", "png" };
			if (ArrayUtils.indexOf(imgExts, fileExt.toLowerCase()) == -1)
				posblAtchFileExtFlag = false;

			fileCnt++;
		}

		if (!posblAtchFileExtFlag) {
			flashMessage += "이미지 형식의 확장자만 업로드 가능합니다.";
			posblAtchFileFlag = false;
		}
		if (!posblAtchFileSizeFlag) {
			flashMessage += "파일사이즈가 초과되었습니다. 최대크기 " + posblAtchFileSize + "mb";
			posblAtchFileFlag = false;
		}

		if (!posblAtchFileFlag)
			model.addAttribute("message", flashMessage);

		return posblAtchFileFlag;
	}

	@RequestMapping(value = "/web/user/login/selectIPCntAjax.do")
	public ModelAndView selectIPCntAjax(@ModelAttribute("loginVO") LoginVO loginVO, HttpServletRequest request)
			throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		try {

			LoginVO resultVO = loginService.actionLogin(loginVO);

			if (null == resultVO.getId()) { // 로그인 실패

				modelAndView.addObject("result", "loginFail");

				modelAndView.addObject("message", egovMessageSource.getMessage("fail.common.login"));

				return modelAndView;
			}

			// 일반회원 IP 테이블 조회 후 현재 IP가 등록 되어있나 체크
			int IPCheck = loginService.selectIPCnt(loginVO);

			// 개발편의를 위해 localhost일 경우 bypass
			if (request.getServerName().contains("localhost")) {
				IPCheck = 1;
			}

			// 팝업에 넣을 이름과 핸드폰번호 조회
			LoginVO KMCInfoVO = loginService.selectKMCInfo(loginVO);

			// KMC 팝업 오픈 준비
			KmcCertChecker kmcCertCheck = new KmcCertChecker();
			String mberNm = KMCInfoVO.getMberNm();
			if ("c".equals(KMCInfoVO.getDept())) {
				mberNm = KMCInfoVO.getManagerNm();
			}
			String birth = KMCInfoVO.getBirth();
			String moblphonNo = KMCInfoVO.getMoblphonNo();
			String sexdstnCode = KMCInfoVO.getSexdstnCode();
			String nationality = KMCInfoVO.getNationality();
			String id = loginVO.getId();

			// kmc 본인인증 실/개발 서버 구분
			String serverNm = "";
			if (request.getServerName().contains("219.240.88.15") || request.getServerName().contains("localhost")) {
				serverNm = request.getScheme() + "://219.240.88.15:8095";
			} else {
				serverNm = request.getScheme() + "://www.munjaon.co.kr";
			}

			AuthCertVO certVO = kmcCertCheck.authCertCheckFour(serverNm + "/web/cop/kmc/insertIPAjax.do", mberNm,
					moblphonNo, sexdstnCode, nationality, birth, id);

			modelAndView.addObject("tr_cert", certVO.getTr_cert());
			modelAndView.addObject("tr_url", certVO.getTr_url());
			modelAndView.addObject("tr_add", certVO.getTr_add());

			modelAndView.addObject("IPCheck", IPCheck);

			modelAndView.addObject("status", "success");

		} catch (Exception e) {
			modelAndView.addObject("status", "fail");
		}
		return modelAndView;
	}

	/*
	 * 로그인시 접속 아이피 체크 본인인증 정상처리 후 아이피를 변경하는 로직
	 * 
	 */
	@RequestMapping("/web/cop/kmc/insertIPAjax.do")
	public String insertIPAjax(HttpServletRequest request, ModelMap model, @RequestParam Map<String, Object> commandMap,
			@ModelAttribute("searchVO") KmcVO kmcVO) throws Exception {

		String errMessage = ""; // 에러메세지

		String rec_cert = ""; // 결과값(암호화)
		String certNum = ""; // certNum

		rec_cert = request.getParameter("rec_cert").trim();
		certNum = request.getParameter("certNum").trim();

		kmcVO.setRecCert(rec_cert);
		kmcVO.setCertNum(certNum);
		// 파라미터 유효성 검증
		if (rec_cert.length() == 0 || certNum.length() == 0) {
			errMessage = "비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		// 변수선언
		// --------------------------------------------------------------------------------------------------------
		String k_certNum = ""; // 파라미터로 수신한 요청번호
		k_certNum = certNum;
		String date = ""; // 요청일시
		String CI = ""; // 연계정보(CI)
		String DI = ""; // 중복가입확인정보(DI)
		String phoneNo = ""; // 휴대폰번호
		String phoneCorp = ""; // 이동통신사
		String birthDay = ""; // 생년월일
		String gender = ""; // 성별
		String nation = ""; // 내국인
		String name = ""; // 성명
		String M_name = ""; // 미성년자 성명
		String M_birthDay = ""; // 미성년자 생년월일
		String M_Gender = ""; // 미성년자 성별
		String M_nation = ""; // 미성년자 내외국인
		String result = ""; // 결과값

		String certMet = ""; // 인증방법
		String ip = ""; // ip주소
		String plusInfo = "";

		String encPara = "";
		String encMsg1 = "";
		String encMsg2 = "";
		String msgChk = "";

		com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager();

		// 02. 1차 복호화
		// 수신된 certNum를 이용하여 복호화
		rec_cert = seed.getDec(rec_cert, k_certNum);

		// 03. 1차 파싱
		int inf1 = rec_cert.indexOf("/", 0);
		int inf2 = rec_cert.indexOf("/", inf1 + 1);

		encPara = rec_cert.substring(0, inf1); // 암호화된 통합 파라미터
		encMsg1 = rec_cert.substring(inf1 + 1, inf2); // 암호화된 통합 파라미터의 Hash값

		// 04. 위변조 검증
		encMsg2 = seed.getMsg(encPara);
		kmcVO.setEncMsg2(encMsg2);
		if (encMsg2.equals(encMsg1)) {
			msgChk = "Y";
		}

		if (!"Y".equals(msgChk)) {
			errMessage = "비정상접근입니다.";
			return returnPage(model, errMessage, kmcVO);
		}

		// 05. 2차 복호화
		rec_cert = seed.getDec(encPara, k_certNum);
		kmcVO.setRecCert(rec_cert);
		// 06. 2차 파싱
		int info1 = rec_cert.indexOf("/", 0);
		int info2 = rec_cert.indexOf("/", info1 + 1);
		int info3 = rec_cert.indexOf("/", info2 + 1);
		int info4 = rec_cert.indexOf("/", info3 + 1);
		int info5 = rec_cert.indexOf("/", info4 + 1);
		int info6 = rec_cert.indexOf("/", info5 + 1);
		int info7 = rec_cert.indexOf("/", info6 + 1);
		int info8 = rec_cert.indexOf("/", info7 + 1);
		int info9 = rec_cert.indexOf("/", info8 + 1);
		int info10 = rec_cert.indexOf("/", info9 + 1);
		int info11 = rec_cert.indexOf("/", info10 + 1);
		int info12 = rec_cert.indexOf("/", info11 + 1);
		int info13 = rec_cert.indexOf("/", info12 + 1);
		int info14 = rec_cert.indexOf("/", info13 + 1);
		int info15 = rec_cert.indexOf("/", info14 + 1);
		int info16 = rec_cert.indexOf("/", info15 + 1);
		int info17 = rec_cert.indexOf("/", info16 + 1);
		int info18 = rec_cert.indexOf("/", info17 + 1);

		certNum = rec_cert.substring(0, info1);
		kmcVO.setCertNum(certNum);
		date = rec_cert.substring(info1 + 1, info2);
		kmcVO.setDate(date);
		CI = rec_cert.substring(info2 + 1, info3);
		kmcVO.setCI(CI);
		phoneNo = rec_cert.substring(info3 + 1, info4);
		kmcVO.setPhoneNo(phoneNo);
		phoneCorp = rec_cert.substring(info4 + 1, info5);
		kmcVO.setPhoneCorp(phoneCorp);
		birthDay = rec_cert.substring(info5 + 1, info6);
		kmcVO.setBirthDay(birthDay);
		gender = rec_cert.substring(info6 + 1, info7);
		kmcVO.setGender(gender);
		nation = rec_cert.substring(info7 + 1, info8);
		kmcVO.setNation(nation);
		name = rec_cert.substring(info8 + 1, info9);
		kmcVO.setName(name);
		result = rec_cert.substring(info9 + 1, info10);
		kmcVO.setResult(result);
		certMet = rec_cert.substring(info10 + 1, info11);
		kmcVO.setCertMet(certMet);
		ip = rec_cert.substring(info11 + 1, info12);
		kmcVO.setIp(ip);
		M_name = rec_cert.substring(info12 + 1, info13);
		kmcVO.setMName(M_name);
		M_birthDay = rec_cert.substring(info13 + 1, info14);
		kmcVO.setMBirthDay(M_birthDay);
		M_Gender = rec_cert.substring(info14 + 1, info15);
		kmcVO.setMGender(M_Gender);
		M_nation = rec_cert.substring(info15 + 1, info16);
		kmcVO.setMNation(M_nation);
		plusInfo = rec_cert.substring(info16 + 1, info17);
		kmcVO.setPlusInfo(plusInfo);
		DI = rec_cert.substring(info17 + 1, info18);
		kmcVO.setDI(DI);

		// 07. CI, DI 복호화
		CI = seed.getDec(CI, k_certNum);
		kmcVO.setCI(CI);
		DI = seed.getDec(DI, k_certNum);
		kmcVO.setDI(DI);

		if ("Y".equals(result)) {

		}

		// --------------------------------------------------------------
		String regex = "";
		if (certNum.length() == 0 || certNum.length() > 40) {
			errMessage = "요청번호 비정상.";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[0-9]*";
		if (date.length() != 14 || !paramChk(regex, date)) {
			errMessage = "요청일시";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[A-Z]*";
		if (certMet.length() != 1 || !paramChk(regex, certMet)) {
			errMessage = "본인인증방법 비정상" + certMet;
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[0-9]*";
		if ((phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo)) {
			errMessage = "휴대폰번호 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[A-Z]*";
		if (phoneCorp.length() != 3 || !paramChk(regex, phoneCorp)) {
			errMessage = "이동통신사 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[0-9]*";
		if (birthDay.length() != 8 || !paramChk(regex, birthDay)) {
			errMessage = "생년월일 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[0-9]*";
		if (gender.length() != 1 || !paramChk(regex, gender)) {
			errMessage = "성별 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[0-9]*";
		if (nation.length() != 1 || !paramChk(regex, nation)) {
			errMessage = "내/외국인 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[\\sA-Za-z가-�R.,-]*";
		if (name.length() > 60 || !paramChk(regex, name)) {
			errMessage = "성명 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[A-Z]*";
		if (result.length() != 1 || !paramChk(regex, result)) {
			errMessage = "결과값 비정상";
			return returnPage(model, errMessage, kmcVO);
		}

		regex = "[\\sA-Za-z가-?.,-]*";
		if (M_name.length() != 0) {
			if (M_name.length() > 60 || !paramChk(regex, M_name)) {
				errMessage = "미성년자 성명 비정상";
				return returnPage(model, errMessage, kmcVO);
			}
		}

		regex = "[0-9]*";
		if (M_birthDay.length() != 0) {
			if (M_birthDay.length() != 8 || !paramChk(regex, M_birthDay)) {
				errMessage = "미성년자 생년월일  비정상";
				return returnPage(model, errMessage, kmcVO);
			}
		}

		regex = "[0-9]*";
		if (M_Gender.length() != 0) {
			if (M_Gender.length() != 1 || !paramChk(regex, M_Gender)) {
				errMessage = "미성년자 성별 비정상";
				return returnPage(model, errMessage, kmcVO);
			}
		}

		regex = "[0-9]*";
		if (M_nation.length() != 0) {
			if (M_nation.length() != 1 || !paramChk(regex, M_nation)) {
				errMessage = "미성년자 내/외국인 비정상";
				return returnPage(model, errMessage, kmcVO);
			}
		}
		LoginVO loginVO = new LoginVO();
		loginVO.setId(plusInfo);
		loginVO = loginService.selectKMCInfo(loginVO);
		String userIp = EgovClntInfo.getClntIP(request);
		loginVO.setIp(ip);

		loginService.insertMberIp(loginVO);

		model.addAttribute("kmcVO", kmcVO);
		return "web/cop/kmc/loginIpCheckAjax";
	}

	/*
	 * // 파라미터 유효성 검증 -------------------------------------------- public Boolean
	 * paramChk(String patn, String param){ Pattern pattern = Pattern.compile(patn);
	 * Matcher matcher = pattern.matcher(param); boolean b = matcher.matches();
	 * return b; }
	 * 
	 * // 파라미터 유효성 검증 -------------------------------------------- public String
	 * returnPage(ModelMap model , String errMessage , KmcVO kmcVO){
	 * kmcVO.setErrMessage(errMessage); model.addAttribute("kmcVO", kmcVO); return
	 * "web/cop/nicepay/payRequestAjax"; }
	 */

	// 기업회원 서류심사 사전페이지
	@RequestMapping(value = "/web/user/login/membershipAttachDocBefore.do")
	public String membershipAttachDocBefore(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("mberId") String mberId)
			throws Exception {
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(mberId);		
		MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
		model.addAttribute("cmpChangeManageVO", cmpChangeManageVO);
		return "web/login/membershipAttachDocBefore";
	}
	
	// 기업회원 서류심사 사전페이지
	@RequestMapping(value = "/web/user/login/membershipAttachDoc.do")
	public String membershipAttachDoc2(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("mberId") String mberId)
					throws Exception {
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(mberId);		
		MberManageVO cmpChangeManageVO = mberManageService.selectCmpUsrHst(mberManageVO);
		model.addAttribute("cmpChangeManageVO", cmpChangeManageVO);
		return "web/login/membershipAttachDoc";
	}
	
	/**
	 * 기업회원 전환 변경
	 */
	@RequestMapping(value="/web/user/login/usrJoinReInsertAjax.do")
	public ModelAndView usrJoinReInsertAjax(@ModelAttribute MberManageVO mberManageVO
		, HttpServletRequest request
		, HttpServletResponse response
		, final MultipartHttpServletRequest multiRequest) throws Exception {
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		if("Y".equals(mberManageVO.getAtchFileSttus())) { //사업자등록증 문제 없을 시 - 재직증명서만 새로 제출하며 사업자등록증은 기존에 첨부파일 ID를 사용
			mberManageVO.setAtchFileId(mberManageVO.getBeforeAtchFileId());
		}
		
		if("Y".equals(mberManageVO.getWorkAtchFileSttus())) { //재직증명서 문제 없을 시 - 사업자등록증 새로 제출하며 재직증명서는 기존에 첨부파일 ID를 사용
			mberManageVO.setWorkAtchFileId(mberManageVO.getBeforeWorkAtchFileId());
		}
		
		try {
			
			String wAtchFileId = mberManageVO.getAtchFileId();
			String cAtchFileId = mberManageVO.getWorkAtchFileId();
			final Map<String, MultipartFile> files = multiRequest.getFileMap();
			Map<String, MultipartFile> fileC = new LinkedHashMap<>(); //사업자등록증 
			Map<String, MultipartFile> fileW = new LinkedHashMap<>(); //재직증명서
			if (!files.isEmpty()){
				Iterator<Map.Entry<String, MultipartFile>> it = files.entrySet().iterator();
				int cIndex = 0;
				int wIndex = 0;
				while(it.hasNext()) {
					
					Map.Entry<String, MultipartFile> entry = it.next();
					MultipartFile mFile = entry.getValue();
					
					if(entry.getKey().equals("file")) {	//사업자등록증 - jsp에서 넘겨준 input type="file"의 name
						
						fileC.put("fileC" + cIndex, mFile);
						cIndex++;
						
					}
					
					if(entry.getKey().equals("fileWork")) {	//재직증명서 - jsp에서 넘겨준 input type="file"의 name
						
						fileW.put("fileW" + wIndex, mFile);
						wIndex++;
						
					}
					
				}
				
				if(fileC.size() > 0) { // 사업자등록증
					
					List<FileVO> resultC = fileUtil.parseFileInf(fileC, "BIZ_", 0, "", "", "");
					wAtchFileId = fileMngService.insertFileInfs(resultC);
					mberManageVO.setAtchFileId(wAtchFileId);
				}
				
				if(fileW.size() > 0) { // 재직증명서 첨부파일
					
					List<FileVO> resultW = fileUtil.parseFileInf(fileW, "WORK_", 0, "", "", "");
					cAtchFileId = fileMngService.insertFileInfs(resultW);
					mberManageVO.setWorkAtchFileId(cAtchFileId);
				}
			}
			
			
			mberManageVO.setHstType("01"); //유형 1.회원가입 2.기업회원전환 3.기업정보변경 (공통코드)
			mberManageVO.setHstSttus("01"); //상태 1.신청 2.승인 3.반려 (공통코드)
			mberManageService.insertCmpUsrHst(mberManageVO);

			// 법인폰 알람여부 체크
			JoinSettingVO joinSettingVO = new JoinSettingVO();
			joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
			// 이메일 체크
			if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
				// CS관리자 알림
				String emailTitle = "회원관리 > 기업회원 재승인 요청";
				
				// CS관리자 이메일 알림전송
				mjonNoticeSendUtil.csAdminEmailNoticeSend(mberManageVO.getMberNm(), mberManageVO.getMberId(), emailTitle);
			}

			// SMS 체크			
			if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
				String smsTitle = "기업회원 재승인 요청";
				
				// CS관리자 SMS 알림전송
				mjonNoticeSendUtil.csAdminSmsNoticeSend(mberManageVO.getMberId(), smsTitle);				
			}			

			// SLACK 체크
			if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {			
				// Slack 메시지 발송(단순본문)
				String msg = "[문자온] 기업회원 재승인 요청 - " + mberManageVO.getMberNm() +"("+ mberManageVO.getMberId() + ")";
				mjonCommon.sendSimpleSlackMsg(msg);
			}
			
			modelAndView.addObject("result", "success");
			
		}catch (Exception e) {
			modelAndView.addObject("message", "다시 시도 부탁드립니다.");
			modelAndView.addObject("result", "fail");
		} 
		return modelAndView;
	}


	/**
	 * 제한횟수 이상 로그인 페이지
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/loginLimitedFailed.do")
	public String loginLimitedFailed(HttpServletRequest request, HttpServletResponse response, ModelMap model)
			throws Exception {
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		// 로그인한 유저는 튕기기
		if (isAuthenticated) {
			return "redirect:/";
		}

		return "web/login/loginLimitedFailed";
	}

	
	/**
	 * 비밀번호 재설정 시 비밀번호 실패 횟수 초기화
	 * 
	 * @return String
	 * @exception Exception
	 */
	@RequestMapping(value = "/web/user/updatePassMissResetAjax.do")
	public ModelAndView updatePassMissReset(HttpServletRequest request, HttpServletResponse response, ModelMap model, LoginVO loginVO)
			throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
		// 로그인한 유저는 튕기기
		if (isAuthenticated) {
			modelAndView.addObject("result", "loginUser");  
			return modelAndView;
		}
		try {
			loginService.updatePassMissReset(loginVO);
			modelAndView.addObject("result", "success");
		} catch (Exception e) {
			modelAndView.addObject("result", "fail");
		}
		

		return modelAndView;
	}
	
	
	
	
	
	
	/**
	 * (사용자) SMTP 테스트
	 * 
	 * @param commandMap
	 *            파라메터전달용 commandMap
	 * @param model
	 *            화면모델
	 * @return /web/member/mypage/updateMemberInfo.do
	 * @throws Exception
	 */
	@RequestMapping(value = "/web/user/sendSysEmailTest.do")
	public String sendSysEmailAjaxTest(HttpServletRequest request)
			throws Exception {

		try {

			// 비밀번호 찾기 내용
			/* String contents = "비밀번호 변경 인증번호입니다. <br> 인증번호는 : <br> %code% <br> 입니다."; */
			String contents = "";
			contents += "<!DOCTYPE html>";
			contents += "<html lang=\"ko\">";

			contents += "<head>";
			contents += "<meta charset=\"UTF-8\">";
			contents += "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">";
			contents += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">";
			contents += "<title>비밀번호 재발급 인증 메일 입니다.</title>";
			contents += "<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">";
			contents += "<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>";
			contents += "<link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap\" rel=\"stylesheet\">";
			contents += "</head>";
			contents += "";
			contents += "<body>";
			contents += "<div class=\"wrap\" style=\"width: 100%; height: 100%; background-color: #e3e8f0; padding: 70px 0;\">";
			contents += "<div class=\"box\" style=\"max-width: 700px; width: 98%; background-color: #fff; box-shadow: 0 0 5px rgba(0,0,0,0.2); border-radius: 20px; overflow: hidden; margin: 0 auto;\">";
			/*contents += "<div class=\"area_top\" style=\"background: #333 url(www.munjaon.co.kr/publish/images/emailForm/top_bg.png) no-repeat; width: 100%; height: 80px; display: flex; padding: 0 40px; box-sizing: border-box; align-items: center; justify-content: space-between;\">";
			  contents += "<p style=\"color: #fff; font-size: 24px; margin: 0; font-family: 'Noto Sans KR', sans-serif; line-height: 80px;\">";
			  contents += "<span style=\"font-weight: 600;\">비밀번호 재발급 인증</span> 메일 입니다.</p> <img src=\"www.munjaon.co.kr/publish/images/emailForm/top_logo.png\" alt=\"\" style=\"width: auto;\">";*/
			contents += "<div class=\"area_top\" style=\"width: 100%; box-sizing: border-box; text-align:center; margin: 0;\">";
			contents += "<img src=\"www.munjaon.co.kr/publish/images/emailForm/mail_top.png\" style=\"width: 100%; margin-top: -1px;\">";
			contents += "</div>";
			contents += "<div class=\"area_content\" style=\"padding: 6%;\">";
			contents += "<p style=\"font-size: 18px; letter-spacing: -0.5px; line-height: 1.5; color: #222; margin: 0; font-weight: 400; font-family: 'Noto Sans KR', sans-serif;\">";
			contents += "안녕하세요. 대량문자 발송 사이트 문자온입니다.<br>비밀번호 재설정을 위해 인증번호를 입력해주세요.</p>";
			contents += "<p class=\"area_num\" style=\"background-color: #f3f4f5; width: 100%; font-family: 'Noto Sans KR', sans-serif; font-size: 36px; font-weight: 600; box-sizing: border-box; border-radius: 5px; letter-spacing: 3px; padding: 8px 30px; margin: 20px 0;\">%code%</p>";
			contents += "<p style=\"font-size: 18px; font-family: 'Noto Sans KR', sans-serif; letter-spacing: -0.5px; line-height: 1.5; color: #222; margin: 0;\">본 인증번호는 5분간 유효합니다. <br>비밀번호 재설정 신청 시각&ensp;:&ensp;<span style=\"margin: 0; color: #002c9a; font-weight: 500; vertical-align: top;\">%date%</span></p>";
			contents += "<p style=\"padding-top: 40px; font-size: 18px; font-family: 'Noto Sans KR', sans-serif; letter-spacing: -0.5px; line-height: 1.5; color: #222; margin: 0;\">문자온 서비스를 이용해 주셔서 감사합니다.</p>";
			contents += "<div class=\"info_mail\" style=\"width: 100%; border-top: 1px solid #d5d5d5; margin-top: 20px;\">";
			contents += "<p style=\"font-size: 15px; font-weight: 400; color: #999; line-height: 1.3; letter-spacing: -0.5px; font-family: 'Noto Sans KR', sans-serif;\">본 메일은 <span style=\"font-weight: 500;\">발신전용</span>이며, 문의에 대한 회신은 처리되지 않습니다. 문자온 관련하여 궁금하신 점이나 불편한 사항은 <span style=\"font-weight: 500;\">고객센터</span>를 통해 문의하여 주시기 바랍니다.</p>";
			contents += "<p style=\"margin-top: 20px; font-size: 15px; font-weight: 400; color: #999; line-height: 1.3; letter-spacing: -0.5px; font-family: 'Noto Sans KR', sans-serif;\">주소 : (12248) 경기도 남양주시 다산순환로 20, A동 735호(다산동, 현대프리미어캠퍼스) <br> 사업자 번호 : 653-87-00858 ｜ 대표 : 유인식 ｜ 통신판매등록번호 : 제 2021-다산-0422 <br> 문의전화 : 070-4786-0008 ｜ E-mail : help@iten.co.kr</p>";
			contents += "<p style=\"margin-top: 20px; font-size: 15px; font-weight: 400; color: #999; line-height: 1.3; letter-spacing: -0.5px; font-family: 'Noto Sans KR', sans-serif;\">Copyright 2020 ⓒ MUNJAON co. Ltd, All rights reserved.</p>";
			contents += "</div>";
			contents += "</div>";
			contents += "</div>";
			contents += "</div>";
			contents += "</body>";
			contents += "";
			contents += "</html>";

			String repContents = contents;

			String code = "";
			long seed = System.currentTimeMillis();
			Random random = new Random(seed);
			// code = Integer.toString(random.nextInt(4));
			StringBuffer randomCode = new StringBuffer();
			for (int i = 0; i < 5; i++) {

				code = randomCode.append(Integer.toString(random.nextInt(10))).toString();

			}

			repContents = repContents.replace("%code%", code);

			SimpleDateFormat format = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분");
			Date nowdate = new Date();
			String date = format.format(nowdate);

			repContents = repContents.replace("%date%", date);

			// 임시비밀번호 이메일로 보내기
			SendMail sMail = new SendMail();
			EmailVO mailSender = new EmailVO();

			// 사용자 이메일 주소
			mailSender.setSend_from("noreply@munjaon.co.kr");

			// 발송자 이메일 주소
			mailSender.setSend_to("tolag3@gmail.com");

			// 메일 제목
			mailSender.setTitle("문자온 비밀번호 재설정 인증번호입니다.");

			// 메일 내용
			mailSender.setContents(repContents);

			// 메일 발송하기
			/*sMail.sendMail(mailSender);*/
			sMail.sendMail2(mailSender);
			


		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		return "/";
	}


	/**
	 * 스팸문자이용제한페이지
	 * 
	 * @return String
	 * @exception Exception
	 */

	// 스팸문자이용제한페이지 사전페이지 
	@RequestMapping(value = "/web/user/login/loginRestrictionUseBefore.do")
	public String loginRestrictionUseBefore(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("mberId") String mberId)
					throws Exception {
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(mberId);		
		MberManageVO spamMemberInfoVO = mberManageService.selectSpamMemberInfo(mberManageVO);
		model.addAttribute("spamMemberInfoVO", spamMemberInfoVO);
		return "web/login/loginRestrictionUseBefore";
	}
	
	// 스팸문자이용제한페이지 실제 페이지
	@RequestMapping(value = "/web/user/login/loginRestrictionUse.do")
	public String loginRestrictionUse(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("mberId") String mberId)
					throws Exception {
		
		MberManageVO mberManageVO = new MberManageVO();
		mberManageVO.setMberId(mberId);		
		MberManageVO spamMemberInfoVO = mberManageService.selectSpamMemberInfo(mberManageVO);
		model.addAttribute("spamMemberInfoVO", spamMemberInfoVO);
		
    	if(spamMemberInfoVO.getFileCnt() != "0" && spamMemberInfoVO.getFileCnt() != null) {
    		if(spamMemberInfoVO.getFilePath1() != null) {
    			String filePathId1 = spamMemberInfoVO.getFilePath1().substring(spamMemberInfoVO.getFilePath1().lastIndexOf("/")+1);
    			int idx = filePathId1.lastIndexOf(".");
    			String fileId = filePathId1.substring(0, idx);
    			MjonMsgSentVO info = mjonMsgSentService.selectFileInfo(fileId);
    			model.addAttribute("atchFileId1", info.getAtchFileId());
    			model.addAttribute("fileSn1", info.getFileSn());
    		}
    		
    		if(spamMemberInfoVO.getFilePath2() != null) {
    			String filePathId2 = spamMemberInfoVO.getFilePath2().substring(spamMemberInfoVO.getFilePath2().lastIndexOf("/")+1);
    			int idx = filePathId2.lastIndexOf(".");
    			String fileId = filePathId2.substring(0, idx);
    			MjonMsgSentVO info = mjonMsgSentService.selectFileInfo(fileId);
    			model.addAttribute("atchFileId2", info.getAtchFileId());
    			model.addAttribute("fileSn2", info.getFileSn());
    		}
    		
    		if(spamMemberInfoVO.getFilePath3() != null) {
    			String filePathId3 = spamMemberInfoVO.getFilePath3().substring(spamMemberInfoVO.getFilePath3().lastIndexOf("/")+1);
    			int idx = filePathId3.lastIndexOf(".");
    			String fileId = filePathId3.substring(0, idx);
    			MjonMsgSentVO info = mjonMsgSentService.selectFileInfo(fileId);
    			model.addAttribute("atchFileId3", info.getAtchFileId());
    			model.addAttribute("fileSn3", info.getFileSn());
    		}
    	}		
		return "web/login/loginRestrictionUse";
	}
	
	// 스팸문자이용제한페이지 주소록 다운 요청
	@RequestMapping(value = "/web/user/login/updateReqeustAddrAjax.do")
	public ModelAndView updateReqeustAddrAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model,
			@ModelAttribute("mberManageVO") MberManageVO mberManageVO)
					throws Exception {
		
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");
		
		try {
			mberManageVO.setSendSttus("N"); //주소록 전송 전 상태 'N'
			mberManageService.updateReqeustAddr(mberManageVO);
			
			// 법인폰 알람여부 체크
			JoinSettingVO joinSettingVO = new JoinSettingVO();
			joinSettingVO = egovSiteManagerService.selectAdminNotiDetail();
			// 이메일 체크
			if (joinSettingVO != null && joinSettingVO.getEmailNoti().equals("Y")) {
				String emailTitle = "회원관리 > 이용정지회원 주소록 요청";
				
				// CS관리자 이메일 알림전송
				mjonNoticeSendUtil.csAdminEmailNoticeSend("", mberManageVO.getMberId(), emailTitle);
			}

			// SMS 체크			
			if (joinSettingVO != null && joinSettingVO.getSmsNoti().equals("Y")) {
				String smsTitle = "이용정지회원 주소록 요청";
				
				// CS관리자 SMS 알림전송
				mjonNoticeSendUtil.csAdminSmsNoticeSend(mberManageVO.getMberId(), smsTitle);				
			}

			// SLACK 체크
			if (joinSettingVO != null && joinSettingVO.getSlackNoti().equals("Y")) {			
				// Slack 메시지 발송(단순본문)
				String msg = "[문자온] 이용정지회원 주소록 요청 - " + mberManageVO.getMberId();
				mjonCommon.sendSimpleSlackMsg(msg);
			}			
			
		}catch(Exception e) {
			modelAndView.addObject("message", "주소록 요청에 실패했습니다.");
			modelAndView.addObject("result", "fail");
		}
		modelAndView.addObject("message", "주소록 요청을 완료했습니다.");
		modelAndView.addObject("result", "success");
		return modelAndView;
	}
	
	// 관리자 모바일환경 비번 저장여부
	@RequestMapping(value = "/web/user/admMobilePwSaveCheckAjax.do")
	public ModelAndView admMobilePwSaveCheckAjax(@ModelAttribute("UserManageVO") UserManageVO userManageVO) throws Exception {

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("jsonView");

		boolean isSuccess = true;
		String mobilePwsaveYn = "N";
		String msg = "";
		
		try {
			userManageVO = userManageService.selectAdminMobilePwSaveCheck(userManageVO);
			if (userManageVO.getMobilePwsaveYn().equals("Y")) {
				mobilePwsaveYn = userManageVO.getMobilePwsaveYn();
			}
		}
		catch(Exception e) {
			isSuccess = false;
			msg = e.getMessage();
		}		

		modelAndView.addObject("isSuccess", isSuccess);
		modelAndView.addObject("mobilePwsaveYn", mobilePwsaveYn);
		modelAndView.addObject("msg", msg);
		
		return modelAndView;
	}	
	
	

}

class RequestWrapperForSecurity extends HttpServletRequestWrapper {
	private String username = null;
	private String password = null;

	public RequestWrapperForSecurity(HttpServletRequest request, String username, String password) {
		super(request);
		this.username = username;
		this.password = password;
	}

	@Override
	public String getServletPath() {
		return ((HttpServletRequest) super.getRequest()).getContextPath() + "/egov_security_login";
	}

	@Override
	public String getRequestURI() {
		return ((HttpServletRequest) super.getRequest()).getContextPath() + "/egov_security_login";
	}

	@Override
	public String getParameter(String name) {
		if (name.equals("egov_security_username")) {
			return username;
		}

		if (name.equals("egov_security_password")) {
			return password;
		}

		return super.getParameter(name);
	}

}
