[Spring] 이메일 인증 기능 구현하기

Miin·2023년 9월 17일
5

Spring

목록 보기
2/17
post-custom-banner

회원가입 시 받는 이메일 인증은 사용자 식별 및 보안 강화를 위해 필요한 기능이다. 만약 이메일 인증과 같은 인증기능이 없다면 한 사람이 10개 혹은 1000개의 계정을 무한대로 생성할 수 있다는 것인데, 이는 스팸과 부정 사용, 가짜 리뷰와 평점 조작 등 다른 사용자들의 서비스 품질을 하락시킬 수 있다.


이메일 인증 기능을 구현하기까지 수많은 구글링과 시행착오가 있었지만 구현해냈으니 매우 뿌듯😁

이메일 인증 기능 구현

먼저 의존성 추가를 해준다.

build.gradle

implementation 'org.springframework.boot:spring-boot-starter-mail'

Google SMTP

application.properties

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 이 링크를 통해 자세히 알 수 있다!


MailService

@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;
    }
}

MailController

	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);
    }

그렇다면 다음과 같이 이메일을 전송받을 수 있다!!


💡 이메일 인증 기능의 중요성을 깨닫고 이렇게 직접 구현까지 해보면서 큰 뿌듯함을 느낄 수 있었다. 제대로 된 앱을 갖춰가는 느낌! 앱에 대한 신뢰성도 올릴 수 있게 되었다. 구현하기까지 생각보다 꽤 시간이 걸렸지만 그럴수록 더욱 더 큰 성취감으로 돌아오는 것 같다. 앞으로의 개발도 화이팅💪



아주 큰 도움이 된 참고자료
https://velog.io/@kjh950330/%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%9D%B8%EC%A6%9D-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84

profile
컴퓨터공학전공 학부생 Back-end Developer
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 8월 27일

질문있습니다. 위 코드를 그대로 적용하게 되면, 각 사용자의 인증번호를 구분하지 못하는 문제가 발생할거 같은데 맞을까요?

1개의 답글