본문 바로가기

JSP

JSP - 이메일 인증

반응형

1. 이메일 인증 동작 원리

사용자가 입력한 이메일 주소를 Servlet으로 가져와, 해당 이메일주소와 설정한 인증코드(난수)를 라이브러리를 이용하여 메일 전송하여 이메일 인증 절차를 적용할 수 있다.

*사용 라이브러리: java-mail.jar, java-activation.jar

2. 이메일 인증 적용 방법 [ Servlet ]

package apply.controller.member;

import java.io.IOException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import apply.model.dto.MemberDto;

@WebServlet("/apply/Email")
public class Email extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Email() { }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 1. 받을 회원 이메일 요청
		String memail = request.getParameter("memail");
			// System.out.println(memail);
		String auth = "";
		// 용도: 인증코드로 사용
		
		for( int i = 0; i < 6; i++ ) {
			Random random = new Random();	auth += random.nextInt(10);
		}
		
		// 2. SMTP(간이 메일 전송 프로토콜): Simple Mail Transfer Protocol
		// 1) 필요한 라이브러리: java-mail , java-activation
		// 2) 원리: 위의 라이브러리 이용하여, 서버( 네이버, 다음, 구글)에 메일 전송		
		
		boolean result = new MemberDto().sendEmail(memail, auth);
		if( result ) { response.getWriter().print(auth); }
		else { response.getWriter().print(result); }
	}
}

3. 타이머 적용 방법 [ JS ]

let checkconfirm = document.querySelectorAll('.checkconfirm');
let auth = 0;
let timer = 0;
let timerInter; 

function getauth(){
	// console.log('함수 작동')
	
	// ajax JAVA에게 이메일 전송 후 인증코드 방기! [실제 인증 절차 적용할 때 코드!]

	$.ajax({
		url:"/JSPWEB/apply/Email",
		method: "post",
		data: {  "memail" : document.querySelector('.memail').value },
		success: ( o )=>{
			// console.log(o);
			
			let html =	`
				<input type="text" class="authinput" placeholder="인증코드">
				<div class="timebox"> </div>
				<button onclick="authconfirm()" class="authconfirmbtn" type="button"> 확인  </button>
				`
			document.querySelector('.authbox').innerHTML = html;
	
			// 타이머 함수 적용
			auth = o; timer = 120;
			settimer();
		}	
	})
}

// 타이머 함수 [이메일]
function settimer(){
	timerInter = setInterval( ()=>{
		let min = parseInt(timer / 60); let sec = parseInt(timer % 60);
		
		min = min < 10 ? "0" + min : min;
		sec = sec < 10 ? "0" + sec : sec;
		
		let timeHTML = min + ":" + sec;
		document.querySelector('.timebox').innerHTML = timeHTML;
		timer--;
		
		if( timer < 0 ){
			clearInterval( timerInter )
			checkconfirm[3].innerHTML = "인증 실패";
			document.querySelector('.authbox').innerHTML = "";
		}
	} , 1000 )
}

// 인증코드 확인
function authconfirm(){
	// console.log('함수 동작 확인');
	
	let authinput = document.querySelector('.authinput').value;
	// 2. 발급된 인증코드 와 입력한 인증코드 비교 
	if( auth == authinput ){ // 인증코드 일치 
		clearInterval( timerInter );
		document.querySelector('.authbox').innerHTML = "";
		document.querySelector('.authbtn').innerHTML = "완료";
		document.querySelector('.authbtn').disabled = true;
		checkconfirm[3].innerHTML = '사용가능';
	}else{ // 인증코드 불일치 
		checkconfirm[3].innerHTML = '인증코드 일치하지 않습니다.';
	}
}

4. HTML 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

	<!-- 반응형 -->
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<!-- CSS only -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
	
	<link href="/JSPWEB/apply/css/signup.css" rel="stylesheet">
	
</head>
<body>

	<%@ include file = "../header.jsp" %>
	<div class="container">
		<h3> CuoreEspresso Ansan </h3>
		<p> 환영합니다. </p>
	
		<form class="signupForm" enctype="multipart/form">
		
			<div class="title"> 아이디 </div>
			<input onkeyup="idcheck()" maxlength="30" type="text" name="mid" class="mid" id="mid"> <br/>
			<div class = "checkconfirm"> </div>
			
			<div class="title"> 비밀번호 </div>
			<input onkeyup="pwcheck()" maxlength="20" type="password" name="mpw" class="mpw" id="mpw"> <br/>
			<div class = "checkconfirm"></div>
			
			<div class="title"> 비밀번호 확인</div>
			<input onkeyup="pwccehck()" maxlength="20" type="password" name="mpwc" class="mpwc" id="mpwc"> <br/>
			<div class = "checkconfirm"></div>
			
			<div class="title"> 이메일 </div>
			<div class="emailBox">
				<input onkeyup="emailcheck()" type="text" name="memail" class="memail" id="memail"> <br/>
				<button onclick="getauth()" class="authbtn" type="button" disabled> 인증 </button>
			</div>
			
			<div class="authbox">
				
			</div>
			
			<div class = "checkconfirm"></div>
			
			<div class="title"> 프로필 </div>
			<div class="pimgbox">
				<input onchange="premimg(this)" type="file" name="mimg" class="mimg" id="mimg"> <br/>
				<img class="premig" alt="" src="/JSPWEB/apply/member/pimg/default.png"> <br/>
			</div>
			
			<button class="signupbtn" onclick="signup()" type="button"> 가입 </button>	
		</form>
	</div>

	<!-- 1. 최신 jquery(js 라이브러리) import (ajax 함수 활용하기 위함) -->
	<script  src="http://code.jquery.com/jquery-latest.min.js"></script>

	<script src="/JSPWEB/apply/js/member/signup.js" type="text/javascript"> </script>

</body>
</html>
반응형

'JSP' 카테고리의 다른 글

JSP - 소켓 사용  (1) 2023.04.28
JSP - Servlet 사용  (0) 2023.04.28
JSP - 공공데이터 사용  (0) 2023.04.28
JSP - 페이징 처리  (0) 2023.04.28
Java JSP 알아보기  (0) 2023.03.06