๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปWEB BackEnd/JSP

๊ตฌํ˜„(1) - ํšŒ์›๊ฐ€์ž… ๋ฐ ์ด๋ฉ”์ผ ์ธ์ฆ

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„  2๊ฐ€์ง€ util class๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • SHA256.java : ์ด๋ฉ”์ผ ์ธ์ฆ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค
  • Gmail.java : Gmail SMTP๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •๋ณด๋ฅผ ๋„ฃ๋Š” ํด๋ž˜์Šค

 

util ํด๋ž˜์Šค ์„ค์ •

1) SHA256.java : ์ด๋ฉ”์ผ์— ํ•ด์‰ฌ๋ฅผ ์ ์šฉํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค

package util;

import java.security.MessageDigest;

public class SHA256 {

		public static String getSHA256(String input) {
			StringBuffer result = new StringBuffer();
			try {
				MessageDigest digest = MessageDigest.getInstance("SHA-256");
				byte[] salt = "Hello! This is Salt.".getBytes();
				digest.reset();
				digest.update(salt);
				byte[] chars = digest.digest(input.getBytes("UTF-8"));
				for(int i = 0; i < chars.length; i++) {
					String hex = Integer.toHexString(0xff & chars[i]);
					if(hex.length() == 1) result.append("0");
					result.append(hex);
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
			return result.toString();
		}
}

 

2) Gmail.java : Gmail SMTP๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ •๋ณด๋ฅผ ๋„ฃ๋Š” ํด๋ž˜์Šค

  • SMTP ๋ฉ”์ผ ์ „์†ก์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(2๊ฐœ) ๋‹ค์šด๋กœ๋“œ

 

 

  • Gmail ํด๋ž˜์Šค ์ฝ”๋“œ ์ž‘์„ฑ
package util;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class Gmail extends Authenticator {

	@Override
	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication("google_ID", "password");  //๊ด€๋ฆฌ์ž์˜ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ
	}
}

 

Google ์•ก์„ธ์Šค ๊ด€๋ฆฌ 

ํ•ด๋‹น ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ํ•œ ํ›„ 

["๋กœ๊ทธ์ธ ๋ฐ ๋ณด์•ˆ" > "๊ณ„์ • ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์•ฑ " > ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์•ฑ ํ—ˆ์šฉ!]

 

 

ํšŒ์›๊ฐ€์ž…, ์ด๋ฉ”์ผ ์ธ์ฆ Action 

userRegisterAction.jsp

ํšŒ์›๊ฐ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="user.UserDTO"%>
<%@ page import="user.UserDAO"%>
<%@ page import="util.SHA256"%>
<%@ page import="java.io.PrintWriter"%>

<%
	request.setCharacterEncoding("UTF-8");
	String userID = null;
	if(session.getAttribute("userID") != null) {
		userID = (String) session.getAttribute("userID");
	}
	if(userID != null) {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('๋กœ๊ทธ์ธ์ด ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.');");
		script.println("location.href = 'index.jsp';");
		script.println("</script>");
		script.close();
		return;
	}
	String userPassword = null;
	String userEmail = null;
	if(request.getParameter("userID") != null)
		userID = request.getParameter("userID");
	if(request.getParameter("userPassword") != null)
		userPassword = request.getParameter("userPassword");
	if(request.getParameter("userEmail") != null)
		userEmail = request.getParameter("userEmail");
	if(userID == null || userPassword == null || userEmail == null) {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('์ž…๋ ฅ์ด ์•ˆ ๋œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.');");
		script.println("history.back();");
		script.println("</script>");
		script.close();
		return;
	}
	
	//ํšŒ์›๊ฐ€์ž…
	UserDAO userDAO = new UserDAO();
	int result = userDAO.join(new UserDTO(userID, userPassword, userEmail, SHA256.getSHA256(userEmail), false));
	if(result == -1) {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์•„์ด๋””์ž…๋‹ˆ๋‹ค.');");
		script.println("history.back();");
		script.println("</script>");
		script.close();
		return;
	} else {
		//๋กœ๊ทธ์ธ
		session.setAttribute("userID", userID);
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("location.href = 'emailSendAction.jsp'");
		script.println("</script>");
		script.close();
		return;
	}
