[Spring] Spring Boot 이메일 인증 구현하기 + Redis (1)

2024. 1. 25. 20:03· Spring
목차
  1. 들어가기
  2. 💡 Google SMTP
  3. ✔️ Google SMTP 계정 설정
  4. 💡 이메일 인증 요청 API 구현하기
  5. 1. build.gradle
  6. 2. application.yml
  7. 3. EmailConfig
  8. 4. EmailService
  9. 5. EmailController
  10. 6. 결과 확인하기
  11. 출처

 

 

 

 

들어가기

SpringBoot와 Redis를 사용해서 이메일 인증하는 API를 구현하려고 한다.

차근차근 시작해보자 !!

 

 

 

 

 

💡 Google SMTP


본 포스팅에서는 Google SMTP를 사용할 것이다.

SMTP(Simple Mail Transfer Protocol)란?
: 전자 메일 전송을 위한 표준 프로토콜이다. 즉, 인터넷에서 이메일을 전송하기 위해 사용되는 프로토콜이다.

Google SMTP는 구글에서 구글 계정만 있으면 무료로 메일을 발송할 수 있도록 제공해 주는 서버이다.

이메일 인증 코드를 전송해 주는 API를 위해 Google SMTP를 사용할 것이다.

 

 

먼저, SMTP를 사용할 구글 계정을 설정해주어야 한다.

 

 

✔️ Google SMTP 계정 설정

구글 계정에 로그인한 후, Google 계정 관리에 들어가서 검색창에 앱 비밀번호를 검색한다.

* 2단계 인증이 진행된 후에 설정할 수 있다. 2단계 인증을 하지 않았다면 먼저 인증하고 나서 하자!

앱 비밀번호 검색하기

 

앱 비밀번호를 검색하면 아래와 같은 화면이 나올 것이다. 여기에 앱 이름을 작성한다. 

앱 이름 설정하기

 

앱 이름을 만들면 앱 비밀번호가 생성될 것이다. 복사해서 잘 보관해 두자!

앱 비밀번호는 외부에 노출되어서는 절대절대 안 된다. 주의!!

앱 비밀번호 확인

 

비밀번호를 잘 보관한 후에, Gmail -> 설정 -> 전달 및 POP/IMAP 탭에 들어간다.

아래와 같이 POP 설정을 하고, IMAP를 사용하도록 설정한다.

 

 

여기까지 구글 계정 설정은 끝이다!

 

 

 

 

 

💡 이메일 인증 요청 API 구현하기


구글 계정 설정을 잘 마쳤다면 이제 Spring Boot를 통해 API를 구현해 보자.

 

1. build.gradle

이메일 전송을 위해 Spring boot에서 지원해주는 mail 의존성을 추가한다.

// 이메일 전송을 위한 의존성
implementation 'org.springframework.boot:spring-boot-starter-mail'

 

 

2. application.yml

spring:
    mail:
    host: smtp.gmail.com
    port: 587
    username: 구글 계정
    password: 구글 앱 비밀번호
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
  • host : Gmail의 SMTP 서버 호스트
  • port : SMTP 서버의 포트 번호로, Google은 587을 사용한다.
  • username : Google SMTP 설정한 구글 아이디
  • password : Google SMTP 설정에서 발급받은 앱 비밀번호
  • properties : 이메일 구성에 대한 추가 설정들
  • auth : SMTP 서버에 인증을 요구하면 true로 설정해야 한다. Gmail SMTP 서버는 인증을 요구하기 때문에 true로 설정한다.
  • enable : SMTP 서버가 TLS(데이터를 암호화하여 안전한 전송을 보장하는 프로토콜)를 사용하면 true로 설정한다.

 

 

3. EmailConfig

@Configuration
public class EmailConfig {

    @Value("${mail.host}")
    private String host;

    @Value("${mail.port}")
    private int port;

    @Value("${mail.username}")
    private String userName;

    @Value("${mail.password}")
    private String password;

    @Value("${mail.properties.mail.smtp.auth}")
    private boolean smtpAuth;

    @Value("${mail.properties.mail.smtp.starttls.enable}")
    private boolean starttlsEnable;

    @Value("${mail.properties.mail.smtp.starttls.required}")
    private boolean starttlsRequired;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost(host);
        javaMailSender.setPort(port);
        javaMailSender.setUsername(userName);
        javaMailSender.setPassword(password);
        javaMailSender.setJavaMailProperties(getMailproperties());
        javaMailSender.setDefaultEncoding("UTF-8");

        return javaMailSender;
    }

    private Properties getMailproperties() {
        Properties properties = new Properties();

        properties.put("mail.smtp.auth", smtpAuth);
        properties.put("mail.smtp.starttls.enable", starttlsEnable);
        properties.put("mail.smtp.starttls.required", starttlsRequired);

        return properties;
    }
}

 

 

4. EmailService

@Slf4j
@Service
public class EmailService {

    private final JavaMailSender javaMailSender;

    private String emailCode;

