Devme/Project

JAVA / SPRING 프로젝트 삼삼하개(1) 이메일 인증으로 비밀번호찾기

팀프로젝트가 끝나고 되돌아보는 시간 (1) 이메일 인증을 통한 비밀번호 찾기(수정)

 

 

비밀번호 찾기 기능은 총 세 페이지로 구성했습니다. 

(비밀번호 찾기 pw_find, 이메일 인증번호 pw_auth, 새 비밀번호 설정 pw_new)

 

pw_find.jsp (비밀번호 찾기)

<form class = "content" action="pw_auth.me" method="post">
	<div class="textbox">
  		<input id="text" name=name required="" type="text" />
  		<label for="text">이름</label>
   		<div class="error">이름을 입력하세요  </div>
 	</div>
	<div class="textbox">
  		<input id="email" name=email required="/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)?$/i" type="email" />
  		<label for="email">이메일</label>
  	<div class="error">유효하지 않은 이메일주소 입니다  </div>
	</div><br><br>
   	<input type="submit" id="check" value="비밀번호찾기">
</form>

label이나 .error 부분은 필수 입력값이기 때문에 유효성 및 css에 적용하기 위해 코딩하였습니다.

이메일을 입력받는 input 태그 타입자체를 email로 주어 ~@~ 형식은 적용되었으나 추가적으로 이메일 형식 (ex. test@test.com)을 적용하도록 했습니다

 

 

비밀번호 찾기 pw_find, 이메일 인증번호 pw_auth, 새 비밀번호 설정 pw_new

 

Controller (인증번호 발송)

@RequestMapping(value = "/pw_auth.me")
	public ModelAndView pw_auth(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException {
		String email = (String)request.getParameter("email");
		String name = (String)request.getParameter("name");

		MemberVO vo = memberSV.selectMember(email);
			
		if(vo != null) {
		Random r = new Random();
		int num = r.nextInt(999999); // 랜덤난수설정
		
		if (vo.getName().equals(name)) {
			session.setAttribute("email", vo.getEmail());

			String setfrom = "ivedot@naver.com"; // naver 
			String tomail = email; //받는사람
			String title = "[삼삼하개] 비밀번호변경 인증 이메일 입니다"; 
			String content = System.getProperty("line.separator") + "안녕하세요 회원님" + System.getProperty("line.separator")
					+ "삼삼하개 비밀번호찾기(변경) 인증번호는 " + num + " 입니다." + System.getProperty("line.separator"); // 

			try {
				MimeMessage message = mailSender.createMimeMessage();
				MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "utf-8");

				messageHelper.setFrom(setfrom); 
				messageHelper.setTo(tomail); 
				messageHelper.setSubject(title);
				messageHelper.setText(content); 

				mailSender.send(message);
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}

			ModelAndView mv = new ModelAndView();
			mv.setViewName("YM/pw_auth");
			mv.addObject("num", num);
			return mv;
		}else {
			ModelAndView mv = new ModelAndView();
			mv.setViewName("YM/pw_find");
			return mv;
		}
		}else {
			ModelAndView mv = new ModelAndView();
			mv.setViewName("YM/pw_find");
			return mv;
		}

memberSV.selectMember(email) 로 입력받은 이메일 값이 회원목록에 있는지 확인 후

존재한다면 랜덤숫자(6자리)를 설정하여 인증이메일을 발송합니다

 

정상적으로 이메일이 전송될 경우 pw_auth(이메일 인증번호 확인 페이지) 에서 랜덤숫자가 정확히 입력되는지 확인해야되기 때문에

ModelAndView 로 페이지 이동했습니다.

이 외에 DB에 랜덤값을 저장하는 방법도 있겠습니다만 일회성값이고 정상적인 이메일 주인이라면 언제고 인증번호를 재발송 받을수 있다는 판단하에 DB에 저장하는 것보단 ModelAndView로 전달하는 것이 효율적이라 생각했습니다.

 

 

pw_auth.jsp (이메일 인증번호 확인)

<form action="pw_set.me" method="post">
	<input type="hidden" name ="num" value="${num }">
		<div class=content>
			<div class="textbox">
			<input type="text" name="email_injeung" placeholder="인증번호를 입력하세요"><label>인증번호 </label>
			<div class="error"> </div>
		</div><br><br>
			<input type="submit" id="check" value="확인">
</form>

컨트롤러에서 전달받은 랜덤값 num은 hidden으로 처리하고 사용자에게 입력받은 인증번호는 name = email_injeung으로 적용하여

컨트롤러에서 서로 동일한 값인지 확인합니다.

 

정리하고 있는 시점에서 보니 굳이 컨트롤러가 아니라도 javascript로 num과 email_injeung값이 동일한지 확인하는 이벤트 함수로 처리로 페이지 이동을 처리했어도 되지 않았을까싶습니다.

 

Controller (인증번호 동일한지 확인)

@RequestMapping(value = "/pw_set.me", method = RequestMethod.POST)
public String pw_set(@RequestParam(value="email_injeung") String email_injeung,
			@RequestParam(value = "num") String num) throws IOException{
		
		if(email_injeung.equals(num)) {
			return "YM/pw_new";
		}
		else {
			return "YM/pw_find";
		}
} //이메일 인증번호 확인

pw_new.jsp (새 비밀번호 설정)

<form action="pw_new.me" method="POST" class="content">
	<div class="textbox">
		<input id="pw" name="pw" type="password"><label>새비밀번호</label>
		<div class="error">
 				Invalid password
		</div> 
	</div>
	<div class="textbox">
		<input id="pw2" type="password" onchange="isSame();"><label>새비밀번호 확인</label>
		<div class="error">
				Invalid password
		</div>
	</div>
	<span id=same></span>
	<br><br>
	<input type="submit" id="check" value="비밀번호변경">
	<input type="hidden" name="email" value=<%=email %>>
</form>

Controller (DB 비밀번호 업데이트)

@RequestMapping(value = "/pw_new.me", method = RequestMethod.POST)
	public String pw_new(MemberVO vo, HttpSession session) throws IOException{
		int result = memberSV.pwUpdate_M(vo);
		if(result == 1) {
			return "jj/loginForm";
		}
		else {
			System.out.println("pw_update"+ result);
			return "YM/pw_new";
		}
}

 

Mapper (Mybatis)

<!-- 회원정보조회 -->
<select id="selectMember" parameterType="String" resultType="MemberVO">
select * from member_list where email = #{email}
</select>

<!-- 패스워드변경 -->
<update id = "pwUpdate_M" parameterType="MemberVO">
update member_list set pw=#{pw} where email= #{email}
</update>

root-context.xml(이메일 발송 설정)

<bean id="mailSender"
		class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host" value="smtp.gmail.com" />
		<property name="port" value="465" />
		<property name="username" value="보내는 사람 이메일" />
		<property name="password" value="이메일 비밀번호" />
		<property name="defaultEncoding" value="utf-8" />
		<property name="javaMailProperties">
			<props>
				<prop key="mail.smtp.auth">true</prop>
				<prop key="mail.smtp.starttls.enable">true</prop>
				<prop key="mail.smtps.ssl.checkserveridentity">true</prop>
				<prop key="mail.smtps.ssl.trust">*</prop>
				<prop key="mail.debug">true</prop>
				<prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
			</props>
		</property>
	</bean>