현재 진행중인 팀프로젝트에서 회원가입/로그인 관련 파트를 담당하게 되었다.
덕분에 지난번 개인PJT에서 했던 비밀번호 암호화도 이번 팀PJT에서 야무지게 써먹었다😁
오늘 새롭게 해볼 것은 회원가입 시 이메일 인증!
보통 회원가입 시에 이메일 인증하는 방법은 2가지가 있다.
1. 이메일로 인증번호를 전송한 후 사용자가 인증번호를 입력하면 인증 완료
2. 이메일로 보낸 링크를 통해 접속하면 자동으로 인증 완료
사용자 입장에서 생각하자면 2번 방법이 더 편하겠지만, 2번 방법을 사용하면 현재 프로젝트 상황 상 DB에 대한 수정이 필요해서 (그리고 아직 나에게는 조금 어렵게 다가온다..) 1번 방법으로 진행해보려 한다.
팀계정을 구글로 만들었기 때문에 이메일 인증 역시 구글을 통해 진행할 예정이다.
🔗2번 방법에 대해 잘 설명된 블로그 (나중에 2번 방법을 시도해볼 때 참고해야지!)
https://gilssang97.tistory.com/60
구글 계정 2단계 인증 및 앱 비밀번호 생성
구글 계정으로 이메일을 발신할 때는 구글 계정 2단계 인증을 통해서 앱 비밀번호를 생성해야 한다고 한다.
(이전 블로그들을 살펴보니 예전에는 '보안 수준이 낮은 앱의 액세스'를 허용하도록 설정한 후에 바로 진행했던 것 같은데, 2022년 5월부터 해당 기능을 사용할 수 없도록 중단되었다고 한다.)
1) 우선 팀 구글계정으로 로그인하고 구글 계정 설정 > 2단계 인증 진행했다.
2) 2단계 인증 완료하면 앱 비밀번호를 생성해준다.
다음과 같이 앱은 '메일', 기기는 'Windows 컴퓨터'로 설정해줬다.
가장 오른쪽에 보이는 화면이 앱 비밀번호 생성 완료 화면.
SpringBoot에서 이메일 보내기
구글 계정에서 필요한 설정을 마쳤으니 본격적으로 SpringBoot를 건드려보자.
✅ pom.xml 의존성 추가
이메일 발송을 위해 Spring Boot Starter Mail의 dependency를 추가해준다.
<!-- 이메일 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
✅ application.properties
SMTP를 위한 설정을 추가해준다.
# Email Authentication
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=[이메일 발송할 구글 메일 계정]
spring.mail.password=[아까 발급받은 앱 비밀번호]
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.starttls.enable=true
📌 SMTP란?
Simple Mail Transfer Protocol(간이 우편 전송 프로토콜), 즉 이메일 전송에 사용되는 네트워크 프로토콜이다. 이 프로토콜을 사용하기 위해 어떤 포트를 사용할지 등등의 필요한 설정들을 위에서 해준 것이다!
구글, 네이버 메일에서 직접 설정하는 방법도 있는 듯하다. 나중에 필요하게 되면 참고해보자!
구글 Gmail SMTP 설정 방법
Gmail 에서 아웃룩이나 다른 전자 메일 프로그램을 통해 메일을 보낼 수 있도록 하기 위해 Gmail SMTP(Simple Mail Transfer Protocol) 설정에 대해서 알려드리겠습니다. Gmail 기본 SMTP 설정 SMTP 서버 : smtp.gmail.
privatenote.tistory.com
[Spring Boot] 이메일 인증 회원가입하기 구현
현재 진행하고 있는 프로젝트에서 사용하고 있는 이메일을 이용해 회원가입을 진행할 수 있도록 구현했습니다. 네이버, 구글, 다음 등의 가입되어있는 이메일을 이용하여 해당 이메일로 인증번
javaju.tistory.com
✅ EmailController.java
package com.yangkids.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.yangkids.model.service.EmailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@RestController
@RequestMapping("/api-email")
@Api(tags = "Email 컨트롤러")
//@CrossOrigin("*")
public class EmailController {
@Autowired
EmailService emailService;
@PostMapping("/emailSend")
@ApiOperation(value = "회원가입 시 인증코드가 담긴 이메일 보내기")
public ResponseEntity<?> emailSend(String email) throws Exception {
// 이메일 발신
String ePW = emailService.sendSimpleMessage(email);
// 인증코드 반환
return new ResponseEntity<String>(ePW, HttpStatus.OK);
}
}
✅ EmailService.java (인터페이스)
package com.yangkids.model.service;
public interface EmailService {
String sendSimpleMessage(String to) throws Exception;
}
✅ EmailServiceImpl.java (구현체)
package com.yangkids.model.service;
import java.util.Random;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class EmailServiceImpl implements EmailService {
@Autowired
JavaMailSender javaMailSender;
@Override
public String sendSimpleMessage(String to) throws Exception {
// 인증코드 생성하기
String ePw = createKey();
// 이메일으로 보낼 메세지 준비
String msgg = "";
msgg += "<div style='margin:100px;'>";
msgg += "<h1> 안녕하세요👋 YangKids입니다. </h1>";
msgg += "<br>";
msgg += "<p>🌟YangKids에 오신 것을 환영합니다🌟<p>";
msgg += "<br>";
msgg += "<p>아래 인증 코드를 회원가입 창으로 돌아가 입력해주세요!<p>";
msgg += "<br>";
msgg += "<p>감사합니다💕<p>";
msgg += "<br>";
msgg += "<div align='center' style='border:1px solid black; font-family:verdana';>";
msgg += "<h3 style='color:#6464FF;'>회원가입 인증 코드입니다.</h3>";
msgg += "<div style='font-size:130%'>";
msgg += "CODE : <strong>";
msgg += ePw + "</strong><div><br/> ";
msgg += "</div>";
// 이메일 발신될 데이터 적재
MimeMessage message = javaMailSender.createMimeMessage();
message.addRecipients(RecipientType.TO, to); // 보내는 대상
message.setSubject("YangKids 회원가입 이메일 인증📧"); // 제목
message.setText(msgg, "utf-8", "html"); // 내용
message.setFrom(new InternetAddress("ssafy9yangkids@gmail.com", "YangKids"));// 보내는 사람
// 이메일 발신
javaMailSender.send(message);
// 인증코드 일치 여부를 비교하기 위해 인증코드 반환
return ePw;
}
public static String createKey() {
StringBuffer key = new StringBuffer();
Random rnd = new Random();
for (int i = 0; i < 8; i++) { // 인증코드 8자리
int index = rnd.nextInt(3); // 0~2 까지 랜덤
switch (index) {
case 0:
key.append((char) ((int) (rnd.nextInt(26)) + 97));
// a~z (ex. 1+97=98 => (char)98 = 'b')
break;
case 1:
key.append((char) ((int) (rnd.nextInt(26)) + 65));
// A~Z
break;
case 2:
key.append((rnd.nextInt(10)));
// 0~9
break;
}
}
return key.toString();
}
}
실행 결과
swagger에서 실행해보았다.
사용자의 이메일을 입력하고 execute 해보면 이메일을 보낸 후 인증 코드를 반환값으로 돌려준다. 추후에 사용자가 입력한 인증코드와 비교해서 일치여부를 확인하기 위해 인증 코드를 반환하도록 했다.
팀계정의 보낸 메일함
개인 계정의 받은 메일함
이렇게 해서 회원가입 시 인증코드를 통해 이메일 인증하기를 위한 이메일 발송을 구현해봤다.
실제로 메일이 발송되는 것을 보니 조금 신기할지도ㅎㅎ
앞으로 만들어나가야 할 것이 많긴 하지만 한 걸음 나아간 것만 해도 뿌듯하다~~!!👍
참고 블로그
[Spring Boot] 이메일 인증 회원가입하기 구현
현재 진행하고 있는 프로젝트에서 사용하고 있는 이메일을 이용해 회원가입을 진행할 수 있도록 구현했습니다. 네이버, 구글, 다음 등의 가입되어있는 이메일을 이용하여 해당 이메일로 인증번
javaju.tistory.com
[SpringBoot] 구글 SMTP 통해 메일 보내기
개요 회원 가입 이후 이메일 인증을 한 사용자에게만 서비스 접근을 할 수 있도록 구현하고 싶어 찾아본 결과 구글에서 제공하는 SMTP 서비스를 통해 비교적 쉽게 구현할 수 있었습니다. 단, 구글
jaimemin.tistory.com
[SpringBoot] 이메일 발신하기
안녕하세요. J4J입니다. 이번 포스팅은 이메일 발신하는 방법에 대해 적어보는 시간을 가져보려고 합니다. 구글 계정 2단계 인증하기 해당 글은 이메일을 발신할 때 구글 계정을 활용하여 상대방
jforj.tistory.com