이메일 인증번호 구현 적용해보기

먼저 이메일 인증 관련 라이브러리를 pom.xml에 적용한다.

 

		<!-- mail library -->
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>

		<!-- mail 서포트 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

그다음 root-context.xml에도 설정이 필요하다.

 

	<bean id="javaMailSender"
		class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host" value="smtp.gmail.com" />
		<property name="port" value="587" />
		<property name="username" value="지메일 아이디" />
		<property name="password" value="비밀번호" />
		<property name="javaMailProperties">
			<props>
				<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
				<prop key="mail.smtp.starttls.enable">true</prop>
				<prop key="mail.smtp.auth">true</prop>
	            <prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
			</props>
		</property>
	</bean>
	
	<bean id="mailService" class="com.sh.service.MailServiceImpl"> 
		<property name="javaMailSender" ref="javaMailSender" /> 
	</bean>

자바에서 구현해놓은 javaMailSender를 이용해서 구현해봅시다.

 

지메일 아이디 부분과 비밀번호는 실제 자기 비밀번호와 지메일 부분을 이용합니다.

 

그래야지, 저 이메일에서 다른 이메일로 메일을 전송할 수 있습니다.

 

세션은 클라이언트 별로 서버에 저장되는 정보이다.

 

세션에다가 난수의 인증번호를 저장한 뒤, 서비스로 보냅니다.( 컨트롤러 -> 서비스 )

	// 이메일 인증
	@PostMapping("/emailSend")
	@ResponseBody
	public boolean sendMailAuth(HttpSession session, @RequestParam(value="email") String email) {
		int ran = new Random().nextInt(100000) + 10000;
		String joinCode = String.valueOf(ran);
		session.setAttribute("joinCode", joinCode);
		
		String subject = "회원가입 인증 코드 발급 안내 입니다.";
		StringBuilder sb = new StringBuilder();
		sb.append("귀하의 인증 코드는 " + joinCode + "입니다."); 
		
		return mailservice.send(subject, sb.toString(), "ckdbioksh@gmail.com", email);
	}

@ResponseBody를 이용해서 json 통신을 할 수 있게 해 줍니다.

 

자동으로 json형태로 변환되게 해 줍니다.

 

그다음 MailService 서비스 인터페이스를 구현해줍니다.

package com.sh.service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

public class MailServiceImpl implements MailService{

	@Autowired
	private JavaMailSender javaMailSender;

	public void setJavaMailSender(JavaMailSender javaMailSender) {
		this.javaMailSender = javaMailSender; 
	}

	@Override
	public boolean send(String subject, String text, String from, String to) {
		
		MimeMessage message = javaMailSender.createMimeMessage();

		 try {
		
			 MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); 
			 helper.setSubject(subject); 
			 helper.setText(text, true); 
			 helper.setFrom(from); 
			 helper.setTo(to);
			
			 javaMailSender.send(message); 
			 return true;
		 } catch (MessagingException e) {
			 e.printStackTrace();
		 }

		return false;
	}
	
}

JavaMailSender를 이용합니다.

MimeMessage를 이용해서 컨트롤러에서 받은 이메일 제목, 보낸 이, 메시지 내용, 받는 사람 등등 입력해줍니다.

 

js로 ajax접근을 해서 session값에 저장된 joinCode를 가져와서 같은지 아닌지를 비교해서 통과시키는 방법으로 만들었습니다.

 


만약 535-5.7.8 Username and Password not aceepted. Learn more at

해당 에러가 발생하면 구글 인증이 안이루어 졌기 때문에 설정이 더 필요한 것입니다.

보내는 구글 계정의 보안 수준이 낮은 해어용을 체크해줘야 합니다.

 

 javax mail Could not convert socket to TLS

해당 에러가 발생하면 root-context.xml에 집어넣었던 메일 센더의 버전이 맞지 않아서 생기는 에러입니다.

		<prop key="mail.smtp.ssl.trust">smtp.gmail.com</prop>
		<prop key="mail.smtp.starttls.enable">true</prop>
		<prop key="mail.smtp.auth">true</prop>
	        <prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>

root-context에 이쪽 구문을 다시 확인해보면 된다.

 

구 버전인 TLS 1.0. 1.1은 POODEL과 BEAST와 같은 여러 공격에 취약한 이유로 2020년 이후에는 주요 브라우저에서 지원을 중단하였다고 합니다.

 

 

+ Recent posts