관리 메뉴

The Nirsa Way

[Spring Boot] 이메일 인증 구현 - Naver SMTP 본문

Development/Spring Boot

[Spring Boot] 이메일 인증 구현 - Naver SMTP

KoreaNirsa 2025. 8. 5. 13:14
반응형

 

이메일 인증 구현 - Naver SMTP

인증 구현을 위해 네이버 로그인 및 메일로 이동하여 좌측 하단의 환경설정을 클릭합니다.

 

POP3/IMAP 설정을 클릭 후 사용함으로 변경하고 확인을 눌러주세요.

 

저장을 클릭하면 하단에 아래와 같은 정보가 표시됩니다.

 

(선택) 앱 비밀번호를 위해 2단계 인증 및 앱 비밀번호 설정을 진행합니다.

2단계 인증이 안되어 있으신 분들은 "설정"으로 나올텐데, 2단계 인증을 먼저 등록 해주세요.

 

직접 입력은 편하신 대로 입력 후 "생성하기" 버튼을 클릭하면 앱 비밀번호가 생성됩니다. 이제 스프링 부트에서 이메일을 전송할 때 해당 앱 비밀번호를 사용할 예정입니다.

 

스프링 부트로 돌아가 build.gradle에 아래와 같이 의존성을 추가 해주세요.

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail
implementation("org.springframework.boot:spring-boot-starter-mail:3.5.4")

 

application.properties 또는 application.yml에 들어가 아래 내용 중 하나를 입력하세요. properties 버전과 yml 버전을 모두 작성해 두었습니다. 

username에는 네이버 이메일 주소를, 패스워드는 위에서 생성해 두었던 앱 비밀번호를 작성하시면 됩니다.

# .properties
spring.mail.host=smtp.naver.com
spring.mail.port=465
spring.mail.username=your_id@naver.com
spring.mail.password=your_app_password

spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.starttls.enable=false
spring.mail.default-encoding=UTF-8

# .yml
spring:
  mail:
    host: smtp.naver.com
    port: 465
    username: your_id@naver.com 
    password: your_app_password 
    properties:
      mail:
        smtp:
          auth: true
          ssl:
            enable: true
          starttls:
            enable: false

 

이후 컨트롤러는 아래와 같이 간단하게 이메일을 보내는 로직만 추가하겠습니다.

@RestController
@RequestMapping("/api/auth")
@Tag(name = "Auth", description = "회원가입 및 로그인 API")
class AuthController(
    private val authService: AuthService
) {

    @Operation(summary = "이메일 인증", description = "이메일 인증 코드를 전송합니다.")
    @PostMapping("/email")
    fun email(@Valid @RequestBody emailDTO : ReqEmailDTO) : ResponseEntity<String> {
        authService.sendEmailCode(emailDTO);
        return ResponseEntity.ok("success")
    }
}

 

서비스 계층은 다음과 같은 형태로 작성하였습니다. 랜덤 번호를 생성하며 이메일을 전송합니다.

@Service
class AuthServiceImpl(
    private val mailSender: JavaMailSender
) : AuthService {
    override fun sendEmailCode(emailDTO : ReqEmailDTO) {
        val code = generateCode()
        sendEmail(emailDTO.email, code)
    }

    // 랜덤 번호 생성
    private fun generateCode(): String {
        return (100000..999999).random().toString()
    }
    
    // 이메일 전송
    private fun sendEmail(to: String, code: String) {
        val message = SimpleMailMessage().apply {
            setFrom(application.properties에서 작성한 username)
            setTo(to)
            subject = "[서비스명] 이메일 인증 코드"
            text = "요청하신 인증 코드는 [$code] 입니다.\n3분 내에 입력해주세요."
        }
        mailSender.send(message)
    }
}

 

아래와 같이 인증 번호가 오는 것을 확인할 수 있습니다. 이후 응답 코드를 반환하는 형태로 수정하여 프론트에서 해당 인증 번호가 일치하는지 확인하는 로직이 추가적으로 들어가게 되며 환경에 따라 redis 등을 사용하여 유효 시간을 설정할 수 있습니다.

다음 포스팅에서는 redis를 추가하여 유효 시간을 설정하도록 하겠습니다. 

 

반응형