Spring(Java) 이메일 인증 구현(with Google)

구글 설정 및 Spring 이메일 인증 구현

Nodemailer를 사용해서 이메일 보내기를 구현하려고 하다가… 🤔
작년에 Notion에 작성해 놓은 글과 정보가 겹쳐서 먼저 올려보았습니다.

📥 간단 이메일 인증

1. 인증 정보 세팅

🙅‍♂️ a. (비추천) 보안 수준이 낮은 앱의 엑세스 허용하기

보안 수준이 낮은 앱의 엑세스 해당 링크를 통해서 앱 허용을 해주셔야 합니다.

해당 설정을 사용하지 않으면 아래와 같이 오류가 발생 됩니다. 😓

Authentication failed; … Username and Password not accepted.


🤔 의문이 새롭게 계정을 생성해서 같은 곳으로 들어가면…

사용할 수 없다고 나오게 됩니다. 😓 인증을 해야 되는건가? 싶네요. → 2차 인증을 해도 안됨

보안 수준이 낮은 앱 및 Google 계정 링크
결국 로그인을 해서 메일을 보내는 구조다 보니.. 보안을 위해서 지원을 하지 않는 것 같습니다. 😱

👍 b. (추천) 2차 인증 설정

계정 관리 → 보안 → 2단계 인증을 해줍니다.

인증이 완료 되었다면, 같은 곳의 앱 비밀번호로 들어갑니다.

이제 앱 비밀번호를 생성해줍니다.

  • 앱 선택 → 기타
  • 기기 선택 → 기타(맞춤 이름)
  • 앱 이름 설정생성 버튼을 클릭합니다.

🐶 이제 생성된 기기용 앱 비밀번호를 사용하면 됩니다.

2. Spring(Java) 코드 작성

라이브러리 추가

implementation 'org.springframework.boot:spring-boot-starter-mail'
  • MailSender 인터페이스
    • 간단한 이메일을 보내기 위한 기본 기능을 제공하는 최상위 클래스
  • JavaMailSender 인터페이스
    • MailSender의 하위 인터페이스
    • MIME 메시지를 지원하며 대부분의 MimeMessge를 생성을 위해 MimeMessageHelper 클래스와 함께 사용
    • 이 인터페이스와 함께 MimeMessagePreparator 메커니즘을 사용하는 것이 좋다.
  • JavaMailSenderImpl 클래스
    • JavaMailSenderMimeMessage 및 SimpleMailMessage 인터페이스 의 구현을 제공합니다.
  • SimpleMailMessage 클래스
    • 보낸 사람, 받는 사람, 참조, 제목 및 텍스트 필드를 포함하는 간단한 메일 메시지를 만드는 데 사용
  • MimeMessagePreparator 인터페이스
    • MIME 메시지 준비를 위한 콜백 인터페이스를 제공합니다.
  • MimeMessageHelper 클래스
    • MIME 메시지 생성을 위한 도우미 클래스입니다.
    • HTML 레이아웃의 이미지, 일반적인 메일 첨부 파일 및 텍스트 콘텐츠에 대한 지원을 제공합니다.

설정 파일 작성

spring:
  application:
    name: spring-email
  mail:
    host: smtp.gmail.com
    port: 587
    username: ${SMTP_EMAIL}    
    password: ${SMTP_PASSWORD} # 2차 인증 방법이면 앱 비밀번호!
    properties:
      mail:
        smtp:
          starttls:
            enable: true
            required: true
          auth: true
          connectiontimeout: 5000
          timout: 5000
          writetimeout: 5000
  • connectiontimeout, timout, writetimeout : 무한 대기 상태를 피하기 위한 시간 설정

이메일 서비스 생성 및 사용

  1. 이메일 서비스 생성
     @EnableAsync
     @RequiredArgsConstructor
     @Service
     public class EmailService {
       private final JavaMailSender javaMailSender;
        
       @Async
       public void send(String email, String authToken) {
         SimpleMailMessage smm = new SimpleMailMessage();
         smm.setTo(email);
         smm.setSubject("회원가입 이메일 인증");
         smm.setText("http://localhost:8080/api/users/confirm-email?email=" + email + "&authToken=" + authToken);
        
         javaMailSender.send(smm);
       }
     }
    
    • email : 사용되는 이메일을 등록
    • authToken : UUID를 사용
  2. 이제 메일을 보내게 되면 다음과 같이 이메일이 발송 됩니다.

    해당 링크로 요청을 통해서 인증 처리를 하게 되는 것이죠.

🤔 추후 고려해볼만한 대안

두 번째 방법 - AWS SES(Simple Email Service) 사용
→ 단점으로는 하나의 관리 대상인 리소스가 더 생긴다는 점이 있습니다.

🔖 참고 사이트


© 2021. All rights reserved.

Powered by Hydejack v9.1.6