    public EmailService(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    @Transactional(readOnly = false)
    public DataResponse<DataResponseCode> sendMail(String receiver) {
        try {
			emailCode = createKey();
            MimeMessage message = createMessage(receiver);

            javaMailSender.send(message);

            return new DataResponse<>(UserSignUpResponseCode.SUCCESS);
        } catch (MessagingException | UnsupportedEncodingException | MailException e) {
            e.printStackTrace();
            return new DataResponse<>(UserSignUpResponseCode.MAIL_SEND_FAILED);
        }
    }

    /**
     *  메일 내용 작성
     */
    private MimeMessage createMessage(String receiver) throws MessagingException, UnsupportedEncodingException {
        MimeMessage message = javaMailSender.createMimeMessage();

        message.addRecipients(Message.RecipientType.TO, receiver);
        message.setSubject("인증코드 안내");

        StringBuilder mailMsg2 = new StringBuilder();
        mailMsg2.append("<div>");
        mailMsg2.append("인증코드를 확인해주세요.<br><strong style=\"font-size: 30px;\">");
        mailMsg2.append(emailCode);
        mailMsg2.append("</strong><br>이메일 인증 절차에 따라 이메일 인증코드를 발급해드립니다.<br>인증코드는 이메일 발송 시점으로부터 3분동안 유효합니다.</div>");

        message.setText(mailMsg2.toString(), "utf-8", "html");
        message.setFrom(new InternetAddress("myApp", "MY APP"));

        return message;
    }

    /**
     *  메일 인증 코드 생성
     */
    private static String createKey() {
        StringBuilder key = new StringBuilder();

        Random random = new Random();

        for (int i = 0; i < 6; i++) {
            int index = random.nextInt(10);
            key.append(index);
        }

        return key.toString();
    }
}

 

 

5. EmailController

@RestController
@RequestMapping("/api/v1/mail")
public class EmailController {

    private final EmailService emailService;

    public EmailController(EmailService emailService) {
        this.emailService = emailService;
    }

    @GetMapping(name = "이메일 전송")
    public DataResponse<DataResponseCode> sendMail(@RequestParam("receiver") String receiver) {
        DataResponse<DataResponseCode> response = emailService.sendMail(receiver);
        return response;
    }

}

 

 

6. 결과 확인하기

API 테스트를 해보면 아래와 같이 정상적으로 메일이 전송되는 것을 확인할 수 있다.

 

 

 

 

다음 포스팅에서 Redis로 인증코드 만료 로직을 처리하는 코드를 추가할 것이다!

 

 

 

 

출처

  • Spring - 이메일 인증 구현해보기
  • 이메일 인증받기 (1)

 

 

 

긴 글 읽어주셔서 감사합니다 🍀

잘못 작성된 내용은 피드백 주시면 반영하겠습니다 😎

 

 

'Spring' 카테고리의 다른 글

[Spring] 스프링 배치(Spring Batch)란? Spring Batch + Scheduler 예제  (0) 2025.03.20
[Spring] Spring Boot 이메일 인증 구현하기 + Redis (2)  (1) 2024.01.28
[Spring] Spring Security와 Filter Chain  (0) 2024.01.10
[Spring] Spock 프레임워크  (0) 2023.12.29
[Spring] Spring MVC 와 MVC2  (0) 2023.12.17
  1. 들어가기
  2. 💡 Google SMTP
  3. ✔️ Google SMTP 계정 설정
  4. 💡 이메일 인증 요청 API 구현하기
  5. 1. build.gradle
  6. 2. application.yml
  7. 3. EmailConfig
  8. 4. EmailService
  9. 5. EmailController
  10. 6. 결과 확인하기
  11. 출처
'Spring' 카테고리의 다른 글
  • [Spring] 스프링 배치(Spring Batch)란? Spring Batch + Scheduler 예제
  • [Spring] Spring Boot 이메일 인증 구현하기 + Redis (2)
  • [Spring] Spring Security와 Filter Chain
  • [Spring] Spock 프레임워크
코냥이
코냥이
코딩하는 고냥이
코냥이
코냥이의 하루
코냥이
전체
오늘
어제
  • 분류 전체보기 (28)
    • 코냥이의 하루 (0)
    • Spring (6)
    • JPA (4)
    • Server (1)
    • Database (2)
    • Network (5)
    • 자료구조 (2)
    • Kotlin (1)
    • Git (2)
    • ETC (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 무중단 배포
  • spring data jpa
  • 1차 캐시
  • 토큰 인증 방식
  • 카나리
  • google smtp
  • Filter Chain
  • 데이터베이스 마이그레이션
  • 인증코드 만료
  • 배열
  • 블루그린
  • 배포 전략
  • DNS 레코드
  • Redis
  • 서버 인증 방식
  • 데이터베이스 방언
  • flyway
  • git
  • JPA
  • 2차 캐시

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
코냥이
[Spring] Spring Boot 이메일 인증 구현하기 + Redis (1)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.