%>

 

emailSendAction.jsp

์ด๋ฉ”์ผ ์ธ์ฆ ์ „์†ก ํ•จ์ˆ˜

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*, java.io.PrintWriter, javax.mail.internet.*, javax.mail.*"%>
<%@ page import="user.*, util.*"%>

<%
	UserDAO userDAO = new UserDAO();
	String userID = null;
	if(session.getAttribute("userID") != null) 
		userID = (String) session.getAttribute("userID");
	
	//๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ
	if(userID == null) {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์„ธ์š”.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");
		script.close();
		return;
	}

	boolean emailChecked = userDAO.getUserEmailChecked(userID);
	if(emailChecked) {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('์ด๋ฏธ ์ธ์ฆ ๋œ ํšŒ์›์ž…๋‹ˆ๋‹ค.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");
		script.close();
		return;
	} 
	
	String host = "http://localhost:8080/TestWeb/";
	//๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ
	String from = "๋ณธ์ธ์˜ google_ID";
	//๋ฐ›๋Š” ์‚ฌ๋žŒ
	String to = userDAO.getUserEmail(userID);
	//์ด๋ฉ”์ผ ์ œ๋ชฉ, ๋‚ด์šฉ
	String subject = "๊ฐ•์˜ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ์ด๋ฉ”์ผ ์ธ์ฆ ๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.";
	String content = "๋‹ค์Œ ๋งํฌ์— ์ ‘์†ํ•˜์—ฌ ์ด๋ฉ”์ผ ์ธ์ฆ์„ ์ง„ํ–‰ํ•˜์„ธ์š”." +
		"<a href = '" + host + "emailCheckAction.jsp?code=" + new SHA256().getSHA256(to) + "'>์ด๋ฉ”์ผ ์ธ์ฆํ•˜๊ธฐ</a>";
	
	Properties p = new Properties();
	p.put("mail.smtp.user", from);
	p.put("mail.smtp.host", "smtp.googlemail.com");
	p.put("mail.smtp.port", "465");  //๊ตฌ๊ธ€์ด ์ •ํ•ด์ค€ port
	p.put("mail.smtp.starttls.enable", "true");
	p.put("mail.smtp.auth", "true");
	p.put("mail.smtp.debug", "true");
	p.put("mail.smtp.socketFactory.port", "465");
	p.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
	p.put("mail.smtp.socketFactory.fallback", "false");
	
	try {
		Authenticator auth = new Gmail();
		Session ses = Session.getInstance(p, auth);
		ses.setDebug(true);
		MimeMessage msg = new MimeMessage(ses);
		msg.setSubject(subject);
		Address fromAddr = new InternetAddress(from);
		msg.setFrom(fromAddr);
		Address toAddr = new InternetAddress(to);
		msg.addRecipient(Message.RecipientType.TO, toAddr);
		msg.setContent(content, "text/html;charset=UTF8");
		Transport.send(msg);
	} catch(Exception e) {
		e.printStackTrace();
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');");
		script.println("history.back();");
		script.println("</script>");
		script.close();
		return;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>๊ฐ•์˜ํ‰๊ฐ€ ์›น ์‚ฌ์ดํŠธ</title>
<!-- bootstrap CSS ์ถ”๊ฐ€ -->
<link rel="stylesheet" href="./css/bootstrap.min.css">
<!-- custom CSS ์ถ”๊ฐ€ -->
<link rel="stylesheet" href="./css/custom.css">
</head>
<body>
	<nav class="navbar navbar-expand-lg navbar-light bg-light">
		<a class="navbar-brand" href="index.jsp">๊ฐ•์˜ํ‰๊ฐ€ ์›น ์‚ฌ์ดํŠธ</a>
		<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
			<span class="navbar-toggler-icon"></span>
		</button>
		<div id="navbar" class="collapse navbar-collapse">
			<ul class="navbar-nav mr-auto">
				<li class="nav-item active">
					<a class="nav-link" href="index.jsp">๋ฉ”์ธ</a>
				</li>
				<li class="nav-item dropdown">
					<a class="nav-link dropdown-toggle" id="dropdown" data-toggle="dropdown">
						ํšŒ์›๊ด€๋ฆฌ
					</a>
					<div class="dropdown-menu" aria-labelledby="dropdown">
<%
	if(userID == null) {
%>
						<a class="dropdown-item" href="userLogin.jsp">๋กœ๊ทธ์ธ</a>
						<a class="dropdown-item" href="userJoin.jsp">ํšŒ์›๊ฐ€์ž…</a>
<%
	} else {
%>
						<a class="dropdown-item" href="userLogout.jsp">๋กœ๊ทธ์•„์›ƒ</a>
<%
	}
%>
					</div>
				</li>
			</ul>
			<form action="./index.jsp" method="get" class="form-inline my-2 my-lg-0">
				<input type="text" name="search" class="form-control mr-sm-2" type="search" placeholder="๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”." aria-label="Search"/>
				<button class="btn btn-outline-success my-2 my-sm-0" type="submit">๊ฒ€์ƒ‰</button>
			</form>
		</div>
	</nav>
	<section class="container mt-3" style="max-width: 560px;">
		<div class="alert alert-success mt-4" role="alert">
			์ด๋ฉ”์ผ ์ฃผ์†Œ ์ธ์ฆ ๋ฉ”์ผ์ด ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์‹œ ์ž…๋ ฅํ–ˆ๋˜ ์ด๋ฉ”์ผ์— ๋“ค์–ด๊ฐ€์…”์„œ ์ธ์ฆํ•ด์ฃผ์„ธ์š”.
		</div>
	</section>
	<footer class="bg-dark mt-4 p-5 text-center" style="color: #FFFFFF;">
		Copyright &copy; 2022 Jsh Rights Reserved.
	</footer>
	<!-- jQuery ์ถ”๊ฐ€ -->
	<script src="./js/jquery.min.js"></script>
	<!-- pooper ์ถ”๊ฐ€ -->
	<script src="./js/popper.js"></script>
	<!-- bootstrap.js ์ถ”๊ฐ€ -->
	<script src="./js/bootstrap.min.js"></script>
</body>
</html>

 

emailCheckAction.jsp 

์ด๋ฉ”์ผ ์ฒดํฌ ํ•จ์ˆ˜

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.PrintWriter"%>
<%@ page import="user.*, util.*"%>

<%
	request.setCharacterEncoding("UTF-8");
	String code = null;
	if(request.getParameter("code") != null) 
		code = request.getParameter("code");
	UserDAO userDAO = new UserDAO();
	String userID = null;
	if(session.getAttribute("userID") != null) 
		userID = (String) session.getAttribute("userID");
	if(userID == null) {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์„ธ์š”.');");
		script.println("location.href = 'userLogin.jsp'");
		script.println("</script>");
		script.close();
		return;
	}
	String userEmail = userDAO.getUserEmail(userID);
	boolean isRight = (new SHA256().getSHA256(userEmail).equals(code)) ? true : false;
	if(isRight) {
		userDAO.setUserEmailChecked(userID);
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('์ธ์ฆ์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");
		script.close();
		return;
	} else {
		PrintWriter script = response.getWriter();
		script.println("<script>");
		script.println("alert('์œ ํšจํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.');");
		script.println("location.href = 'index.jsp'");
		script.println("</script>");
		script.close();
		return;
	}
%>