IT 프로젝트/쇼핑몰 만들기 [Spring Boot] 스프링 부트 프로젝트/쇼핑몰 만들기 - SpringBoot Java Mail Sender(이메일 본인 인증)

김태현·2023년 9월 28일
1
post-thumbnail

전 시간에는 로그인 및 회원가입을 구현하였으며 이번에는 회원가입 시 본인인증을 위한 이메일 본인인증 서비스를 개발하였다.

Spring에서 지원하는 JavaMailSender를 이용한 메일 서비스를 구현하였다.

SpringBoot JavaMailSender 구현

1. pom.xml추가

<!-- SpringBoot mailService -->
		    <dependency>
		        <groupId>org.springframework.boot</groupId>
		        <artifactId>spring-boot-starter-mail</artifactId>
		    </dependency>
			

2. application.properties 에 mail관련 코드추가한다.

#mailService
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=gmail주소
spring.mail.password=gmail비밀번호(앱키)
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.auth=true
spring.mail.transport.protocol=smtp
spring.mail.debug=true
spring.mail.default.encoding=UTF-8

3. 구글계정 설정

구글계정은 보안상 2단계인증이 되어있을 시 새로운 앱을 선택하여 앱보안번호를 받는다.

보안-> 2단계인증 설정(2단계 인증이 안되어있을 시 보안설정 안됨.)


앱 비밀번호 설정


사용할 앱 이름을 설정 후 비밀번호 코드를 받는다.
이 코드를 application.properties의 비밀번호에 넣어야 완료.

4. MailManager 작성

@Component
public class MailManager {
	
	@Value("${spring.mail.username}")
	private String sender;
	
	@Autowired
	private JavaMailSender javaMailSender;
	
	public void send(String sendTo, String sub, String con) throws Exception {
//		HTML 태그 그대로 전송하는 방법
		MimeMessage mimeMessage = javaMailSender.createMimeMessage();
		mimeMessage.setFrom(sender);
		//받는사람
		mimeMessage.addRecipient(RecipientType.TO, new InternetAddress(sendTo));
		mimeMessage.setSubject(sub);
		mimeMessage.setText(con);
		javaMailSender.send(mimeMessage);
		

	}

}

6. 메일로 보낸 인증번호를 검증하기 위해 클라이언트에 저장할 때 보안상 인코드 하여 보내기위해 static SHA256Util인코더 작성

public class SHA256Util {

	/**
	 * SHA-256 암호화 함
	 * @param source 원본
	 * @param salt(String) SALT 값
	 * @return
	 */
	public static String getEncrypt(String source, String salt) {
		return getEncrypt(source, salt.getBytes());
	}
	
	/**
	 * SHA-256 암호화 함
	 * @param source 원본
	 * @param salt(byte[]) SALT 값
	 * @return
	 */
	public static String getEncrypt(String source, byte[] salt) {
		
		String result = "";
		
		byte[] a = source.getBytes();
		byte[] bytes = new byte[a.length + salt.length];
		
		System.arraycopy(a, 0, bytes, 0, a.length);
		System.arraycopy(salt, 0, bytes, a.length, salt.length);
		
		try {
			// 암호화 방식 지정 메소드
			MessageDigest md = MessageDigest.getInstance("SHA-256");
			md.update(bytes);
			
			byte[] byteData = md.digest();
			
			StringBuffer sb = new StringBuffer();
			for (int i = 0; i < byteData.length; i++) {
				sb.append(Integer.toString((byteData[i] & 0xFF) + 256, 16).substring(1));
			}
			
			result = sb.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
		return result;
	}
	
	/**
	 * SALT를 얻어온다.
	 * @return
	 */
	public static String generateSalt() {
		Random random = new Random();
		
		byte[] salt = new byte[8];
		random.nextBytes(salt);
		
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < salt.length; i++) {
			// byte 값을 Hex 값으로 바꾸기.
			sb.append(String.format("%02x",salt[i]));
		}
		
		return sb.toString();
	}
	
}

7. view에서 보내는 요청을 처리하는 Controller 작성

//email인증
	@PostMapping("/sendMail") // 
    @ResponseBody  //AJAX후 값을 리턴하기위해 작성
    public String SendMail(String email) throws Exception {
        UUID uuid = UUID.randomUUID(); // 랜덤한 UUID 생성
        String key = uuid.toString().substring(0, 7); // UUID 문자열 중 7자리만 사용하여 인증번호 생성
        String sub ="인증번호 입력을 위한 메일 전송";
        String con = "인증 번호 : "+key;
        mailManager.send(email,sub,con);
        key = SHA256Util.getEncrypt(key, email);
        return key;
    }
	@PostMapping("/checkMail") // 
    @ResponseBody  
    public boolean CheckMail(String key, String insertKey,String email) throws Exception {
        insertKey = SHA256Util.getEncrypt(insertKey, email);
        
        if(key.equals(insertKey)) {
        	return true;
        }
        return false;
    }

구현화면

회원가입중 인증번호 요청시 해당 메일로 인증번호가 간 것을 볼 수 있다.

profile
주니어개발자

0개의 댓글

관련 채용 정보