[스프링SPRING MVC] 비밀번호찾기 및 임시 비밀번호 발급(지메일Gmail)

pom.xml 코드 추가

이메일로 비밀번호찾기 및 임시비밀번호 발급을 구현하기 위해서는 라이브러리를 추가해야한다.

1
2
3
4
5
6
<!-- 메일 api -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.2</version>
</dependency>

지메일을 이용하는 경우 구글 계정에서 보안 수준이 낮은 앱의 액세스를 허용해야한다.
보내는 사람과 받는 사람 둘 다 보안 수준이 낮은 앱의 액세스를 허용해야지만 정상 작동한다.

구글계정관리 -> 보안 -> 사용으로 변경




MemberController.java 코드 추가

1
2
3
4
5
6
7
8
9
/* 비밀번호 찾기 */
@RequestMapping(value = "/findpw", method = RequestMethod.GET)
public void findPwGET() throws Exception{
}

@RequestMapping(value = "/findpw", method = RequestMethod.POST)
public void findPwPOST(@ModelAttribute MemberVO member, HttpServletResponse response) throws Exception{
service.findPw(response, member);
}




findpw.jsp 뷰 연결

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function(){
$("#findBtn").click(function(){
$.ajax({
url : "/member/findpw",
type : "POST",
data : {
id : $("#id").val(),
email : $("#email").val()
},
success : function(result) {
alert(result);
},
})
});
})
</script>
<style type="text/css">
.mybtn{
width:150px;
height:40px;
padding:0;
display:inline;
border-radius: 4px;
background: #212529;
color: #fff;
margin-top: 20px;
border: solid 2px #212529;
transition: all 0.5s ease-in-out 0s;
}
.mybtn:hover .mybtn:focus {
background: white;
color: #212529;
text-decoration: none;
}
</style>
<title>비밀번호 찾기</title>
</head>
<body>
<div class="w3-content w3-container w3-margin-top">
<div class="w3-container w3-card-4 w3-auto" style="width: 382px;height: 456.3px;">
<div class="w3-center w3-large w3-margin-top">
<h3>비밀번호 찾기</h3>
</div>
<div>
<p>
<label>아이디</label>
<input class="w3-input" type="text" id="id" name="id" placeholder="회원가입한 아이디를 입력하세요" required>
</p>
<p>
<label>이메일</label>
<input class="w3-input" type="text" id="email" name="email" placeholder="회원가입한 이메일주소를 입력하세요" required>
</p>
<p class="w3-center">
<button type="button" id="findBtn" class="w3-button w3-hover-white w3-ripple w3-margin-top w3-round mybtn">찾기</button>
<button type="button" onclick="history.go(-1);" class="w3-button w3-hover-white w3-ripple w3-margin-top w3-round mybtn">로그인으로</button>
</p>
</div>
</div>
</div>
</body>
</html>




MemberService.java 인터페이스에 메서드 추가

1
2
3
4
5
//이메일발송
public void sendEmail(MemberVO vo, String div) throws Exception;

//비밀번호찾기
public void findPw(HttpServletResponse resp, MemberVO vo) throws Exception;




MemberServiceImpl.java 메서드 오버라이딩 코드 추가

  • 네이버 이메일을 이용하는 경우
    • String hostSMTP = "smtp.naver.com";
    • email.setSmtpPort(587);
  • 지메일을 이용하는 경우
    • String hostSMTP = "smtp.gmail.com";
    • email.setSmtpPort(465);
    • 처음엔 동일한 587 포트를 사용했으나 오류가 발생하여 구글링끝에 465로 설정하니 정상 작동하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//비밀번호 찾기 이메일발송
@Override
public void sendEmail(MemberVO vo, String div) throws Exception {
// Mail Server 설정
String charSet = "utf-8";
String hostSMTP = "smtp.gmail.com"; //네이버 이용시 smtp.naver.com
String hostSMTPid = "서버 이메일 주소(보내는 사람 이메일 주소)";
String hostSMTPpwd = "서버 이메일 비번(보내는 사람 이메일 비번)";

// 보내는 사람 EMail, 제목, 내용
String fromEmail = "보내는 사람 이메일주소(받는 사람 이메일에 표시됨)";
String fromName = "프로젝트이름 또는 보내는 사람 이름";
String subject = "";
String msg = "";

if(div.equals("findpw")) {
subject = "베프마켓 임시 비밀번호 입니다.";
msg += "<div align='center' style='border:1px solid black; font-family:verdana'>";
msg += "<h3 style='color: blue;'>";
msg += vo.getId() + "님의 임시 비밀번호 입니다. 비밀번호를 변경하여 사용하세요.</h3>";
msg += "<p>임시 비밀번호 : ";
msg += vo.getPw() + "</p></div>";
}

// 받는 사람 E-Mail 주소
String mail = vo.getEmail();
try {
HtmlEmail email = new HtmlEmail();
email.setDebug(true);
email.setCharset(charSet);
email.setSSL(true);
email.setHostName(hostSMTP);
email.setSmtpPort(465); //네이버 이용시 587

email.setAuthentication(hostSMTPid, hostSMTPpwd);
email.setTLS(true);
email.addTo(mail, charSet);
email.setFrom(fromEmail, fromName, charSet);
email.setSubject(subject);
email.setHtmlMsg(msg);
email.send();
} catch (Exception e) {
System.out.println("메일발송 실패 : " + e);
}
}

//비밀번호찾기
@Override
public void findPw(HttpServletResponse response, MemberVO vo) throws Exception {
response.setContentType("text/html;charset=utf-8");
MemberVO ck = mdao.readMember(vo.getId());
PrintWriter out = response.getWriter();
// 가입된 아이디가 없으면
if(mdao.idCheck(vo.getId()) == null) {
out.print("등록되지 않은 아이디입니다.");
out.close();
}
// 가입된 이메일이 아니면
else if(!vo.getEmail().equals(ck.getEmail())) {
out.print("등록되지 않은 이메일입니다.");
out.close();
}else {
// 임시 비밀번호 생성
String pw = "";
for (int i = 0; i < 12; i++) {
pw += (char) ((Math.random() * 26) + 97);
}
vo.setPw(pw);
// 비밀번호 변경
mdao.updatePw(vo);
// 비밀번호 변경 메일 발송
sendEmail(vo, "findpw");

out.print("이메일로 임시 비밀번호를 발송하였습니다.");
out.close();
}
}




MemberDAO.java 인터페이스에 메서드 추가

임시 비밀번호를 발급하면서 해당 비밀번호를 DB에 update하는 메서드를 구현한다.

1
2
// 비밀번호 변경
public int updatePw(MemberVO vo) throws Exception;




MemberDAOImpl.java 메서드 오버라이딩 코드 추가

1
2
3
4
5
//비밀번호변경
@Override
public int updatePw(MemberVO vo) throws Exception {
return sqlSession.update(namespace+".updatePw", vo);
}




MemberMapper.xml SQL쿼리 추가

1
2
3
4
<!-- 비밀번호 변경 -->
<update id="updatePw" >
update member set pw = #{pw} where id = #{id}
</update>




결과물

서버 이메일 계정에서 admin계정으로 임시 비밀번호를 전송하였다.
admin@naver.com은 당연히 존재하지 않는 계정이니 서버이메일계정으로 반송되어왔다.
이메일 내용에 임시 비밀번호가 잘 출력됨을 확인할 수 있다.
더불어 DB도 수정된 임시비밀번호로 update되어있음을 확인 할 수 있다.




참고