diff --git a/src/main/java/itn/let/cert/ip/service/CertIpService.java b/src/main/java/itn/let/cert/ip/service/CertIpService.java new file mode 100644 index 00000000..d5317c2f --- /dev/null +++ b/src/main/java/itn/let/cert/ip/service/CertIpService.java @@ -0,0 +1,36 @@ +package itn.let.cert.ip.service; + +import java.util.List; + +import itn.let.lett.service.LetterVO; +import itn.let.mail.service.StatusResponse; +import itn.let.mjo.addr.service.AddrVO; +import itn.let.mjo.msg.service.MjonMsgVO; +import itn.let.sym.site.service.JoinSettingVO; +import itn.let.uat.uia.service.MberCertPhoneVO; +import itn.let.uat.uia.web.SendLogVO; +import itn.let.uss.umt.service.MberManageVO; + +public interface CertIpService { + +// public List selectMberCertPhoneList(String userId); +// +// public StatusResponse insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); +// +// public StatusResponse deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); +// +// public List selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO); +// +// public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); +// +// public StatusResponse updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); + + public StatusResponse selectMberCertIpList(MberCertIpVO mberCertPhoneVO); + + public StatusResponse insertCertIp(MberCertIpVO mberCertIpVO); + + public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO); + + + +} diff --git a/src/main/java/itn/let/cert/ip/service/MberCertIpVO.java b/src/main/java/itn/let/cert/ip/service/MberCertIpVO.java new file mode 100644 index 00000000..11ebef19 --- /dev/null +++ b/src/main/java/itn/let/cert/ip/service/MberCertIpVO.java @@ -0,0 +1,71 @@ +package itn.let.cert.ip.service; + +import itn.let.uss.umt.service.UserDefaultVO; + +/** + * + * @author : 이호영 + * @fileName : MberCertPhoneVO.java + * @date : 2024.11.18 + * @description : 발신번호 lettngnrlmber_cert_ip 관련 vo + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.11.18 이호영 최초 생성 + * + * + * + */ +public class MberCertIpVO extends UserDefaultVO{ + + + /** + * @description : + */ + private static final long serialVersionUID = 1L; + + + private String mberId; + private String certIp; + private String certMemo; + private String certUseYn; + private String certMbtlnum; + + + + + + public String getMberId() { + return mberId; + } + public void setMberId(String mberId) { + this.mberId = mberId; + } + public String getCertIp() { + return certIp; + } + public void setCertIp(String certIp) { + this.certIp = certIp; + } + public String getCertMemo() { + return certMemo; + } + public void setCertMemo(String certMemo) { + this.certMemo = certMemo; + } + public String getCertUseYn() { + return certUseYn; + } + public void setCertUseYn(String certUseYn) { + this.certUseYn = certUseYn; + } + public String getCertMbtlnum() { + return certMbtlnum; + } + public void setCertMbtlnum(String certMbtlnum) { + this.certMbtlnum = certMbtlnum; + } + + + +} diff --git a/src/main/java/itn/let/cert/ip/service/impl/CertIpDAO.java b/src/main/java/itn/let/cert/ip/service/impl/CertIpDAO.java new file mode 100644 index 00000000..e1e2278c --- /dev/null +++ b/src/main/java/itn/let/cert/ip/service/impl/CertIpDAO.java @@ -0,0 +1,31 @@ +package itn.let.cert.ip.service.impl; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import egovframework.rte.psl.dataaccess.EgovAbstractDAO; +import itn.let.cert.ip.service.MberCertIpVO; + +@Repository("CertIpDAO") +public class CertIpDAO extends EgovAbstractDAO { + + + + public List selectMberCertIpList(MberCertIpVO mberCertIpVO) { + return (List) list("MberCertIpVO.selectMberCertIpList", mberCertIpVO); + } + + public void insertCertIp(MberCertIpVO mberCertIpVO) { + insert("MberCertIpVO.insertCertIp", mberCertIpVO); + } + + public void deleteCertIp(MberCertIpVO mberCertIpVO) { + insert("MberCertIpVO.deleteCertIp", mberCertIpVO); + } + + public MberCertIpVO findByMberCertIpList(MberCertIpVO mberCertIpVO) { + return (MberCertIpVO) select("MberCertIpVO.findByMberCertIpList", mberCertIpVO); + } + +} diff --git a/src/main/java/itn/let/cert/ip/service/impl/CertIpServiceImpl.java b/src/main/java/itn/let/cert/ip/service/impl/CertIpServiceImpl.java new file mode 100644 index 00000000..023efcc4 --- /dev/null +++ b/src/main/java/itn/let/cert/ip/service/impl/CertIpServiceImpl.java @@ -0,0 +1,47 @@ +package itn.let.cert.ip.service.impl; + +import java.time.LocalDateTime; +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import itn.let.cert.ip.service.CertIpService; +import itn.let.cert.ip.service.MberCertIpVO; +import itn.let.mail.service.StatusResponse; + +@Service("CertIpService") +public class CertIpServiceImpl extends EgovAbstractServiceImpl implements CertIpService { + + @Resource(name = "CertIpDAO") + private CertIpDAO certIpDAO; + + + @Override + public StatusResponse selectMberCertIpList(MberCertIpVO mberCertPhoneVO) { + List mberCertIpListVO = certIpDAO.selectMberCertIpList(mberCertPhoneVO); + return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now()); + } + + + @Override + public StatusResponse insertCertIp(MberCertIpVO mberCertIpVO) { + MberCertIpVO mberCertIpListVO = certIpDAO.findByMberCertIpList(mberCertIpVO); + if(mberCertIpListVO != null) { + return new StatusResponse(HttpStatus.CONFLICT, "중복 IP입니다.", LocalDateTime.now()); + } + certIpDAO.insertCertIp(mberCertIpVO); + return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now()); + } + + + @Override + public StatusResponse deleteCertIp(MberCertIpVO mberCertIpVO) { + certIpDAO.deleteCertIp(mberCertIpVO); + return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now()); + } + +} diff --git a/src/main/java/itn/let/cert/ip/web/CertIpController.java b/src/main/java/itn/let/cert/ip/web/CertIpController.java new file mode 100644 index 00000000..8dfb6947 --- /dev/null +++ b/src/main/java/itn/let/cert/ip/web/CertIpController.java @@ -0,0 +1,102 @@ +package itn.let.cert.ip.web; + +import java.time.LocalDateTime; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.cert.ip.service.CertIpService; +import itn.let.cert.ip.service.MberCertIpVO; +import itn.let.mail.service.StatusResponse; + +/** + * + * @author : 이호영 + * @fileName : CertIpController.java + * @date : 2024.11.19 + * @description : 허용 IP 관련 컨트롤러 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.11.19 이호영 최초 생성 + * + * + * + */ +@Controller +public class CertIpController { + + + /* certIpService */ + @Resource(name = "CertIpService") + private CertIpService certIpService; + + + @RequestMapping(value = {"/cert/ip/selectMberCertIpList.do"}) + public ResponseEntity selectMberCertIpList(MberCertIpVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertPhoneVO.setMberId(userId); + return ResponseEntity.ok().body(certIpService.selectMberCertIpList(mberCertPhoneVO)); + } + + + @RequestMapping(value = {"/cert/ip/insertCertIp.do"}) + public ResponseEntity insertCertIp(MberCertIpVO mberCertIpVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertIpVO.setFrstRegisterId(userId); + mberCertIpVO.setMberId(userId); + + + return ResponseEntity.ok().body(certIpService.insertCertIp(mberCertIpVO)); + } + + @RequestMapping(value = {"/cert/ip/deleteCertIp.do"}) + public ResponseEntity deleteCertIp(MberCertIpVO mberCertIpVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertIpVO.setLastUpdusrId(userId); + mberCertIpVO.setMberId(userId); + + + return ResponseEntity.ok().body(certIpService.deleteCertIp(mberCertIpVO)); + } + +} \ No newline at end of file diff --git a/src/main/java/itn/let/cert/phone/service/CertPhoneService.java b/src/main/java/itn/let/cert/phone/service/CertPhoneService.java new file mode 100644 index 00000000..53b89485 --- /dev/null +++ b/src/main/java/itn/let/cert/phone/service/CertPhoneService.java @@ -0,0 +1,35 @@ +package itn.let.cert.phone.service; + +import java.util.List; + +import itn.let.mail.service.StatusResponse; + +public interface CertPhoneService { + +// public List selectMberCertPhoneList(String userId); +// +// public StatusResponse insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); +// +// public StatusResponse deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); +// +// public List selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO); +// + public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); +// +// public StatusResponse updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); + + public StatusResponse selectMberCertPhoneList(MberCertPhoneVO mberCertPhoneVO); + + public StatusResponse insertCertPhone(MberCertPhoneVO mberCertPhoneVO); + + public StatusResponse deleteCertPhone(MberCertPhoneVO mberCertPhoneVO); + + public List selectMberCertPhoneList(String userId); + + public StatusResponse updateMberCertPhone(MberCertPhoneVO mberCertPhoneVO); + + + + + +} diff --git a/src/main/java/itn/let/uat/uia/service/MberCertPhoneVO.java b/src/main/java/itn/let/cert/phone/service/MberCertPhoneVO.java similarity index 82% rename from src/main/java/itn/let/uat/uia/service/MberCertPhoneVO.java rename to src/main/java/itn/let/cert/phone/service/MberCertPhoneVO.java index b9945ef0..2eda23e9 100644 --- a/src/main/java/itn/let/uat/uia/service/MberCertPhoneVO.java +++ b/src/main/java/itn/let/cert/phone/service/MberCertPhoneVO.java @@ -1,4 +1,4 @@ -package itn.let.uat.uia.service; +package itn.let.cert.phone.service; import itn.let.uss.umt.service.UserDefaultVO; @@ -7,7 +7,7 @@ import itn.let.uss.umt.service.UserDefaultVO; * @author : 이호영 * @fileName : MberCertPhoneVO.java * @date : 2024.11.18 - * @description : 발신번호 lettngnrlmber_cert_phone 관련 vo + * @description : 발신번호 lettngnrlmber_cert_ip 관련 vo * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * @@ -16,6 +16,7 @@ import itn.let.uss.umt.service.UserDefaultVO; * * */ + public class MberCertPhoneVO extends UserDefaultVO{ @@ -30,7 +31,6 @@ public class MberCertPhoneVO extends UserDefaultVO{ private String certAlias; private String certMemo; private String certUseYn; - private String certMbtlnum; @@ -66,12 +66,6 @@ public class MberCertPhoneVO extends UserDefaultVO{ public void setCertUseYn(String certUseYn) { this.certUseYn = certUseYn; } - public String getCertMbtlnum() { - return certMbtlnum; - } - public void setCertMbtlnum(String certMbtlnum) { - this.certMbtlnum = certMbtlnum; - } diff --git a/src/main/java/itn/let/cert/phone/service/impl/CertPhoneDAO.java b/src/main/java/itn/let/cert/phone/service/impl/CertPhoneDAO.java new file mode 100644 index 00000000..d2a7931e --- /dev/null +++ b/src/main/java/itn/let/cert/phone/service/impl/CertPhoneDAO.java @@ -0,0 +1,37 @@ +package itn.let.cert.phone.service.impl; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import egovframework.rte.psl.dataaccess.EgovAbstractDAO; +import itn.let.cert.phone.service.MberCertPhoneVO; + +@Repository("CertPhoneDAO") +public class CertPhoneDAO extends EgovAbstractDAO { + + public List selectMberCertPhoneList(String userId) { + return (List) list("mberCertPhoneVO.selectMberCertPhoneList", userId); + } + + public void insertCertPhone(MberCertPhoneVO mberCertPhoneVO) { + insert("mberCertPhoneVO.insertCertPhone", mberCertPhoneVO); + } + + public void deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) { + insert("mberCertPhoneVO.deleteCertPhone", mberCertPhoneVO); + } + + public MberCertPhoneVO findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { + return (MberCertPhoneVO) select("mberCertPhoneVO.findByCertPhoneInfo", mberCertPhoneVO); + } + + public void updateMberCertPhone(MberCertPhoneVO mberCertPhoneVO) { + insert("mberCertPhoneVO.updateMberCertPhone", mberCertPhoneVO); + + } + + public List selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO) { + return (List) list("mberCertPhoneVO.selectMberCertPhoneListVO", mberCertPhoneVO); + } +} diff --git a/src/main/java/itn/let/cert/phone/service/impl/CertPhoneServiceImpl.java b/src/main/java/itn/let/cert/phone/service/impl/CertPhoneServiceImpl.java new file mode 100644 index 00000000..4f59bc91 --- /dev/null +++ b/src/main/java/itn/let/cert/phone/service/impl/CertPhoneServiceImpl.java @@ -0,0 +1,68 @@ +package itn.let.cert.phone.service.impl; + +import java.time.LocalDateTime; +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; +import itn.let.cert.phone.service.CertPhoneService; +import itn.let.cert.phone.service.MberCertPhoneVO; +import itn.let.mail.service.StatusResponse; + +@Service("CertPhoneService") +public class CertPhoneServiceImpl extends EgovAbstractServiceImpl implements CertPhoneService { + + @Resource(name = "CertPhoneDAO") + private CertPhoneDAO certPhoneDAO; + + + @Override + public StatusResponse selectMberCertPhoneList(MberCertPhoneVO mberCertPhoneVO) { + List mberCertIpListVO = certPhoneDAO.selectMberCertPhoneListVO(mberCertPhoneVO); + return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now()); + } + + + @Override + public StatusResponse insertCertPhone(MberCertPhoneVO mberCertPhoneVO) { + MberCertPhoneVO mberCertIpListVO = certPhoneDAO.findByCertPhoneInfo(mberCertPhoneVO); + if(mberCertIpListVO != null) { + return new StatusResponse(HttpStatus.CONFLICT, "중복 IP입니다.", LocalDateTime.now()); + } + certPhoneDAO.insertCertPhone(mberCertPhoneVO); + return new StatusResponse(HttpStatus.OK, "등록 하였습니다.", LocalDateTime.now()); + } + + + @Override + public StatusResponse deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) { + certPhoneDAO.deleteCertPhone(mberCertPhoneVO); + return new StatusResponse(HttpStatus.OK, "삭제 하였습니다.", LocalDateTime.now()); + } + + + @Override + public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { + MberCertPhoneVO mberCertIpListVO = certPhoneDAO.findByCertPhoneInfo(mberCertPhoneVO); + return new StatusResponse(HttpStatus.OK, mberCertIpListVO, LocalDateTime.now()); + } + + + @Override + public List selectMberCertPhoneList(String userId) { + return certPhoneDAO.selectMberCertPhoneList(userId); + + } + + + @Override + public StatusResponse updateMberCertPhone(MberCertPhoneVO mberCertPhoneVO) { + certPhoneDAO.updateMberCertPhone(mberCertPhoneVO); + return new StatusResponse(HttpStatus.OK, "수정 하였습니다.", LocalDateTime.now()); + } + +} diff --git a/src/main/java/itn/let/cert/phone/web/CertPhoneController.java b/src/main/java/itn/let/cert/phone/web/CertPhoneController.java new file mode 100644 index 00000000..3dff2eee --- /dev/null +++ b/src/main/java/itn/let/cert/phone/web/CertPhoneController.java @@ -0,0 +1,178 @@ +package itn.let.cert.phone.web; + +import java.time.LocalDateTime; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper; +import itn.com.cmm.LoginVO; +import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.cert.phone.service.MberCertPhoneVO; +import itn.let.cert.phone.service.CertPhoneService; +import itn.let.mail.service.StatusResponse; + +/** + * + * @author : 이호영 + * @fileName : CertIpController.java + * @date : 2024.11.19 + * @description : 허용 IP 관련 컨트롤러 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- * + * 2024.11.19 이호영 최초 생성 + * + * + * + */ +@Controller +public class CertPhoneController { + + + /* certPhoneService */ + @Resource(name = "CertPhoneService") + private CertPhoneService certPhoneService; + + + + + @RequestMapping(value = {"/cert/phone/findByCertPhoneInfo.do"}) + public ResponseEntity findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + return ResponseEntity.ok().body(certPhoneService.findByCertPhoneInfo(mberCertPhoneVO)); + } + + @RequestMapping(value = {"/cert/phone/insertCertPhone.do"}) + public ResponseEntity insertCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertPhoneVO.setFrstRegisterId(userId); + + + return ResponseEntity.ok().body(certPhoneService.insertCertPhone(mberCertPhoneVO)); + } + + @RequestMapping(value = {"/cert/phone/updateCertPhone.do"}) + public ResponseEntity updateCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertPhoneVO.setFrstRegisterId(userId); + + + return ResponseEntity.ok().body(certPhoneService.updateMberCertPhone(mberCertPhoneVO)); + } + + @RequestMapping(value = {"/cert/phone/deleteCertPhone.do"}) + public ResponseEntity deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertPhoneVO.setLastUpdusrId(userId); + + + + return ResponseEntity.ok().body(certPhoneService.deleteCertPhone(mberCertPhoneVO)); + } + + + + + + + + + + + + + + + + + + /* + + @RequestMapping(value = {"/uss/umt/user/updateCertPhone.do"}) + public ResponseEntity updateCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertPhoneVO.setFrstRegisterId(userId); + + + return ResponseEntity.ok().body(certPhoneService.updateMberCertPhoneInfo(mberCertPhoneVO)); + } + + @RequestMapping(value = {"/uss/umt/user/deleteCertPhone.do"}) + public ResponseEntity deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { + + ModelAndView modelAndView = new ModelAndView(); + modelAndView.setViewName("jsonView"); + + //로그인 권한정보 불러오기 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); + + if(userId == null) { + if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); + } + mberCertPhoneVO.setLastUpdusrId(userId); + + + + return ResponseEntity.ok().body(certPhoneService.deleteCertPhoneInfo(mberCertPhoneVO)); + } + */ + +} \ No newline at end of file diff --git a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java index d7028706..7bb6990a 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java +++ b/src/main/java/itn/let/mjo/msgdata/service/MjonMsgDataService.java @@ -3,11 +3,9 @@ package itn.let.mjo.msgdata.service; import java.util.List; import itn.let.lett.service.LetterVO; -import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.sym.site.service.JoinSettingVO; -import itn.let.uat.uia.service.MberCertPhoneVO; import itn.let.uat.uia.web.SendLogVO; import itn.let.uss.umt.service.MberManageVO; @@ -179,17 +177,6 @@ public interface MjonMsgDataService { //팩스 거래명세서 합산 정보 public List selectPayUserSumFaxList(MjonMsgVO mjonMsgVO) throws Exception; - public List selectMberCertPhoneList(String userId); - - public StatusResponse insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); - - public StatusResponse deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); - - public List selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO); - - public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); - - public StatusResponse updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO); diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java index 243c046d..1ea11837 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataDAO.java @@ -6,12 +6,10 @@ import org.springframework.stereotype.Repository; import egovframework.rte.psl.dataaccess.EgovAbstractDAO; import itn.let.lett.service.LetterVO; -import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.msg.service.MjonMsgVO; import itn.let.mjo.msgdata.service.MjonMsgDataVO; import itn.let.sym.site.service.JoinSettingVO; -import itn.let.uat.uia.service.MberCertPhoneVO; import itn.let.uat.uia.web.SendLogVO; import itn.let.uss.umt.service.MberManageVO; @@ -369,33 +367,4 @@ public class MjonMsgDataDAO extends EgovAbstractDAO { } - public List selectMberCertPhoneList(String userId) { - - return (List) list("mjonMsgDataDAO.selectMberCertPhoneList", userId); - } - - - public void insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - insert("mjonMsgDataDAO.insertMberCertPhoneInfo", mberCertPhoneVO); - } - - public void updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - update("mjonMsgDataDAO.updateMberCertPhoneInfo", mberCertPhoneVO); - } - - - public void deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - update("mjonMsgDataDAO.deleteCertPhoneInfo", mberCertPhoneVO); - } - - - public List selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO) { - return (List) list("mjonMsgDataDAO.selectMberCertPhoneListVO", mberCertPhoneVO); - } - - - public MberCertPhoneVO findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - return (MberCertPhoneVO) select("mjonMsgDataDAO.findByCertPhoneInfo", mberCertPhoneVO); - } - } diff --git a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java index 950116b9..91a619ab 100644 --- a/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java +++ b/src/main/java/itn/let/mjo/msgdata/service/impl/MjonMsgDataServiceImpl.java @@ -1,7 +1,6 @@ package itn.let.mjo.msgdata.service.impl; import java.text.SimpleDateFormat; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -9,7 +8,6 @@ import java.util.List; import javax.annotation.Resource; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; @@ -18,7 +16,6 @@ import egovframework.rte.psl.dataaccess.util.EgovMap; import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.StringUtil; import itn.let.lett.service.LetterVO; -import itn.let.mail.service.StatusResponse; import itn.let.mjo.addr.service.AddrVO; import itn.let.mjo.event.service.MjonEventService; import itn.let.mjo.event.service.MjonEventVO; @@ -40,7 +37,6 @@ import itn.let.mjo.pay.service.MjonPayVO; import itn.let.mjo.pay.service.impl.MjonPayDAO; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.impl.SiteManagerDAO; -import itn.let.uat.uia.service.MberCertPhoneVO; import itn.let.uat.uia.web.SendLogVO; import itn.let.uss.umt.service.MberManageVO; @@ -3160,46 +3156,5 @@ public class MjonMsgDataServiceImpl extends EgovAbstractServiceImpl implements M return mjonMsgDataDAO.selectPayUserSumFaxList(mjonMsgVO); } - @Override - public List selectMberCertPhoneList(String userId) { - return mjonMsgDataDAO.selectMberCertPhoneList(userId); - } - - @Override - public StatusResponse insertMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - MberCertPhoneVO mberCertPhoneReturnVO = mjonMsgDataDAO.findByCertPhoneInfo(mberCertPhoneVO); - if(mberCertPhoneReturnVO != null) { - return new StatusResponse(HttpStatus.CONFLICT, "중복 번호입니다.", LocalDateTime.now()); - } - - - mjonMsgDataDAO.insertMberCertPhoneInfo(mberCertPhoneVO); - - return new StatusResponse(HttpStatus.OK, "등록하였습니다.", LocalDateTime.now()); - } - - @Override - public StatusResponse updateMberCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - mjonMsgDataDAO.updateMberCertPhoneInfo(mberCertPhoneVO); - return new StatusResponse(HttpStatus.OK, "수정하였습니다.", LocalDateTime.now()); - } - - - @Override - public StatusResponse deleteCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - mjonMsgDataDAO.deleteCertPhoneInfo(mberCertPhoneVO); - return new StatusResponse(HttpStatus.OK, "삭제하였습니다.", LocalDateTime.now()); - } - - @Override - public List selectMberCertPhoneListVO(MberCertPhoneVO mberCertPhoneVO) { - return mjonMsgDataDAO.selectMberCertPhoneListVO(mberCertPhoneVO); - } - - @Override - public StatusResponse findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) { - MberCertPhoneVO mberCertPhoneReturnVO = mjonMsgDataDAO.findByCertPhoneInfo(mberCertPhoneVO); - return new StatusResponse(HttpStatus.OK, mberCertPhoneReturnVO, LocalDateTime.now()); - } } diff --git a/src/main/java/itn/let/uat/uia/web/EgovLoginController.java b/src/main/java/itn/let/uat/uia/web/EgovLoginController.java index f1016408..23ea14b5 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovLoginController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovLoginController.java @@ -83,6 +83,8 @@ 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.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; @@ -109,7 +111,6 @@ 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.uat.uia.service.MberCertPhoneVO; import itn.let.uss.umt.service.EgovMberManageService; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.uss.umt.service.MberManageConfigVO; @@ -237,6 +238,9 @@ public class EgovLoginController { @Resource(name = "mberGrdService") MberGrdService mberGrdService; + + @Resource(name = "CertPhoneService") + private CertPhoneService certPhoneService; private static final Logger logger = LoggerFactory.getLogger(MjonMsgDataController.class); @@ -2054,7 +2058,7 @@ public class EgovLoginController { */ - List mberCertPhoneList = mjonMsgDataService.selectMberCertPhoneList(resultVO.getId()); + List mberCertPhoneList = certPhoneService.selectMberCertPhoneList(resultVO.getId()); modelAndView.addObject("status", "success"); @@ -3633,7 +3637,7 @@ public class EgovLoginController { mberCertPhoneVO.setMberId(mjonMsgVO.getUserId()); - List mberCertPhoneList = mjonMsgDataService.selectMberCertPhoneListVO(mberCertPhoneVO); + List mberCertPhoneList = certPhoneService.selectMberCertPhoneList(mjonMsgVO.getUserId()); diff --git a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java index f0ed2d97..2fa0f583 100644 --- a/src/main/java/itn/let/uat/uia/web/EgovMypageController.java +++ b/src/main/java/itn/let/uat/uia/web/EgovMypageController.java @@ -171,6 +171,7 @@ public class EgovMypageController { @RequestMapping(value="/web/user/mberInfoIndex.do") public String mberInfoIndex( ModelMap model + , HttpServletRequest request , RedirectAttributes redirectAttributes) throws Exception { //로그인 권한정보 불러오기 @@ -448,6 +449,27 @@ public class EgovMypageController { } + + { + /** + * 보안인증 본인인증 기능추가 + * 20241120 원영현 과장 추가 + * */ + KmcCertChecker kmcCertCheck = new KmcCertChecker(); + + //kmc 본인인증 실/개발 서버 구분 + String serverNm = ""; + if(request.getServerName().contains("192.168.0.60") || request.getServerName().contains("localhost")) { + serverNm = request.getScheme() + "://192.168.0.60:8085"; + }else{ + serverNm = request.getScheme() + "://www.munjaon.co.kr"; + } + + AuthCertVO certVO = kmcCertCheck.authCertCheckNine(serverNm + "/web/user/selectSecurityAuthn.do", loginVO.getId()); + model.addAttribute("certVO", certVO); + } + + return "web/user/mberInfoIndex"; } @@ -3494,4 +3516,254 @@ public class EgovMypageController { } return modelAndView; } + + + /** + * 회원정보 조회 휴대폰 인증 + */ + @RequestMapping("/web/user/selectSecurityAuthn.do") + public String selectSecurityAuthn( + HttpServletRequest request, ModelMap model + , @RequestParam Map commandMap + , @ModelAttribute("searchVO") KmcVO kmcVO ) throws Exception { + + //개인회원일 시 mblDn 비교 후 본인 명의 휴대폰만 변경 가능하게끔 + LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; + String mblDn = userManageService.selectUserMblDnById(loginVO.getId()); + model.addAttribute("loginVO", loginVO); + + String errMessage = ""; //에러메세지 + + String rec_cert = ""; // 결과값(암호화) + String certNum = ""; // certNum + + rec_cert = request.getParameter("rec_cert").trim(); + certNum = request.getParameter("certNum").trim(); + + kmcVO.setRecCert(rec_cert); + kmcVO.setCertNum(certNum); + // 파라미터 유효성 검증 + if( rec_cert.length() == 0 || certNum.length() == 0 ){ + errMessage = "비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + + // 변수선언 -------------------------------------------------------------------------------------------------------- + String k_certNum = ""; // 파라미터로 수신한 요청번호 + k_certNum = certNum; + String date = ""; // 요청일시 + String CI = ""; // 연계정보(CI) + String DI = ""; // 중복가입확인정보(DI) + String phoneNo = ""; // 휴대폰번호 + String phoneCorp = ""; // 이동통신사 + String birthDay = ""; // 생년월일 + String gender = ""; // 성별 + String nation = ""; // 내국인 + String name = ""; // 성명 + String M_name = ""; // 미성년자 성명 + String M_birthDay = ""; // 미성년자 생년월일 + String M_Gender = ""; // 미성년자 성별 + String M_nation = ""; // 미성년자 내외국인 + String result = ""; // 결과값 + + String certMet = ""; // 인증방법 + String ip = ""; // ip주소 + String plusInfo = ""; + + String encPara = ""; + String encMsg1 = ""; + String encMsg2 = ""; + String msgChk = ""; + + com.icert.comm.secu.IcertSecuManager seed = new com.icert.comm.secu.IcertSecuManager(); + + //02. 1차 복호화 + //수신된 certNum를 이용하여 복호화 + rec_cert = seed.getDec(rec_cert, k_certNum); + + //03. 1차 파싱 + int inf1 = rec_cert.indexOf("/",0); + int inf2 = rec_cert.indexOf("/",inf1+1); + + encPara = rec_cert.substring(0,inf1); //암호화된 통합 파라미터 + encMsg1 = rec_cert.substring(inf1+1,inf2); //암호화된 통합 파라미터의 Hash값 + + //04. 위변조 검증 + encMsg2 = seed.getMsg(encPara); + kmcVO.setEncMsg2(encMsg2); + if(encMsg2.equals(encMsg1)){ + msgChk="Y"; + } + + if(!"Y".equals(msgChk)) { + errMessage = "비정상접근입니다."; + return returnPage(model , errMessage , kmcVO) ; + } + + //05. 2차 복호화 + rec_cert = seed.getDec(encPara, k_certNum); + kmcVO.setRecCert(rec_cert); + //06. 2차 파싱 + int info1 = rec_cert.indexOf("/",0); + int info2 = rec_cert.indexOf("/",info1+1); + int info3 = rec_cert.indexOf("/",info2+1); + int info4 = rec_cert.indexOf("/",info3+1); + int info5 = rec_cert.indexOf("/",info4+1); + int info6 = rec_cert.indexOf("/",info5+1); + int info7 = rec_cert.indexOf("/",info6+1); + int info8 = rec_cert.indexOf("/",info7+1); + int info9 = rec_cert.indexOf("/",info8+1); + int info10 = rec_cert.indexOf("/",info9+1); + int info11 = rec_cert.indexOf("/",info10+1); + int info12 = rec_cert.indexOf("/",info11+1); + int info13 = rec_cert.indexOf("/",info12+1); + int info14 = rec_cert.indexOf("/",info13+1); + int info15 = rec_cert.indexOf("/",info14+1); + int info16 = rec_cert.indexOf("/",info15+1); + int info17 = rec_cert.indexOf("/",info16+1); + int info18 = rec_cert.indexOf("/",info17+1); + + certNum = rec_cert.substring(0,info1); kmcVO.setCertNum(certNum); + date = rec_cert.substring(info1+1,info2); kmcVO.setDate(date); + CI = rec_cert.substring(info2+1,info3); kmcVO.setCI(CI); + phoneNo = rec_cert.substring(info3+1,info4); kmcVO.setPhoneNo(phoneNo); + phoneCorp = rec_cert.substring(info4+1,info5); kmcVO.setPhoneCorp(phoneCorp); + birthDay = rec_cert.substring(info5+1,info6); kmcVO.setBirthDay(birthDay); + gender = rec_cert.substring(info6+1,info7); kmcVO.setGender(gender); + nation = rec_cert.substring(info7+1,info8); kmcVO.setNation(nation); + name = rec_cert.substring(info8+1,info9); kmcVO.setName(name); + result = rec_cert.substring(info9+1,info10); kmcVO.setResult(result); + certMet = rec_cert.substring(info10+1,info11); kmcVO.setCertMet(certMet); + ip = rec_cert.substring(info11+1,info12); kmcVO.setIp(ip); + M_name = rec_cert.substring(info12+1,info13); kmcVO.setMName(M_name); + M_birthDay = rec_cert.substring(info13+1,info14); kmcVO.setMBirthDay(M_birthDay); + M_Gender = rec_cert.substring(info14+1,info15); kmcVO.setMGender(M_Gender); + M_nation = rec_cert.substring(info15+1,info16); kmcVO.setMNation(M_nation); + plusInfo = rec_cert.substring(info16+1,info17); kmcVO.setPlusInfo(plusInfo); + DI = rec_cert.substring(info17+1,info18); kmcVO.setDI(DI); + + //07. CI, DI 복호화 + CI = seed.getDec(CI, k_certNum); kmcVO.setCI(CI); + DI = seed.getDec(DI, k_certNum); kmcVO.setDI(DI); + + if("Y".equals(result)) { + + } + + //-------------------------------------------------------------- + String regex = ""; + if( certNum.length() == 0 || certNum.length() > 40){ + errMessage = "요청번호 비정상."; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( date.length() != 14 || !paramChk(regex, date) ){ + errMessage = "요청일시"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[A-Z]*"; + if( certMet.length() != 1 || !paramChk(regex, certMet) ){ + errMessage = "본인인증방법 비정상" + certMet; + return returnPage(model , errMessage , kmcVO) ; + } + + + regex = "[0-9]*"; + if( (phoneNo.length() != 10 && phoneNo.length() != 11) || !paramChk(regex, phoneNo) ){ + errMessage = "휴대폰번호 비정상" ; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[A-Z]*"; + if( phoneCorp.length() != 3 || !paramChk(regex, phoneCorp) ){ + errMessage = "이동통신사 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( birthDay.length() != 8 || !paramChk(regex, birthDay) ){ + errMessage = "생년월일 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( gender.length() != 1 || !paramChk(regex, gender) ){ + errMessage = "성별 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[0-9]*"; + if( nation.length() != 1 || !paramChk(regex, nation) ){ + errMessage = "내/외국인 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[\\sA-Za-z가-�R.,-]*"; + if( name.length() > 60 || !paramChk(regex, name) ){ + errMessage = "성명 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[A-Z]*"; + if( result.length() != 1 || !paramChk(regex, result) ){ + errMessage = "결과값 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + + regex = "[\\sA-Za-z가-?.,-]*"; + if( M_name.length() != 0 ){ + if( M_name.length() > 60 || !paramChk(regex, M_name) ){ + errMessage = "미성년자 성명 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + regex = "[0-9]*"; + if( M_birthDay.length() != 0 ){ + if( M_birthDay.length() != 8 || !paramChk(regex, M_birthDay) ){ + errMessage = "미성년자 생년월일 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + regex = "[0-9]*"; + if( M_Gender.length() != 0 ){ + if( M_Gender.length() != 1 || !paramChk(regex, M_Gender) ){ + errMessage = "미성년자 성별 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + regex = "[0-9]*"; + if( M_nation.length() != 0 ){ + if( M_nation.length() != 1 || !paramChk(regex, M_nation) ){ + errMessage = "미성년자 내/외국인 비정상"; + return returnPage(model , errMessage , kmcVO) ; + } + } + + + //KMC 본인인증 로그 + AuthCertVO certVO = new AuthCertVO(); + certVO.setMberId(kmcVO.getPlusInfo()); + certVO.setCertNum(kmcVO.getCertNum()); + certVO.setCertDate(kmcVO.getDate()); + certVO.setCertDi(kmcVO.getDI()); + certVO.setCertPhone(kmcVO.getPhoneNo()); + certVO.setCertNation(kmcVO.getNation()); + certVO.setCertName(kmcVO.getName()); + certVO.setCertResult(kmcVO.getResult()); + certVO.setCertType("KMC_회원정보 변경"); + certVO.setCertIpaddr(kmcVO.getIp()); + certVO.setBirthDay(kmcVO.getBirthDay()); + certVO.setSexdstnCode(kmcVO.getGender()); + + model.addAttribute("kmcVO", kmcVO); + + return "web/user/securityAuthnPage"; + } + } diff --git a/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java b/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java index a70402b9..80dbc8b5 100644 --- a/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java +++ b/src/main/java/itn/let/uat/uia/web/KmcCertChecker.java @@ -586,4 +586,77 @@ public class KmcCertChecker { return certVO; } + + + + // 마이페이지 보안인증 + public AuthCertVO authCertCheckNine(String trUrl, String id) { + + AuthCertVO certVO = new AuthCertVO(); + + //kmc step 01 데이터 + //날짜 생성 + Calendar today = Calendar.getInstance(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); + String day = sdf.format(today.getTime()); + + Random ran = new Random(); + //랜덤 문자 길이 + int numLength = 6; + String randomStr = ""; + + for (int i = 0; i < numLength; i++) { + //0 ~ 9 랜덤 숫자 생성 + randomStr += ran.nextInt(10); + } + + //reqNum은 최대 40byte 까지 사용 가능 + String reqNum = day + randomStr; //요청번호 + + String tr_cert = ""; + String cpId = "MJOM1001"; // 회원사ID + String urlCode = "001014"; // URL코드 + //kmc 본인인증 실/개발 서버 구분 + if(trUrl.contains("192.168.0.60") || trUrl.contains("localhost")) { + urlCode = "010001"; + } + String certNum = reqNum; // 요청번호 ( 본인인증 요청시 중복되지 않게 생성해야함. (예-시퀀스번호) ) + String date = day; // 요청일시 + String certMet = "M"; // 본인인증방법 - M:휴대폰 본인인증, C:신용카드인증, P:공인인증서 인증 + String name = ""; // 성명 + String phoneNo = ""; // 휴대폰번호 + String phoneCorp = ""; // 이동통신사 + if(phoneCorp == null) phoneCorp = ""; + String birthDay = ""; // 생년월일 + String gender = ""; // 성별 + if(gender == null) gender = ""; + String nation = ""; // 내외국인 구분 - 0:내국인, 1:외국인 + String plusInfo = id; // 추가DATA정보 + String extendVar = "0000000000000000"; // 확장변수 + //End-tr_cert 데이터 변수 선언 --------------------------------------------------------------- + + String tr_url = trUrl;//"http://www.munjaon.co.kr/web/cop/kmc/authRequestAjax.do"; // 본인인증서비스 결과수신 POPUP URL + String tr_add = "N"; // IFrame사용여부 + + //01. 한국모바일인증(주) 암호화 모듈 선언 + IcertSecuManager seed = new IcertSecuManager(); + + //02. 1차 암호화 (tr_cert 데이터변수 조합 후 암호화) + String enc_tr_cert = ""; + tr_cert = cpId +"/"+ urlCode +"/"+ certNum +"/"+ date +"/"+ certMet +"/"+ birthDay +"/"+ gender +"/"+ name +"/"+ phoneNo +"/"+ phoneCorp +"/"+ nation +"/"+ plusInfo +"/"+ extendVar; + enc_tr_cert = seed.getEnc(tr_cert, ""); + + //03. 1차 암호화 데이터에 대한 위변조 검증값 생성 (HMAC) + String hmacMsg = ""; + hmacMsg = seed.getMsg(enc_tr_cert); + + //04. 2차 암호화 (1차 암호화 데이터, HMAC 데이터, extendVar 조합 후 암호화) + tr_cert = seed.getEnc(enc_tr_cert + "/" + hmacMsg + "/" + extendVar, ""); + + certVO.setTr_cert(tr_cert); + certVO.setTr_url(tr_url); + certVO.setTr_add(tr_add); + + return certVO; + } } diff --git a/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java b/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java index 96b00346..b6334e4a 100644 --- a/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java +++ b/src/main/java/itn/let/uss/umt/web/EgovUserManageController.java @@ -79,6 +79,8 @@ import itn.com.cmm.util.MJUtil; import itn.com.cmm.util.RedirectUrlMaker; import itn.com.cmm.util.StringUtil; import itn.com.utl.fcc.service.EgovStringUtil; +import itn.let.cert.phone.service.CertPhoneService; +import itn.let.cert.phone.service.MberCertPhoneVO; import itn.let.cop.bbs.service.BoardVO; import itn.let.fax.user.service.FaxGroupDataVO; import itn.let.fax.user.service.FaxService; @@ -131,7 +133,6 @@ import itn.let.sym.site.service.EgovSiteManagerService; import itn.let.sym.site.service.JoinSettingVO; import itn.let.sym.site.service.SiteManagerVO; import itn.let.uat.uia.service.EgovLoginService; -import itn.let.uat.uia.service.MberCertPhoneVO; import itn.let.uat.uia.web.EmailVO; import itn.let.uat.uia.web.SendLogVO; import itn.let.uat.uia.web.SendMail; @@ -281,6 +282,10 @@ public class EgovUserManageController { @Resource(name = "MjonReservMsgService") private MjonReservMsgService mjonReservMsgService; + + @Resource(name = "CertPhoneService") + private CertPhoneService certPhoneService; + @Autowired KakaoApiTemplate kakaoApiTemplate; @@ -1102,7 +1107,7 @@ public class EgovUserManageController { - List mberCertPhoneList = mjonMsgDataService.selectMberCertPhoneList(userId); + List mberCertPhoneList = certPhoneService.selectMberCertPhoneList(userId); model.addAttribute("mberCertPhoneList", mberCertPhoneList); //문자발송 단가 조회하기 @@ -1657,79 +1662,6 @@ public class EgovUserManageController { return modelAndView; } - @RequestMapping(value = {"/uss/umt/user/findByCertPhoneInfo.do"}) - public ResponseEntity findByCertPhoneInfo(MberCertPhoneVO mberCertPhoneVO) throws Exception { - - ModelAndView modelAndView = new ModelAndView(); - modelAndView.setViewName("jsonView"); - - //로그인 권한정보 불러오기 - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - - if(userId == null) { - if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); - } - return ResponseEntity.ok().body(mjonMsgDataService.findByCertPhoneInfo(mberCertPhoneVO)); - } - - @RequestMapping(value = {"/uss/umt/user/insertCertPhone.do"}) - public ResponseEntity insertCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { - - ModelAndView modelAndView = new ModelAndView(); - modelAndView.setViewName("jsonView"); - - //로그인 권한정보 불러오기 - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - - if(userId == null) { - if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); - } - mberCertPhoneVO.setFrstRegisterId(userId); - - - return ResponseEntity.ok().body(mjonMsgDataService.insertMberCertPhoneInfo(mberCertPhoneVO)); - } - - @RequestMapping(value = {"/uss/umt/user/updateCertPhone.do"}) - public ResponseEntity updateCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { - - ModelAndView modelAndView = new ModelAndView(); - modelAndView.setViewName("jsonView"); - - //로그인 권한정보 불러오기 - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - - if(userId == null) { - if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); - } - mberCertPhoneVO.setFrstRegisterId(userId); - - - return ResponseEntity.ok().body(mjonMsgDataService.updateMberCertPhoneInfo(mberCertPhoneVO)); - } - - @RequestMapping(value = {"/uss/umt/user/deleteCertPhone.do"}) - public ResponseEntity deleteCertPhone(MberCertPhoneVO mberCertPhoneVO) throws Exception { - - ModelAndView modelAndView = new ModelAndView(); - modelAndView.setViewName("jsonView"); - - //로그인 권한정보 불러오기 - LoginVO loginVO = EgovUserDetailsHelper.isAuthenticated()? (LoginVO)EgovUserDetailsHelper.getAuthenticatedUser():null; - String userId = loginVO == null ? "" : EgovStringUtil.isNullToString(loginVO.getId()); - - if(userId == null) { - if(StringUtils.isEmpty(userId)) return ResponseEntity.ok().body(new StatusResponse(HttpStatus.BAD_REQUEST, "로그인 후 이용해 주세요", LocalDateTime.now())); - } - mberCertPhoneVO.setLastUpdusrId(userId); - - - - return ResponseEntity.ok().body(mjonMsgDataService.deleteCertPhoneInfo(mberCertPhoneVO)); - } /** * 회원정보 팝업 이벤트 정보 신규 추가 기능 diff --git a/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-cert.xml b/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-cert.xml new file mode 100644 index 00000000..081c2f5f --- /dev/null +++ b/src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-mysql-cert.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/main/resources/egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml new file mode 100644 index 00000000..cb7b6da6 --- /dev/null +++ b/src/main/resources/egovframework/sqlmap/let/cert/MjonCertIp_SQL_mysql.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + /*MberCertIpVO.insertCertIp*/ + + INSERT INTO LETTNGNRLMBER_CERT_IP + ( + MBER_ID + , CERT_IP + , CERT_MEMO + , FRST_REGIST_PNTTM + , FRST_REGISTER_ID + ) + VALUES + ( + #mberId# + , #certIp# + , #certMemo# + , now() + , #frstRegisterId# + ) + + + + + /*MberCertIpVO.deleteCertIp*/ + + + UPDATE LETTNGNRLMBER_CERT_IP + SET + CERT_USE_YN = 'N' + , LAST_UPDT_PNTTM = now() + , LAST_UPDUSR_ID = #lastUpdusrId# + WHERE + MBER_ID = #mberId# + AND CERT_IP = #certIp# + + + + + + + \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml new file mode 100644 index 00000000..6add6b57 --- /dev/null +++ b/src/main/resources/egovframework/sqlmap/let/cert/MjonCertPhone_SQL_mysql.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + /* mberCertPhoneVO.insertCertIp */ + INSERT + INTO LETTNGNRLMBER_CERT_PHONE + ( + MBER_ID + , MBTLNUM + , CERT_ALIAS + , CERT_MEMO + , FRST_REGIST_PNTTM + , FRST_REGISTER_ID + ) + VALUES + ( + #mberId# + , #mbtlnum# + , #certAlias# + , #certMemo# + , now() + , #frstRegisterId# + ) + + + + + + UPDATE LETTNGNRLMBER_CERT_PHONE + SET CERT_USE_YN = 'N' + , LAST_UPDUSR_ID = #lastUpdusrId# + WHERE + MBER_ID = #mberId# + AND MBTLNUM = #mbtlnum# + + + + + + + + UPDATE LETTNGNRLMBER_CERT_PHONE + SET + LAST_UPDUSR_ID = #lastUpdusrId# + , CERT_MEMO = #certMemo# + , CERT_ALIAS = #certAlias# + WHERE + MBER_ID = #mberId# + AND MBTLNUM = #mbtlnum# + + + + + + \ No newline at end of file diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgCustom_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgCustom_SQL_mysql.xml index 6cc2f075..900e017c 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgCustom_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgCustom_SQL_mysql.xml @@ -28,7 +28,7 @@ WHERE 1=1 - AND ( A.USER_ID LIKE CONCAT('%', #searchKeyword#, '%') + AND ( A.USER_ID LIKE CONCAT('%', #searchKeyword#, '%')MjonMsgCustom_SQL_mysql.xmlMjonMsgCustom_SQL_mysql.xmlMjonMsgCustom_SQL_mysql.xmlMjonMsgCustom_SQL_mysql.xml OR CUSTOM_PHONE_NO LIKE CONCAT ('%', #searchKeyword#,'%') ) diff --git a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml index 140ea866..eeb9130a 100644 --- a/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml +++ b/src/main/resources/egovframework/sqlmap/let/msg/MjonMsgData_SQL_mysql.xml @@ -21,7 +21,6 @@ - @@ -3757,110 +3756,6 @@ - - - - - - - - - - INSERT - INTO LETTNGNRLMBER_CERT_PHONE - ( - MBER_ID - , MBTLNUM - , CERT_ALIAS - , CERT_MEMO - , FRST_REGIST_PNTTM - , FRST_REGISTER_ID - ) - VALUES - ( - #mberId# - , #mbtlnum# - , #certAlias# - , #certMemo# - , now() - , #frstRegisterId# - ) - - - - - UPDATE LETTNGNRLMBER_CERT_PHONE - SET CERT_USE_YN = 'N' - , LAST_UPDUSR_ID = #lastUpdusrId# - WHERE - MBER_ID = #mberId# - AND MBTLNUM = #mbtlnum# - - - - - - - UPDATE LETTNGNRLMBER_CERT_PHONE - SET - LAST_UPDUSR_ID = #lastUpdusrId# - , CERT_MEMO = #certMemo# - , CERT_ALIAS = #certAlias# - WHERE - MBER_ID = #mberId# - AND MBTLNUM = #mbtlnum# - - - - + + + + + +
+
+ 이용약관 개정 안내 변함없는 문자온 서비스 이용에 감사의 말씀 드립니다. 당사 이용약관이 개정되오니 서비스 이용에 참고하시기 바랍니다. + + + +
+ +
+ + +
단 한 번! 인생 최저가! 저세상 파격 특가! 누구나 첫 결제시 단문 7.5원 장문 32원 그림 59원 문자온만의 파격적인 최저가 혜택 지금 바로 만나보세요 결제 바로가기 이벤트 혜택은 본 페이지에서 결제하시는 경우에만 적용됩니다. diff --git a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp index 7287f758..a909b8b0 100644 --- a/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp +++ b/src/main/webapp/WEB-INF/jsp/web/user/mberInfoIndex.jsp @@ -51,9 +51,6 @@ $(document).ready(function(){ - $('#showLoginBtn').on('click', function() { - $('.security_login').fadeIn(); // 서서히 나타나도록 설정 - }); }); @@ -64,17 +61,176 @@ $(document).ready(function(){ $('#showLoginBtn').on('click', function() { if ($('#securityLogin').is(':visible')) { - $('#securityLogin').fadeOut(); // 서서히 사라짐 - $(this).text('보안 로그인 표시'); // 버튼 텍스트 변경 + $('#securityLogin').hide(); } else { - $('#securityLogin').fadeIn(); // 서서히 나타남 - $(this).text('보안 로그인 숨기기'); // 버튼 텍스트 변경 + $('#securityLogin').show(); } }); + + // IP 추가 버튼 클릭 시 tr 추가 + $(".btn_ip_plus").click(function () { + // 추가할 HTML 구조 + const ipTr = ` + + + + - + + + + + `; + + // 이미 추가된 `.ip-row`가 있는지 확인 + if ($(".ip_table tbody .ip-new").length === 0) { + $(".ip_table tbody").prepend(ipTr); // 중복되지 않으면 추가 + } else { + alert("이미 추가된 항목이 있습니다."); + } + }); + + + // IP 등록버튼 + $(document).on('click', '#ipRegBtn', function () { + // 현재 클릭된 버튼의 부모 tr 요소 + const $currentRow = $(this).closest('tr'); + + // 입력값 가져오기 + const ipValue = $currentRow.find('td:eq(0) input').val(); // 첫 번째 열 (IP) + const memoValue = $currentRow.find('td:eq(1) input').val(); // 두 번째 열 (메모) + + // 예외 처리 + if (!ipValue) { + alert("등록할 IP를 입력해주세요."); + $currentRow.find('td:eq(0) input').focus(); + return; + } + + + const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; + + if (!ipRegex.test(ipValue)) { + alert("유효하지 않은 IP 주소입니다."); + return false; + } + + var params = { + "certIp" : ipValue + , "certMemo" : memoValue + } + + if(!confirm("IP를 등록 하시겠습니까?")){ + return false; + } + $.ajax({ + type: "POST", + url: "/cert/ip/insertCertIp.do", + data: params, + dataType:'json', + async: false, + success: function (returnData) { + if(returnData.status == 'OK'){ + findAllCertIp(); + }else if(returnData.status == 'CONFLICT'){ + alert(returnData.message); + return false; + } + else + { + alert("오류가 발생하였습니다."); + } + }, + error: function (e) { alert("오류가 발생하였습니다."); console.log("ERROR : ", e); } + }); + }); + + + findAllCertIp(); }); + +function findAllCertIp(){ + + $.ajax({ + type: "POST", + url: "/cert/ip/selectMberCertIpList.do", + data: null, + dataType:'json', + async: false, + success: function (returnData) { + if (returnData.status === "OK") { + const objects = returnData.object; // 배열 데이터 + + // tbody의 기존 내용 삭제 + const $tbody = $(".ip_table tbody"); + $tbody.empty(); + + // 배열 데이터를 기반으로 tr 생성 후 tbody에 추가 + $.each(objects, function(index, obj) { + const $tr = $(""); // tr 요소 생성 + + // 각 td 요소 생성 + const $certIp = $("").text(obj.certIp || ""); + const $certMemo = $("").text(obj.certMemo || ""); + const $frstRegistPnttm = $("").text(obj.frstRegistPnttm || "등록되지 않음"); + const $deleteBtn = $("") + .addClass("btnType btn_text btn_lightgray fill btn_28") + .text("삭제") + .attr("type", "button") + .attr("id", "ipDelBtn") + .on("click", function() { + deleteRow(obj.certIp); // 삭제 버튼 클릭 시 실행 + }); + + // 관리 버튼을 감쌀 td 생성 + const $deleteTd = $("").append($deleteBtn); + + // tr에 td 추가 + $tr.append($certIp, $certMemo, $frstRegistPnttm, $deleteTd); + + // tbody에 tr 추가 + $tbody.append($tr); + }); + } else { + alert("데이터를 불러오는 데 실패했습니다."); + } + }, + error: function (e) { alert("오류가 발생하였습니다."); console.log("ERROR : ", e); } + }); +} + +// IP 삭제 +function deleteRow(p_ip){ + + var params = { + "certIp" : p_ip + } + if(!confirm("IP를 삭제 하시겠습니까?")){ + return false; + } + $.ajax({ + type: "POST", + url: "/cert/ip/deleteCertIp.do", + data: params, + dataType:'json', + async: false, + success: function (returnData) { + if(returnData.status == 'OK'){ + findAllCertIp(); + } + else + { + alert("오류가 발생하였습니다."); + } + }, + error: function (e) { alert("오류가 발생하였습니다."); console.log("ERROR : ", e); } + }); +} + + //기간 요일 지정 function setCalVal(val,targetObj){ $('input[name='+targetObj+']').val(val) ; @@ -280,8 +436,47 @@ function getMberGrdChk() { }); } +//휴대푠 번호 등록 [시작]-------------------------------------------------------------------------------------------- +window.name = "kmcis_web_sample"; +var KMCIS_window; +//휴대폰 인증팝업 열기 +function openKMCISWindow(){ + var UserAgent = navigator.userAgent; + /* 모바일 접근 체크*/ + // 모바일일 경우 (변동사항 있을경우 추가 필요) + if (UserAgent.match(/iPhone|iPod|Android|Windows CE|BlackBerry|Symbian|Windows Phone|webOS|Opera Mini|Opera Mobi|POLARIS|IEMobile|lgtelecom|nokia|SonyEricsson/i) != null || UserAgent.match(/LG|SAMSUNG|Samsung/) != null) { + document.reqKMCISForm.target = 'KMCISWindow'; // 모바일 + } else { // 모바일이 아닐 경우 + KMCIS_window = window.open('', 'KMCISWindow', 'width=425, height=550, resizable=0, scrollbars=no, status=0, titlebar=0, toolbar=0, left=435, top=250' ); + + if(KMCIS_window == null){ + alert(" ※ 윈도우 XP SP2 또는 인터넷 익스플로러 7 사용자일 경우에는 \n 화면 상단에 있는 팝업 차단 알림줄을 클릭하여 팝업을 허용해 주시기 바랍니다. \n\n※ MSN,야후,구글 팝업 차단 툴바가 설치된 경우 팝업허용을 해주시기 바랍니다."); + } + + document.reqKMCISForm.target = 'KMCISWindow'; + } + + document.reqKMCISForm.action = 'https://www.kmcert.com/kmcis/web/kmcisReq.jsp'; + document.reqKMCISForm.submit(); +} + +// /web/user/selectSecurityAuthn.do 리다이렉트 URL + +//자식창에서 호출 +function callTo() { + alert("호출입니다."); +} + +//휴대푠 번호 등록 [끝]-------------------------------------------------------------------------------------------- + +
+ + + +
+
@@ -511,8 +706,8 @@ function getMberGrdChk() { - - - +
@@ -565,16 +760,7 @@ function getMberGrdChk() { - - - - - - - - 192.168.0.0 - dadfadfjadkfjalkdjfajflajdlfjaldjflajd - 2024-11-11 11:11 - + 등록된 IP 주소가 없습니다. diff --git a/src/main/webapp/WEB-INF/jsp/web/user/securityAuthnPage.jsp b/src/main/webapp/WEB-INF/jsp/web/user/securityAuthnPage.jsp new file mode 100644 index 00000000..ccc2e722 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/web/user/securityAuthnPage.jsp @@ -0,0 +1,29 @@ +<%@ page contentType="text/html; charset=utf-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> +<% + //************************************************************************ + // // + // 본 샘플소스는 개발 및 테스트를 위한 목적으로 만들어졌으며, // + // // + // 실제 서비스에 그대로 사용하는 것을 금합니다. // + // // + //************************************************************************ +%> + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/download/msg/K003_불법스팸_방지_안내서_제6차_개정판(수정_2024년).pdf b/src/main/webapp/download/msg/K003_불법스팸_방지_안내서_제6차_개정판(수정_2024년).pdf new file mode 100644 index 00000000..d9b12e06 Binary files /dev/null and b/src/main/webapp/download/msg/K003_불법스팸_방지_안내서_제6차_개정판(수정_2024년).pdf differ diff --git a/src/main/webapp/publish/css/content.css b/src/main/webapp/publish/css/content.css index df423b8e..77a9b6b3 100644 --- a/src/main/webapp/publish/css/content.css +++ b/src/main/webapp/publish/css/content.css @@ -2233,6 +2233,58 @@ button.check_validity:hover {border: 1px solid #a3a3a3;box-shadow: 0px 0px 5px .clause_new ol.conlist8 li {font-weight: 300; position: relative; padding:0px 7px 2px 0; line-height: 1.4; font-size:16px; } .clause_new ol.conlist8 li::before {content:"";} +/* 불법스팸방지정책_2024*/ +.spam_content .title .red{margin: 0 0 0 3px; font-size: 16px; color: #e40000; font-weight: 500; } +.spam_content .spam_conbox .blue{color: #002c9a; font-weight: 400;} +.spam_content .spam_conbox .bold{font-weight: 500;} +.spam_content .spam_conbox .text{margin: 0 0 0 -8px;} +.spam_content .spam_conbox .tri_te span{font-size: 14px;} +.spam_content .spam_conbox .le{margin: 0 0 0 -8px;} +/*.spam_content .spam_conbox.spam_table{padding: 0;}*/ + +/*4번 수정후*/ +.spam_content .spam_conbox .spam_clause .tit{width: 200px; padding: 6px 0 7px 0; margin: 0 0 10px 9px; background-color: #002c9a; color: #ffffff; text-align: center; font-size: 15px; font-weight: 500; border-radius: 100px;} +.spam_content .spam_conbox .spam_clause{padding: 22px 16px; margin: 20px 0 0 0; border: 1px solid #d5d5d5; border-radius: 5px;} +.spam_content .spam_conbox .spam_clause .spam_clause_cen{margin: 12px 0;} +.spam_content .spam_conbox .spam_clause ul li{padding: 0 7px 0 18px; font-size: 15px; line-height: 1.4;} +.spam_content .spam_conbox .spam_clause ul li::before{content: none;} +.spam_content .spam_conbox .spam_clause ul .str strong{margin: 0 0 0 -15px; display: inline;} +.spam_content .spam_conbox .spam_clause ul .str strong::before{content: "제";} +.spam_content .spam_conbox .spam_clause .spam_clause_gray{margin: 7PX 0 7px 0; padding: 18px 23px 15px 23px; border-radius: 5px; background-color: #f5f5f5;} +.spam_content .spam_conbox .spam_clause ul li strong{font-size: 14px;} +.spam_content .spam_conbox .spam_clause .spam_clause_gray li{font-size: 14px; color: #666666;} +.spam_content .spam_conbox .spam_clause .conlist8{padding: 0; margin: 0 0 0 -7px;} + +.spam_content .spam_conbox .tType1{margin: 15px 0 0 0;} +.spam_content .spam_conbox .tType1 tbody tr{border-bottom: 1px solid #d5d5d5;} +.spam_content .spam_conbox .tType1 tbody tr th{padding: 0 0 0 22px; font-weight: 500; background-color: #e8f0ff;} +.spam_content .spam_conbox .tType1 tbody tr td{padding: 16px 10px 16px 30px; line-height: 1.5;} +.spam_content .spam_conbox .tType1 tbody tr td .conlist7{letter-spacing: -0.25px;} +.spam_content .spam_conbox .tType1 tbody tr td li{font-size: 16px;} +.spam_content .spam_conbox .tType1 tbody tr td li strong{display: inline; margin: 0 7px 0 -16px; font-size: 17px;} +.spam_content .spam_conbox .tType1 tbody tr td li .conlist8{padding: 0 0 0 10px;} +.spam_content .spam_conbox .spam_title{margin: 9px 0 -5px 0; font-weight: 500;} +.spam_content .spam_conbox .spam_list.spam_list_tw{margin: 21px 0 0 5px;} +.spam_content .spam_conbox ul.spam_list{margin: 15px 0 0 7px;} +.spam_content .spam_conbox .spam_list li{margin: 0 0 0 18px;} +.spam_content .spam_conbox .spam_list .center{margin: 13px 0 5px 18px;} +.spam_content .spam_conbox .spam_list .last{margin: 17px 0 0 18px;} +.spam_content .spam_conbox .spam_gray{margin: 12px 25px 0 0; padding: 20px 12px; border-radius: 5px; background-color: #f5f5f5;} +.spam_content .spam_conbox ul.spam_gray li{font-size: 15px;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray li::marker{content: "·";} +.spam_content .spam_conbox ul.conlist2 li .spam_gray .mark::marker{content: none;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray .mark{ margin: 0 0 6px 35px; text-indent: -18px; color: #666666;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray li .bold{font-weight: 500;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray_tw li::marker{content: none;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray_tw li .sub_tit{font-size: 16px; font-weight: 500;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray_tw li .sub_te li::marker{content: "·";} +.spam_content .spam_conbox ul.conlist2 li .spam_gray_tw li .sub_te{margin: 7px 0 -4px -14px;} +.spam_content .spam_conbox ul.conlist2 li .spam_gray_tw li .sub_te_on{margin: 7px 0 8px -14px;} + +.spam_content .spam_conbox .spam_table thead tr th{font-weight: 400;} +.spam_content .spam_conbox .spam_table tbody tr th{font-weight: 300;} +.spam_content .spam_conbox .spam_table tbody tr td{text-align: left;} +.spam_content .spam_conbox .spam_table tbody tr td li .conlist8{padding: 0 0 0 18px;} @keyframes rotate-loading { 0% {transform:rotate(0)} diff --git a/src/main/webapp/publish/css/popupLayer.css b/src/main/webapp/publish/css/popupLayer.css index 3fa3cc1f..d99c22d8 100644 --- a/src/main/webapp/publish/css/popupLayer.css +++ b/src/main/webapp/publish/css/popupLayer.css @@ -58,6 +58,7 @@ .layer_popup_wrap02 .layer_popup:first-child{margin-left: 0;} .layer_popup_wrap02 .layer_popup:last-child{margin-right: 0;} .layer_popup_wrap02 .popup_inner{position: relative; display: flex; width: 100%; height: 100%; vertical-align: middle; justify-content: center; align-items: center;} +.layer_popup_wrap .popup_range {display:flex; flex-direction:column;} /* layer_tType1 */ .popTable_wrap {border: 1px solid #ccc; border-radius: 5px;} diff --git a/src/main/webapp/publish/guide_2022.html b/src/main/webapp/publish/guide_2022.html index 23422bba..8ccf4e16 100644 --- a/src/main/webapp/publish/guide_2022.html +++ b/src/main/webapp/publish/guide_2022.html @@ -18,6 +18,7 @@
    +
  • service3_spam_2024.html불법스팸방지정책 (2024.11.29)
  • service1_2024.html이용약관 (2024.11.29)
  • service1_2023.html이용약관 (2023.04.26~2024.11.28)
  • service1_2022.html이용약관 (2022.08.01~2023.04.25)
  • diff --git a/src/main/webapp/publish/images/main/popup04_241119.jpg b/src/main/webapp/publish/images/main/popup04_241119.jpg new file mode 100644 index 00000000..2cfdcc77 Binary files /dev/null and b/src/main/webapp/publish/images/main/popup04_241119.jpg differ diff --git a/src/main/webapp/publish/images/main/popup06_241119.jpg b/src/main/webapp/publish/images/main/popup06_241119.jpg new file mode 100644 index 00000000..8f28e142 Binary files /dev/null and b/src/main/webapp/publish/images/main/popup06_241119.jpg differ diff --git a/src/main/webapp/publish/service3_spam_2024.html b/src/main/webapp/publish/service3_spam_2024.html new file mode 100644 index 00000000..5d09e217 --- /dev/null +++ b/src/main/webapp/publish/service3_spam_2024.html @@ -0,0 +1,892 @@ + + + + + + + 문자온 + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +

    QUICK
    MENU

    +

    QUICK

    + + +
    +
    + + + + + + +
    +
    + +
    + +
      +
    • +
    • +
    • +
    • +
    • +
    + + +
    +
    +

    이용안내

    +
    +
    + +
      +
    • +
    • +
    • +
    + +
    + + +
    + +
    + 주식회사 아이티앤(이하 "회사”라 한다)은 편리한 서비스 이용과 스팸, 불법스팸으로 인한 폐해를 방지하기 위해 스팸방지정책을 수립하여 운영하고 있습니다. 회사가 제공하는 인터넷 + 서비스 문자온(www.munjaon.co.kr, 이하 “서비스”)을 이용함에 있어, 아래와 같이 불법스팸(문자, 팩스, 음성, 메일)을 발송한 이용자에 대해서는 이용정지 및 해지, 형사고발 등의 + 조치를 취하겠습니다. +
    + +
    +

    1. 용어의 정의

    +
    +

    이 불법스팸방지정책에서 사용하는 용어의 정의는 다음과 같습니다.

    +
      +
    • 스팸 : 정보통신망을 통해 수신자의 명시적인 사전 동의없이 일방적으로 전송되는 영리목적의 광고성 정보
    • +
    • 불법스팸 :「정보통신망 이용촉진 및 정보보호 등에 관한 법률(이하 “정보통신망법”이라 한다)」 제50조부터 제50조의8을 위반하여 전송 또는 게시되는 영리목적의 광고성 정보
    • +
    • 영리목적의 광고성 정보 : 전송자가 널리 경제적 이득을 취할 목적으로 전송하는 전송자 등에 관한 정보 및 전송자 등이 제공할 재화나 서비스에 관한 정보
    • +
    • 전자적 전송매체 : 정보통신망을 통하여 부호ㆍ문자ㆍ음성ㆍ화상 또는 영상 등을 수신자에게 전자문서 등의 전자적 형태로 전송하는 매체
    • +
    • 수신동의(Opt-in) : 사전에 수신을 동의한 고객에게만 광고성 정보를 전송할 수 있는 방식
    • +
    +
    +
    +
    +

    2. 이용자의 의무

    +
    +

    영리목적의 광고성 정보를 전송하려는 경우, 불법스팸 방지를 위한 이용자의 의무는 다음과 같습니다.

    +
      +
    • 이용자는 영리목적의 광고성 정보 전송 시 「정보통신망법」의 의무사항 및 회사의 이용약관을 준수하여야 합니다.
    • +
    • 이용자는 「전기통신사업법」제84조의2(전화번호의 거짓표시 금지 및 이용자 보호)에 따라 발신번호 사전등록 후 등록된 번호로만 문자 메시지를 발송하여야 합니다.
    • +
    • 이용자는 스팸메시지, 문자피싱메시지 발송 등 불법행위를 하거나 「전기통신사업법」 등 관련법령을 준수하지 않아 발생하는 모든 민ㆍ형사상의 책임을 부담합니다.
    • +
    +
    +
    +
    +

    3. 발송 시 유의사항

    +
    +

    「정보통신망법」제50조에 의한 영리목적의 광고성 문자, 팩스, 음성, 메일 발송 시 유의사항에 대해 안내 드립니다.

    +
      +
    • 반드시 수신자의 명시적인 사전 동의를 얻어야 합니다.
    • +
    • 수신자의 사전 동의를 얻었다 하더라도 수신자가 수신거부의사를 표시하거나 사전 동의를 철회한 경우에는 전송할 수 없습니다.
    • +
    • 수신자의 사전 동의를 얻었다 하더라도 오후 9시부터 다음 날 오전 8시 사이에 광고성 문자를 보낼 경우 별도로 사전 동의를 얻어야 합니다.
    • +
    • 전자적 전송매체의 내용에 전송자의 명칭 및 연락처, 수신 거부(또는 수신동의의 철회) 조치 및 방법에 관한 사항을 표시하여야 합니다.
    • +
    • 수신자의 수신 거부 시 기술적으로 수신거부를 회피ㆍ방해하는 등 법령에서 금지하는 행위를 해서는 안됩니다.
    • +
    • 수신자가 수신거부(또는 수신동의 철회)를 할 때 발생하는 전화요금 등 금전적 비용을 부담하지 않도록 수신거부(또는 수신동의 철회)용 무료전화서비스 등을 제공하고 그 내용을 명시해야 합니다.
    • +
    +
    +
    + +
    +

    4. 스팸방지 관련 약관 공지

    +
    +

    가입하신 이용자는 모두 아래 약관에 동의한 것입니다.

    +
    +

    약관 중 불법스팸 관련 사항

    +
      +
    • 15조(서비스 이용의 제한 또는 정지)① 회사는 이용자가 이 약관의 의무를 위반하거나 서비스의 정상적인 운영을 방해한 경우 서비스 이용을 제한하거나 정지할 수 있습니다.
    • +
    • ② 제1항에도 불구하고 「주민등록법」을 위반한 명의도용 및 결제도용, 「저작권법」을 위반한 불법프로그램의 제공 및 운영방해, 「정보통신망법」을 위반한 불법스팸 발송 및 불법통신, 해킹, 악성프로그램의 배포, 접속권한 초과행위 등과 같이 관련 법을 위반한 경우에는 즉시 영구 이용정지 할 수 있습니다.
    • +
    • ③ 제2항에 따른 영구 이용정지 시 서비스 내의 금액, 포인트, 혜택 및 권리 등은 모두 소멸되며 회사는 이에 대해 별도로 보상하지 않습니다.
    • +
    • + ④ 회사는 이용자가 다음 각 호의 어느 하나에 해당하는 경우, 30일간 당해 서비스의 이용을 즉시 정지(전부 또는 일부) 할 수 있으며, 이용정지 등의 원인이 된 사유가 완전히 해소되기 전까지는 이용정지 등의 조치를 해제하지 아니할 수 있습니다. +
        +
      1. 1. 방송통신위원회ㆍ한국인터넷진흥원ㆍ과학기술정보통신부ㆍ전송사 등(이하 “관계기관”이라 한다)이 불법스팸 등 불법행위의 전송사실을 확인하여 이용정지를 요청하는 경우
      2. +
      3. 3. 이용자가 전송하는 광고의 수신자가 불법스팸으로 신고하는 경우
      4. +
      5. 4. 이용자에게 제공하는 서비스가 불법스팸 전송에 이용되고 있는 경우
      6. +
      7. 5. 전송한 광고성 정보가 불법스팸임이 확인된 경우
      8. +
      9. 6. 불법스팸 전송으로 과태료가 부과된 경우
      10. +
      11. 7. 회사에게 증빙서류 등을 통해 불법스팸 전송이 아님을 확인하여 주지 않고 1일 500건을 초과하는 메시지를 전송하는 경우
      12. +
      13. 8. 이용자가 발신번호를 변작하는 등 거짓으로 표시한 경우
      14. +
      15. 9. 관계기관이 발신번호 변작 등을 확인하여 이용 정지를 요청하는 경우
      16. +
      +
    • +
    • ⑤ 회사는 불법스팸을 전송하였다고 확인된 이용자가 이용 중인 다른 번호가 불법스팸에 악용되고 있거나, 악용될 우려가 있다는 객관적 정황이 있는 경우에는 그 다른 번호도 이용 정지할 수 있습니다.
    • +
    +
      +
    • 16조(발송량의 제한)① 회사는「정보통신망법」에서 금지하는 대량의 불법스팸 전송을 방지하기 위하여 이용자의 아이디당 1일 500건을 초과하는 문자 메시지 발송을 제한할 수 있습니다. 단, 이용자가 제출하는 증빙서류 등을 통해 불법스팸 전송이 아님을 확인할 수 있는 경우 초과 전송이 가능하도록 예외를 인정할 수 있습니다.
    • +
    • ② 제1항 단서에 따라 이용자가 제출한 증빙서류 등을 통해 불법스팸 전송이 아님을 확인하였음에도, 이용자의 메시지 발송량이 과다할 경우 회사는 발송을 제한할 수 있습니다.
    • +
    +
      +
    • 17조(계약의 해지)① 회사는 이용자가 다음 각 호의 어느 하나에 해당하는 경우, 이용자의 동의 없이 이용계약을 해지할 수 있습니다.
    • +
    • + ② 회사는 이용자가 다음 각 호의 어느 하나에 해당하는 경우, 이용자의 동의 없이 이용계약을 해지할 수 있습니다. +
        +
      1. 1. 이용자가 약관을 위반하고 일정 기간 이내에 위반 내용을 해소하지 않는 경우
      2. +
      3. 3. 관계기관이 불법스팸 등 불법행위의 전송사실을 확인하여 계약해지를 요청하는 경우
      4. +
      5. + 4. 약관 제11조에 따른 이용자의 의무를 위반한 경우 + +
          +
        • + 11조(이용자의 의무)① 이용자는 다음 각 호의 어느 하나에 해당하는 행위를 하여서는 안됩니다. +
            +
          1. 11. 불법스팸, 불법정보, 발신번호 조작 등으로 인지되는 메시지를 발송하는 행위
          2. +
          +
        • +
        • ② 이용자는 영리목적의 광고성 정보 전송 시 「정보통신망법」에 따라 수신자의 명시적인 사전 동의를 얻고 광고표기 의무 등을 준수하여야 하며, 회사를 통해 전달되는 수신거부 요청에 대해서는 즉각적으로 처리하고 24시간 이내에 처리결과를 회사에 회신해야 합니다.
        • +
        • ③ 이용자는 「전기통신사업법」 제84조의2(전화번호의 거짓표시 금지 및 이용자 보호)에 의거 발신번호를 사전에 등록하고 등록된 번호로만 문자를 발송하여야 합니다. 단, 「전기통신사업법」 등의 관련 법률에서 예외로 허용한 경우는 제외하며, 만약 정당하지 않은 방법으로 전화번호를 변경하여 발신하는 경우 관련 법규에 따라 처벌받을 수 있습니다.
        • +
        • ④ 이용자는 알림톡 또는 친구톡 서비스를 이용 시, 수신자가 발신자를 정확하게 식별할 수 있는 발신프로필을 사용하여야 하며 해당사항에 틀림이 없는지 지속적으로 확인해야 합니다.
        • +
        +
      6. +
      7. 5. 약관 제15조제4항에 따른 이용정지를 당한 이후 1년 이내에 이용정지 사유가 재발한 경우
      8. +
      9. 6. 약관 제15조제4항에 따른 이용정지 기간 내에 이용 정지 사유를 해소하지 않고, 이용 정지일로부터 12개월이 경과한 경우
      10. +
      11. 9. 불특정 다수를 대상으로 무차별적으로 불법스팸을 전송한 사실이 확인된 경우
      12. +
      13. 10. 이용자가 전송한 광고성 정보에 대해 회사가 한국인터넷진흥원에 불법스팸 유무확인을 요청하여 불법스팸임이 확인된 경우
      14. +
      15. 11. 수신처를 자동으로 생성하여 불특정 다수에게 광고성 메시지를 전송한 경우
      16. +
      17. 12. 전송자를 확인하지 못하게 할 목적으로 발신번호를 변작하여 영리목적의 광고성 정보를 전송한 사실이 확인된 경우
      18. +
      +
    • +
    • ② 회사는 불법스팸을 전송하였다고 확인된 이용자가 이용 중인 다른 번호가 불법스팸에 악용되고 있거나 악용될 우려가 있다는 객관적 정황이 있는 경우에는 그 다른 번호에 대한 서비스도 해지할 수 있습니다.
    • +
    +
    +
    +
    + +
    +

    5. 명시적인 사전 동의(위반시 3천만원 이하 과태료)

    +
    + + + + + + + + + + + + + + + + +
    정보통신망법, 시행령에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)① 누구든지 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하려면 그 수신자의 명시적인 사전 동의를 받아야 한다. 다만, 다음 각 호의 어느 하나에 해당하는 경우에는 사전 동의를 받지 아니한다. +
        +
      1. 1. 재화 등의 거래관계를 통하여 수신자로부터 직접 연락처를 수집한 자가 대통령령으로 정한 기간 이내에 자신이 처리하고 수신자와 거래한 것과 동종의 재화 등에 대한 영리목적의 광고성 정보를 전송하려는 경우
      2. +
      3. 2. 「방문판매 등에 관한 법률」에 따른 전화권유판매자가 육성으로 수신자에게 개인정보의 수집출처를 고지하고 전화권유를 하는 경우
      4. +
      +
    • +
    +
    시행령 +
      +
    • 제61조(영리목적의 광고성 정보 전송기준)① 법 제50조제1항제1호에서 “대통령령으로 정한 기간”이란 해당 재화등의 거래가 종료된 날부터 6개월을 말한다.
    • +
    +
    +

    [영리목적의 광고성 정보]

    +
      +
    • + 영리목적으로 사업을 하는 자가 고객에게 보내는 정보는 원칙적으로 모두 광고성 정보에 해당합니다. +
        +
      • 영업사원이 고객관리 차원에서 보내는 안부인사, 사업자가 고객에게 보내는 무료 뉴스레터 및 일방적으로 제공(회원가입 기념 쿠폰, 생일 기념 쿠폰, 1주년 기념 쿠폰 등)한 쿠폰 및 마일리지 등(이에 대한 소멸안내 포함)도 원칙적으로 영리목적 광고성 정보에 해당 합니다.
      • +
      +
    • +
    • 전송자의 이미지 홍보에 해당하는 경우에도 광고성 정보로 볼 수 있으며, 주된 정보가 광고성 정보가 아니라고 하더라도 부수적으로 광고성 정보가 포함되어 있으면 해당 정보 전체가 광고성 정보에 해당합니다.
    • +
    • + 단, 다음의 경우에는 광고성 정보의 예외로 봅니다. +
        +
      • 전송자와 수신자간 체결된 계약이행 등과 관련한 정보
      • +
      • ※ 수신자가 금전적 대가를 지불하고 제공받는 정보(유료 뉴스레터, 주식정보, 축산물 거래정보 등)와 같이 전송자가 계약상 의무이행을 위해 전송하는 정보, 수신자가 신청한 경품 및 사은품 지급을 위한 정보 등을 말합니다.
      • +
      • 공익목적을 위한 광고성 정보
      • +
      +
    • +
    +

    [명시적인 사전 동의]

    +
      +
    • 향후 전송될 광고의 내용 및 전송매체(방법)에 대해 정확히 고지하고 이에 대한 수신자의 동의를 받아야 합니다.
    • +
    • 「개인정보의 수집ㆍ이용 및 이용목적에 대한 동의」와 「광고성 정보 수신 동의」는 구분되므로 각 동의를 별개로 받아야 합니다.
    • +
    • 하나의 사업자가 여러 종류의 서비스를 제공할 경우, 해당 사업자가 전송하는 모든 광고수신에 대해 포괄적으로 동의 받는 것은 안 되며, 유형별 서비스를 모두 고지하고 개별적 동의를 받아야 합니다.
    • +
    • 수신동의를 얻기 위한 목적으로 문자, 이메일, 팩스 등을 전송하거나 전화를 거는 행위는 수신동의 없이 광고성 정보를 전송하는 것으로 법 위반에 해당할 수 있습니다.
    • +
    • 스팸신고가 접수되거나 수신동의 여부에 대한 분쟁이 발생하는 경우 이에 대한 입증책임은 광고성 정보 전송자에게 있습니다.
    • +
    +
    +
    +
    +

    6. 거래관계를 통한 사전 동의 의무 예외

    +
    +
      +
    • + 기존 거래관계가 있었거나 현재 거래관계가 지속중인 이용자에게는 그 거래관계에서 취급했던 재화 및 서비스에 대한 광고에 한해 별도의 동의 절차 없이 보낼 수 있습니다. +
        +
      • 거래관계란, 재화(財貨) 또는 용역(service)을 대상으로 하여 이루어지는 매매행위를 의미하는 것으로, 단순한 문의나 회원가입 등은 거래관계가 존재한다고 볼 수 없습니다.
      • +
      • 사업자가 사업자(B2B)와의 거래관계 형성을 위해 명함 등 서면으로 직접 연락처를 제공한 경우, 사전동의 예외로서의 거래관계가 있다고 볼 수 있습니다. 단, 언제 어디서 명함 등을 직접 제공받았는지를 증명할 수 있어야 합니다.
      • +
      • 기존 거래관계나 사전 수신동의를 얻은 업체가 동일업체 명으로 재화나 서비스 제공 형태(콘텐츠는 동종)를 변경하였더라도 이전에 획득한 이용자 정보로 새로운 재화나 서비스를 광고할 수 없습니다.
      • +
      +
    • +
    +
    +
    +
    +

    7. 수신거부 및 사전동의 철회(위반시 3천만원 이하 과태료)

    +
    + + + + + + + + + + + + +
    정보통신망법에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)② 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하려는 자는 제1항에도 불구하고 수신자가 수신거부의사를 표시하거나 사전 동의를 철회한 경우에는 영리목적의 광고성 정보를 전송하여서는 아니 된다.
    • +
    +
    +
      +
    • + 수신자가 특별히 범위를 정하여 수신동의 철회 및 수신거부 의사표시를 한 것이 아니라면, 그 효력은 당해 광고만이 아니라 당해 전송자가 보내는 모든 광고에 적용됩니다. +
        +
      • 다만, 각 재화나 서비스 분야로 동의를 받은 경우 수신거부시 그 해당분야에 한합니다.
      • +
      • 성인전화나 대리운전 광고 등의 경우 수신자가 수신거부를 하면 전송자가 전송하는 해당 서비스 분야 모두가 수신거부 대상이 됩니다.
      • +
      +
    • +
    • 본사와 지사, 본사와 대리점에서 고객 정보를 공유할 경우 수신거부의사도 공유하는 것으로 봅니다. 즉, 한 번의 수신거부로 해당 본사 및 지사, 대리점에서 전송하는 광고에 대한 수신 거부 효력이 발생합니다.
    • +
    +
    +
    +
    +

    8. 야간광고 전송제한 및 예외(위반시 3천만원 이하 과태료)

    +
    + + + + + + + + + + + + + + + + +
    정보통신망법, 시행령에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)오후 9시부터 그 다음 날 오전 8시까지의 시간에 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하려는 자는 제1항에도 불구하고 그 수신자로부터 별도의 사전 동의를 받아야 한다. 다만, 대통령령으로 정하는 매체의 경우에는 그러하지 아니하다.
    • +
    +
    시행령 +
      +
    • 제61조(영리목적의 광고성 정보 전송기준)② 법 제50조제3항 단서에서 “대통령령으로 정하는 매체”란 전자우편을 말한다.
    • +
    +
    +
      +
    • 광고성 정보 전송에 대하여 수신동의를 받았거나 거래관계에 의한 수신동의 예외가 인정되더라도 오후 9시부터 그 다음 날 오전 8시까지(이하 “야간시간”이라 한다) 광고성 정보를 전송하려면 별도의 수신동의를 받아야 합니다.
    • +
    • 야간시간에 광고성 정보 전송금지 기준은 수신자에게 도달하는 시각을 기준으로 합니다.(국외에서 전송되는 광고성 정보도 동일함)
    • +
    • 전자우편은 다른 매체에 비해 광고 수신확인의 즉시성이 떨어져 이용자의 통제가 비교적 용이하므로 “오후 9시부터 그 다음 날 오전 8시까지” 수신자의 별도 동의가 없더라도 전송이 가능합니다.
    • +
    +
    +
    +
    +

    9. 광고성 정보 전송 시 명시사항(위반시 3천만원 이하 과태료)

    +
    + + + + + + + + + + + + + + + + +
    정보통신망법, 시행령에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)④ 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하는 자는 대통령령으로 정하는 바에 따라 다음 각 호의 사항 등을 광고성 정보에 구체적으로 밝혀야 한다. +
        +
      1. 1. 전송자의 명칭 및 연락처
      2. +
      3. 2. 수신의 거부 또는 수신동의의 철회 의사표시를 쉽게 할 수 있는 조치 및 방법에 관한 사항
      4. +
      +
    • +
    +
    시행령 +
      +
    • 제61조(영리목적의 광고성 정보 전송기준)③ 법 제50조제4항에 따라 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하는 자가 해당 정보에 명시하여야 할 사항과 그 방법은 별표 6과 같다.
    • +
    +
    +

    [전송자의 명칭 및 연락처]

    +
      +
    • + 전송자의 명칭 +
        +
      • 전송자의 명칭은 수신자가 재화나 서비스를 이용하였거나 수신동의를 하였다고 식별할 수 있는 정도의 구체적인 표현을 사용해야 합니다.
      • +
      • ※ 수신자가 용이하게 식별할 수 있는 명칭으로 업체명(00네 마트, 00안경원 등)ㆍ서비스명(00대리운전, 00퀵 등) 등을 사용할 수 있습니다.
      • +
      • 전송자가 표기한 명칭만으로 수신자가 전송자를 식별할 수 없는 경우에는 전송자의 명칭을 표기한 것이라 볼 수 없습니다.
      • +
      +
    • +
    • + 전송자의 연락처 +
        +
      • 연락처는 전자우편주소, 전화번호, 주소 등 광고성 정보를 전송한 자와 직접적으로 연락이 될 수 있는 것이어야 합니다.
      • +
      • 직접적으로 연락이 되지 않거나 다른 연락처를 재안내하거나, 또는 허위 연락처인 경우에는 연락처를 명시하지 않은 것으로 봅니다.
      • +
      +
    • +
    +

    [수신의 거부 또는 수신동의의 철회 의사표시를 쉽게 할 수 있는 조치 및 방법에 관한 사항]

    +
      +
    • 광고성 정보의 본문에 표기하여 구체적으로 밝혀야 합니다.
    • +
    • + 동 조치 및 방법으로 수신의 거부 또는 수신동의 철회가 쉽게 이루어지지 않거나 불가능할 경우에는 이를 밝히지 않은 것으로 봅니다. +
        +
      • 전자우편 수신거부시 웹사이트에 로그인하도록 하는 등 수신거부 및 수신동의 철회를 어렵게 하는 것은 법률을 위반하는 행위입니다.
      • +
      +
    • +
    • + 전자적 전송매체(전자우편 제외)를 통해 광고성 정보 전송시 수신거부 및 수신동의 철회를 할 때 수신자에게 금전적 비용 부담이 발생하지 않는다는 내용을 “명시”하여야 합니다. +
        +
      • 문자광고 전송시 “무료”와 같이 비용이 발생하지 않음을 안내하는 문구가 포함되어 있어야 합니다.
      • +
      +
    • +
    + + +

    전송매체별 명시사항 및 명시방법

    +
      +
    • (광고)를 표시하는 경우에는 수신자의 수신의 거부 또는 수신동의의 철회를 회피하기 위한 목적으로 빈칸ᆞ부호ᆞ문자 등을 삽입하거나 표시방법을 조작하는 조치를 해서는 안됩니다.
    • +
    • 수신자가 수신의 거부 또는 수신동의의 철회를 하는 때에 전송에 이용된 수신자의 연락처 외의 개인정보를 전송자에게 제공하도록 요구하는 내용을 명시하여 수신의 거부 또는 수신동의의 철회를 어렵게 하여서는 아니 됩니다.
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    전자우편, 팩스, 그 밖의 전자적 전송매체 대한 표
    매체구분명시사항 및 명시방법
    전자우편 +
      +
    • 1. 제목이 시작되는 부분에 (광고)를 표시해야 한다.
    • +
    • 2. 본문에는 다음 사항을 표시해야 한다. +
        +
      1. 가. 전송자의 명칭ㆍ전자우편주소ㆍ전화번호 및 주소
      2. +
      3. 나. 수신자가 수신의 거부 또는 수신동의의 철회 의사를 쉽게 표시할 수 있도록 하기 위한 안내문을 명시하고 수신의 거부 또는 수신동의의 철회 여부를 간편하게 선택할 수 있도록 기술적 조치를 해야 한다. 이 경우 그 안내문과 기술적 조치는 한글과 영문으로 명시해야 한다.
      4. +
      +
    • +
    +
    팩스 +
      +
    • 1. 광고성 정보가 시작되는 부분에 (광고), 전송자의 명칭, 전화번호 및 주소를 표시해야 한다.
    • +
    • 2. 수신의 거부 또는 수신동의의 철회용 자동응답전화번호 등의 전화번호 또는 전화를 갈음하여 쉽게 수신의 거부 또는 수신동의의 철회를 할 수 있는 방식을 해당 광고에 표시된 최대 글자의 3분의 1 이상의 크기로 명시하고, 그 전화번호나 방식을 이용하여 수신의 거부 또는 수신동의의 철회를 하는 때에 수신자가 비용을 부담하지 않는다는 것을 함께 명시해야 한다.
    • +
    +
    그 밖의 전자적 전송매체 +
      +
    • 1. 음성형태로 전송되는 광고의 경우 +
        +
      1. 가. 광고성 정보가 시작되는 부분에 광고를 의미하는 음성, 전송자의 명칭, 전화번호 또는 주소, 수신의 거부 또는 수신동의의 철회를 할 수 있는 방식을 안내해야 한다.
      2. +
      3. 나. 수신의 거부 또는 수신동의의 철회용 자동응답전화번호 등의 전화번호 또는 전화를 갈음하여 쉽게 수신의 거부 또는 수신동의의 철회를 할 수 있는 방식을 이용하여 수신의 거부 또는 수신동의의 철회를 하는 때에 수신자가 비용을 부담하지 않는다는 것을 함께 안내해야 한다.
      4. +
      +
    • +
    • 2. 음성 외의 형태로 전송되는 광고의 경우 +
        +
      1. 가. 광고성 정보가 시작되는 부분에 (광고), 전송자의 명칭과 전화번호 또는 주소를 표시해야 한다.
      2. +
      3. 나. 수신의 거부 또는 수신동의의 철회용 자동응답전화번호 등의 전화번호 또는 전화를 갈음하여 쉽게 수신의 거부 또는 수신동의의 철회를 할 수 있는 방식을 정보가 끝나는 부분에 명시하고, 그 전화번호나 방식을 이용하여 수신의 거부 또는 수신동의의 철회를 하는 때에 수신자가 비용을 부담하지 않는다는 것을 함께 명시해야 한다.
      4. +
      +
    • +
    +
    +
    +
    +
    +

    10. 광고성 정보 전송자 금지사항(위반시 징역 1년 이하 또는 1천만원 이하의 벌금)

    +
    + + + + + + + + + + + + +
    정보통신망법에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)⑤ 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하는 자는 다음 각 호의 어느 하나에 해당하는 행위를 하여서는 아니 된다. +
        +
      1. 1. 광고성 정보 수신자의 수신거부 또는 수신동의의 철회를 회피ㆍ방해하는 행위
      2. +
      3. 2. 숫자ㆍ부호 또는 문자를 조합하여 전화번호ㆍ전자우편주소 등 수신자의 연락처를 자동으로 만들어 내는 행위
      4. +
      5. 3. 영리목적의 광고성 정보를 전송할 목적으로 전화번호 또는 전자우편주소를 자동으로 등록하는 행위
      6. +
      7. 4. 광고성 정보 전송자의 신원이나 광고 전송 출처를 감추기 위한 각종 행위
      8. +
      9. 5. 영리목적의 광고성 정보를 전송할 목적으로 수신자를 기망하여 회신을 유도하는 각종 행위
      10. +
      +
    • +
    +
    +
      +
    • + 수신거부 또는 수신동의 철회를 회피ㆍ방해하는 행위의 금지 +
        +
      • 이메일을 이용하여 광고성 정보를 전송할 때 수신거부가 되지 않도록 하거나(예: 페이지 오류로 나타나게 함), 문자로 광고성 정보를 전송할 때 연락이 되지 않는 수신거부번호를 제공하는 등의 행위를 의미합니다.
      • +
      +
    • +
    • + 수신자의 연락처를 자동으로 만들어 내는 행위의 금지 +
        +
      • 프로그램 등을 이용하여 숫자ㆍ부호 또는 문자를 조합하여 자동으로 수신자의 전화번호나 전자우편 주소 등의 연락처를 만들어 내는 행위*를 의미합니다.
      • +
      • ※ 오토콜 프로그램이 전화번호를 자동으로 생성하여 전화를 걸거나, 엑셀 프로그램 등으로 전화번호 일부 또는 전체를 자동으로 만들어 내는 것 등을 의미합니다.
      • +
      • 광고성 정보를 전송하는 자는 광고성 정보의 전송여부와 상관없이 연락처를 자동으로 만들어내는 행위만으로도 처벌됩니다.
      • +
      +
    • +
    • + 전화번호 또는 전자우편주소를 자동으로 등록하는 행위의 금지 +
        +
      • 광고성 정보 수신자의 연락처를 확보하기 위하여 프로그램을 이용하여 수신자의 전화번호 또는 전자우편주소를 자동으로 등록하는 행위*를 하여서는 안됩니다.
      • +
      • “자동으로 등록하는 행위”란 고객에게 받은 연락처를 전산 상에 자동으로 등록하는 것을 의미하는 것이 아니라 인터넷상 혹은 정보저장장치 등에 있는 전화번호 또는 전자우편주소를 프로그램을 이용하여 정보주체의 의사와 관계없이 자동으로 수집하여 등록하는 것을 의미합니다.
      • +
      +
    • +
    • + 전송자의 신원이나 광고 전송 출처를 감추기 위한 각종 행위 +
        +
      • 발신번호는 전송자를 확인할 수 없는 번호로 변작(변경, 조작 등)하여 사용해서는 안됩니다.
      • +
      • 이메일의 경우 발신자의 이메일 주소를 확인할 수 없게 하거나 다른 이메일 주소로 위ㆍ변조 하여서는 안됩니다.
      • +
      +
    • +
    • + 수신자를 속이거나 착오에 빠지게 하여 회신을 유도하는 각종 행위 +
        +
      • 벨이 1~2번 울린 후 수신자가 받기 전에 끊거나 받은 후 바로 끊는 방식으로 수신자의 전화를 유도하는 행위를 하여서는 안됩니다.
      • +
      +
    • +
    +
    +
    +
    +

    11. 수신거부 및 수신동의 철회 시 비용 발생 금지(위반시 3천만원 이하 과태료)

    +
    + + + + + + + + + + + + + + + + +
    정보통신망법, 시행령에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)⑥ 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하는 자는 수신자가 수신거부나 수신동의의 철회를 할 때 발생하는 전화요금 등의 금전적 비용을 수신자가 부담하지 아니하도록 대통령령으로 정하는 바에 따라 필요한 조치를 하여야 한다.
    • +
    +
    시행령 +
      +
    • 제62조(수신거부 또는 수신동의 철회용 무료전화서비스 등의 제공)법 제50조제6항에 따라 전자적 전송매체를 이용하여 영리목적의 광고성 정보를 전송하는 자는 별표 6에서 정하는 바에 따라 수신거부 및 수신동의 철회용 무료전화서비스 등을 해당 정보에 명시하여 수신자에게 이를 제공하여야 한다.
    • +
    +
    +
      +
    • 광고성 정보 전송자는 수신자가 금전적인 비용 부담없이 수신거부 또는 수신동의 철회를 할 수 있는 방법(ex: 수신자 부담 080 착신과금서비스) 등을 제공하고 수신자가 비용을 부담하지 않는다는 내용을 명시해야 합니다.
    • +
    • 광고내용 안에 고지된, 080등 수신동의철회 전화번호가 항상 통화중이거나 신호만 울리고 받지 않는 등 제대로 작동하지 않게 조치하여서는 안되며, 해당 전화번호로 전화연결 시 요금이 부과되도록 하여서도 안됩니다.
    • +
    +
    +
    +
    +

    12. 수신동의 여부 확인(위반시 3천만원 이하 과태료)

    +
    + + + + + + + + + + + + + + + + +
    정보통신망법, 시행령에 대한 표
    정보통신망법 +
      +
    • 제50조(영리목적의 광고성 정보 전송 제한)⑧ 제1항 또는 제3항에 따라 수신동의를 받은 자는 대통령령으로 정하는 바에 따라 정기적으로 광고성 정보 수신자의 수신동의 여부를 확인하여야 한다.
    • +
    +
    시행령 +
      +
    • 제62조의3(수신동의 여부 확인 방식)① 법 제50조제1항 또는 제3항에 따라 수신자의 사전 동의를 받은 자는 같은 조 제8항에 따라 그 수신동의를 받은 날부터 2년마다(매 2년이 되는 해의 수신동의를 받은 날과 같은 날 전까지를 말한다) 해당 수신자의 수신동의 여부를 확인하여야 한다.
    • +
    • ② 제1항에 따라 수신동의 여부를 확인하려는 자는 수신자에게 다음 각 호의 사항을 밝혀야 한다. +
        +
      1. 1. 전송자의 명칭
      2. +
      3. 2. 수신자의 수신동의 사실과 수신에 동의한 날짜
      4. +
      5. 3. 수신동의에 대한 유지 또는 철회의 의사를 표시하는 방법
      6. +
      +
    • +
    +
    +
      +
    • 수신동의 날짜는 수신동의를 한 날짜를 특정하여 명시하여야 하며, 수신동의를 한 특정 날짜를 명시하지 않은 경우 법위반에 해당합니다.
    • +
    • + 수신동의 여부 확인은 수신동의에 대한 의사 표시(동의 유지·철회) 방법에 따라 아래와 같은 방식으로 구분할 수 있습니다. +
        +
      • + <수신동의 유지 의사 표시방법을 안내할 경우> +
          +
        • 수신자가 수신동의 유지 의사를 표시할 기한을 설정하여 그 방법과 함께 안내하여야 합니다.
        • +
        • 수신자가 기한 내 수신동의에 대한 유지 의사를 표시하지 않을 경우 동의를 철회한 것으로 봅니다.
        • +
        +
      • +
      • + <수신동의 철회 의사 표시방법을 안내할 경우> +
          +
        • 전송자는 수신자가 수신동의 철회 의사를 표시할 기한을 별도로 설정하지 않으나, 의사 표시 즉시 철회 의사를 반영해야 합니다.
        • +
        • 수신자가 수신동의 여부 안내를 받은 후 아무런 의사표시를 하지 않는 경우 수신동의 의사가 그대로 유지되는 것으로 봅니다.
        • +
        +
      • +
      +
    • +
    • + 수신동의 후 특정일에 상관없이 수신동의를 받은 날부터 2년 이내에 수신동의 사실을 안내해주면 됩니다. +
        +
      • 수신동의 확인은 최초 수신동의 시점부터 2년마다 기산하면 됩니다(안내한 날부터 새로 기산되는 것이 아님에 주의)
      • +
      +
    • +
    • 수신동의 여부 확인은 수신자의 확인 용이성을 고려하여 연락처가 있는 경우 문자 메시지로 알리는 것을 권장합니다.
    • +
    +
    +
    +
    +

    13. 법률에서 금지하는 광고성 정보의 전송 금지(위반시 3년 이하의 징역이나 3천만원 이하의 벌금)

    +
    + + + + + + + + + + + + +
    정보통신망법에 대한 표
    정보통신망법 +
      +
    • 제50조의8(불법행위를 위한 광고성 정보 전송금지)누구든지 정보통신망을 이용하여 이 법 또는 다른 법률에서 이용, 판매, 제공, 유통, 그 밖에 이와 유사한 행위를 금지하는 재화 또는 서비스에 대한 광고성 정보전송하여서는 아니 된다.
    • +
    +
    +
      +
    • 마약, 불법대출, 도박, 성매매, 불법의약품, 청소년유해물 등 법률에서 금지하는 재화 또는 서비스(허가받지 않은 사업자가 운영하는 재화 및 서비스도 포함합니다)에 대해서는 누구든지 광고성 정보를 전송하여서는 안됩니다.
    • +
    • 정보통신서비스 제공자는 자사의 서비스를 통해 법률에서 금지하는 재화 및 서비스에 대한 광고성 정보를 전송되는 경우 수신동의 및 표기의무 사항 준수와 상관없이 역무제공 거부(서비스 계약해지 등) 또는 차단 등의 조치를 할 수 있습니다.
    • +
    • 다른 법령(예 : 약사법 제61조, 국민체육진흥법 제26조 등)에서 광고에 대한 처벌 규정이 적용되더라도 정보통신망법에 의한 이 규정을 위반하는 경우 별도로 본 규정도 적용됩니다.
    • +
    +
    +
    +
    +

    14. 불법스팸 신고

    +
    +

    불법스팸에 대한 신고는 한국인터넷진흥원 불법스팸대응센터(spam.kisa.or.kr / 국번없이 118)를 통해 가능합니다.

    +
    +
    +
    + + +
    + +
    + +
    +
    + + + +
    + + +
    + + + + \ No newline at end of file