회원가입 시 받는 이메일 인증은 사용자 식별 및 보안 강화를 위해 필요한 기능이다. 만약 이메일 인증과 같은 인증기능이 없다면 한 사람이 10개 혹은 1000개의 계정을 무한대로 생성할 수 있다는 것인데, 이는 스팸과 부정 사용, 가짜 리뷰와 평점 조작 등 다른 사용자들의 서비스 품질을 하락시킬 수 있다.
먼저 의존성 추가를 해준다.
implementation 'org.springframework.boot:spring-boot-starter-mail'
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
비밀번호는 구글 이메일의 비밀번호가 아니라, 구글 설정에서 앱 비밀번호를 생성받아야 한다. 해당 설정은 https://hyunmin1906.tistory.com/276 이 링크를 통해 자세히 알 수 있다!
@Service
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail= "메일을 보낼 구글 이메일";
private static int number;
// 랜덤으로 숫자 생성
public static void createNumber() {
number = (int)(Math.random() * (90000)) + 100000; //(int) Math.random() * (최댓값-최소값+1) + 최소값
}
public MimeMessage CreateMail(String mail) {
createNumber();
MimeMessage message = javaMailSender.createMimeMessage();
try {
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");
} catch (MessagingException e) {
e.printStackTrace();
}
return message;
}
public int sendMail(String mail) {
MimeMessage message = CreateMail(mail);
javaMailSender.send(message);
return number;
}
}
private final MailService mailService;
private int number; // 이메일 인증 숫자를 저장하는 변수
// 인증 이메일 전송
@PostMapping("/mailSend")
public HashMap<String, Object> mailSend(String mail) {
HashMap<String, Object> map = new HashMap<>();
try {
number = mailService.sendMail(mail);
String num = String.valueOf(number);
map.put("success", Boolean.TRUE);
map.put("number", num);
} catch (Exception e) {
map.put("success", Boolean.FALSE);
map.put("error", e.getMessage());
}
return map;
}
// 인증번호 일치여부 확인
@GetMapping("/mailCheck")
public ResponseEntity<?> mailCheck(@RequestParam String userNumber) {
boolean isMatch = userNumber.equals(String.valueOf(number));
return ResponseEntity.ok(isMatch);
}
그렇다면 다음과 같이 이메일을 전송받을 수 있다!!
💡 이메일 인증 기능의 중요성을 깨닫고 이렇게 직접 구현까지 해보면서 큰 뿌듯함을 느낄 수 있었다. 제대로 된 앱을 갖춰가는 느낌! 앱에 대한 신뢰성도 올릴 수 있게 되었다. 구현하기까지 생각보다 꽤 시간이 걸렸지만 그럴수록 더욱 더 큰 성취감으로 돌아오는 것 같다. 앞으로의 개발도 화이팅💪
질문있습니다. 위 코드를 그대로 적용하게 되면, 각 사용자의 인증번호를 구분하지 못하는 문제가 발생할거 같은데 맞을까요?