- 이메일 인증 구현하기
- Gmail SMTP 서비스 설정
- 의존성 추가 및 application.yml 작성
- 코드 작성
- 마무리
Spring Boot에서 Gmail을 통해 이메일 인증을 구현하는 방법을 알아보았다.
Gmail - 우측 상단 톱니바퀴 - 모든 설정 보기를 클릭한다.
IMAP 사용 설정을 활성화한다.

구글 계정관리 - 보안 - 2단계 인증으로 접속한다.
2단계 인증을 클릭 후 제일 하단에 앱 비밀번호 메뉴를 선택하고, 이름을 적은 후 만들기 버튼을 클릭하여 비밀번호 생성을 완료한다.

다음 의존성을 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-mail'
application.yml에 다음 설정을 추가한다.
#Email 인증
mail:
host: smtp.gmail.com
port: 587
username: "이메일 주소"
password: "초기 설정에서 발급 받은 비밀번호"
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
connectiontimeout: 5000
timeout: 5000
writetimeout: 5000
auth-code-expiration-millis: 1800000
코드는 테스트를 위해 간단하게 작성되었다.
@Configuration
public class MailConfig {
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.gmail.com");
mailSender.setPort(587);
mailSender.setUsername("설정 한 이메일 주소");
mailSender.setPassword("발급 받은 비밀번호");
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.debug", "true");
return mailSender;
}
}
이메일 관련 config 클래스를 작성한다.
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail = "메일을 보낼 구글 이메일";
// 랜덤으로 숫자 생성
private String createNumber() {
Random random = new Random();
StringBuilder key = new StringBuilder();
for (int i = 0; i < 8; i++) { // 인증 코드 8자리
int index = random.nextInt(3); // 0~2까지 랜덤, 랜덤값으로 switch문 실행
switch (index) {
case 0 -> key.append((char) (random.nextInt(26) + 97)); // 소문자
case 1 -> key.append((char) (random.nextInt(26) + 65)); // 대문자
case 2 -> key.append(random.nextInt(10)); // 숫자
}
}
return key.toString();
}
private MimeMessage createMail(String mail, String number) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
message.setFrom(senderEmail);
message.setRecipients(MimeMessage.RecipientType.TO, mail);
message.setSubject("이메일 인증");
String body = "";
body += "<h3>요청하신 인증 번호입니다.</h3>";
body += "<h1>" + number + "</h1>";
body += "<h3>감사합니다.</h3>";
message.setText(body, "UTF-8", "html");
return message;
}
// 메일 발송
public String sendSimpleMessage(String sendEmail) throws MessagingException {
String number = createNumber(); // 랜덤 인증번호 생성
MimeMessage message = createMail(sendEmail, number); // 메일 생성
try {
javaMailSender.send(message); // 메일 발송
} catch (MailException e) {
e.printStackTrace();
throw new IllegalArgumentException("메일 발송 중 오류가 발생했습니다.");
}
return number; // 생성된 인증번호 반환
}
}
랜덤 8자리 숫자+문자를 생성하고, 메일 폼을 생성해 전송한다.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailDTO {
private String email;
}
dto(@RequestBody)를 통해 이메일 주소를 받는다.
@RestController
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@ResponseBody
@PostMapping("/emailCheck") // 이 부분은 각자 바꿔주시면 됩니다.
public String emailCheck(@RequestBody MailDTO mailDTO) throws MessagingException, UnsupportedEncodingException {
String authCode = mailService.sendSimpleMessage(mailDTO.getEmail());
return authCode; // Response body에 값을 반환
}
/emailCheck 엔드포인트를 통해 인증 메일을 발송한다.


실제로 메일이 발송되는 것을 확인할 수 있다.
간단하게 이메일을 발송하는 부분까지만 테스트해보았다.
생성한 인증 번호를 Redis 등에 저장해놓고, 인증 처리 API를 따로 만들어 여기로 요청하면 그 이메일을 verify 처리하는 방식으로 이메일 인증을 끝낼 수 있을 것이다.
최종 프로젝트에서는 회원가입 시 아이디로 이메일을 사용하고, 이메일 중복 체크 -> 인증 이메일 발송 -> 코드를 통해 이메일 인증 -> 인증 완료 시 회원가입 처리 시나리오로 진행 할 예정이다.