Project/mo:rack (익명 커뮤니티)

Google SMTP로 이메일 인증 구현하기

창브로 2025. 6. 5. 19:56

회원 가입을 할 때 없는 이메일을 사용하거나 이메일 중복가능하게 하면 이메일을 받는 이유도 없고

너무 악용할 가능성이 많다고 생각해서 이메일 인증을 도입하기로 했다.

 

많은 기능 중에 Google SMTP를 사용하기로 한 이유는

설정도 간편하다고 생각했고 무료이면서 안정적인 기술이기 때문이다.

 

또한 구글 인프라 위에서 놀기 때문에 전송 안정성과, 보안 수준이 높다.

 

일단 메일을 발송할 Gmail에 로그인해서 계정 설정 -> (검색) 앱 비밀번호 -> 앱 비밀번호 발급을 진행하여 앱 비밀번호를 받고

 

 

SMTP를 사용하기 위한 의존성을 추가해 준다.

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

 

 

그리고 properties에서 Gmail SMTP를 사용하기 위한 설정을 한다.

 

아래는 예시!

 

# 이메일을 보낼 SMTP 서버 주소. Gmail을 사용하니 이렇게 설정
spring.mail.host=smtp.gmail.com

# SMTP 서버 포트 번호. TLS를 사용할 경우 일반적으로 587 사용
spring.mail.port=587

spring.mail.username=your-email

spring.mail.password=비밀번호 아니고 앱 비밀번호!!!

# SMTP 서버 인증 사용 여부 (Gmail은 반드시 필요)
spring.mail.properties.mail.smtp.auth=true

# STARTTLS(보안 연결을 위한 프로토콜) 사용 여부. 이메일 내용 암호화.
spring.mail.properties.mail.smtp.starttls.enable=true

# STARTTLS가 반드시 필요하다는 설정 (TLS 없으면 전송 차단)
spring.mail.properties.mail.smtp.starttls.required=true

 

 

그리곤 EmailService를 만들고

레디스에 값을 넣고 뺄 수 있도록 구현한 RedisService, User정보를 DB에서 가지고 올 수 있는 UserRepository와

자바에서 제공하는 JavaMailSender를 추가한다.

 

    private final UserRepository userRepository;
    private final RedisService redisService;
    private final JavaMailSender mailSender;

 

이메일 전송하는 함수를 구현해 보자!

 

 // 이메일 검증 코드 전송
    public void sendAuthCode(String email) {
        String authCode = createAuthCode();
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(email);
        message.setSubject("[모락(morak)] 이메일 인증 코드입니다.");
        message.setText("인증번호: " + authCode + "\n인증번호를 입력창에 입력해주세요.");

        try {
            mailSender.send(message);
        } catch (Exception e) {
            log.error("[이메일 전송 실패] email: {}, message: {}", email, e.getMessage(), e);

            throw new IllegalStateException("이메일 전송에 실패했습니다. 나중에 다시 시도해주세요.");
        }

        // 성공 시 Redis 저장
        redisService.setValue("email_auth:" + email, authCode, Duration.ofMinutes(3));
    }

 

 

생각보다 별거 없다.

일단 저는 6자리 랜덤 함수를 만드는 createAuthCode를 구현했고 그걸로 검증 코드를 생성했다.

 

생성하고 JavaMailSender에서 제공해 주는 SimpleMailMessage를 생성한다.

 

보낼 이메일을 제공하는 메서드를 통해 넣고

제목과 내용을 적는다.

 

그리고 메시지를 전송한 후 성공하면 redis에

key -> email_auth:(수신자 이메일) 

value -> authCode

로 저장이 되는 코드다!

 

그럼 이제 Controller를 통해 전송해 보자

 

나는 이런 식으로 구현했다

@PostMapping("/send-email")
public ResponseEntity<ResponseDto<Void>> sendEmail(@RequestParam String email) {
    emailService.sendAuthCode(email);

    return ResponseEntity.status(HttpStatus.CREATED)
        .body(new ResponseDto<>("이메일 인증번호 전송 성공", null));
}

 

 

포스트맨 통해서 보내볼까요??

 

 

네 보내졌다곤 하네요

 

확인해 봐야겠죠?

 

 

 

 

거짓말이 아니었네요 ~~

 

Redis에 잘 있나 확인해 볼까요?

 

 

 

이제 레디스에서 찾아서 맞는지 검증하고 하면 되겠죠?!

또 다른 기능 구현하다가 정리하러 올게요~~!