일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 무료 오라클 데이터베이스
- oracle 18c
- ORA-00922
- Oracle 테이블 대소문자
- 오라클 캐릭터셋 확인
- 무료 오라클 설치
- Oracle 18c HR
- 오라클 캐릭터셋 변경
- Oracle 18c 설치
- Oracle 사용자명
- Oracle 초기 사용자
- 오라클 캐릭터셋 조회
- Oracle 사용자명 입력
- Oracle Express Edition
- 비전공자를 위한 데이터베이스 입문
- ORA-12899
- oracle
- ora-01722
- Oracle 윈도우 설치
- 서평단
- Oracle 테이블 띄어쓰기
- Oracle 18c HR schema
- Orace 18c
- 윈도우 Oracle
- Today
- Total
The Nirsa Way
[Spring Boot] 이메일 인증 구현 - Naver SMTP 본문
이메일 인증 구현 - 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를 추가하여 유효 시간을 설정하도록 하겠습니다.