20241230 TIL : 이메일 인증 구현하기

MCS·2024년 12월 30일

TIL

목록 보기
34/45

오늘 학습한 내용

  • 이메일 인증 구현하기
    • Gmail SMTP 서비스 설정
    • 의존성 추가 및 application.yml 작성
    • 코드 작성
    • 마무리

이메일 인증 구현하기

Spring Boot에서 Gmail을 통해 이메일 인증을 구현하는 방법을 알아보았다.

Gmail SMTP 서비스 설정

Gmail - 우측 상단 톱니바퀴 - 모든 설정 보기를 클릭한다.
IMAP 사용 설정을 활성화한다.

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

의존성 추가 및 application.yml 작성

다음 의존성을 추가한다.

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

코드 작성

코드는 테스트를 위해 간단하게 작성되었다.

MailConfig

@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 클래스를 작성한다.

MailService

@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자리 숫자+문자를 생성하고, 메일 폼을 생성해 전송한다.

MailDto

@Data
@AllArgsConstructor
@NoArgsConstructor
public class MailDTO {
    private String email;
}

dto(@RequestBody)를 통해 이메일 주소를 받는다.

MailController

@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 처리하는 방식으로 이메일 인증을 끝낼 수 있을 것이다.
최종 프로젝트에서는 회원가입 시 아이디로 이메일을 사용하고, 이메일 중복 체크 -> 인증 이메일 발송 -> 코드를 통해 이메일 인증 -> 인증 완료 시 회원가입 처리 시나리오로 진행 할 예정이다.

profile
백엔드를 잘 하고 싶은 사람

0개의 댓글