오래된 계획이었던 이메일 인증기능 개발을 드디어 완료하여 그 과정을 간단히 정리했다.
1. 요약
- 사용자는 하루에 한 번 가입을 시도할 수 있다. 즉, 가입 인증 메일이 한 번만 발송된다.
- 만약 같은 이메일로 여러 번 시도한다면 가입 화면에 ‘(이미 이메일이 발송되었으니) 이메일 인증을 완료하라’는 안내 문구를 출력한다.
- 메일의 내용에는 인증을 완료할 수 있는 링크를 포함하고 클릭 시 회원 가입 처리가 완료된다.
- 자정이 되면 PENDING 상태의 회원 데이터를 CANCELD로 일괄 변경하는 배치를 수행하여 다음 날 사용자가 가입을 재시도할 수 있게 한다. (이 부분 아직 미개발)
2. SES 구성
- Amazon SES에서 이메일을 전송할 때 사용할 도메인을 등록하였다. 그리고 테스트를 위해 개인 이메일도 추가로 등록하여 테스트 이메일 전송하여 이메일이 잘 전송되는지 우선 확인할 수 있다.
3. 로컬 개발환경 구성
- 로컬 환경에서 AWS API를 호출할 용도로 IAM 사용자를 생성하고 액세스 키를 발급 받았다.
- IAM 사용자에는 SESAccess 권한을 부여하였다.
- 그리고 발급된 액세스키와 시크릿 액세스 키는 환경변수에 따로 저장하였다. (경로 : ~/.aws/credentials)
스프링 설정 파일(YAML)에 저장하는 방식은 실수로 키를 노출할 위험이 있어 Amazon에서도 권장하지 않는다.
[AWS-documentation] AWS 기반 Spring Boot 애플리케이션 개발 시작하기 - 인텔리제이를 사용한다면 AWS Toolkit 플러그인을 설치하여 환경변수 파일에 직접 접근하지 않고도 Credential을 좀 더 편리하게 관리할 수 있다.
4. 개발
- Ses클라이언트 빈, 서비스 빈, DTO 클래스로 나누어 개발하는 방식이 보편적이기에 참고하였다.
https://velog.io/@ililil9482/AWS-SESSimple-Email-Service-Java-사용법 - 다만, AccessKey와 SecretAccessKey는 외부 파일에 따로 저장하였기 때문에 Environment에서 설정 정보를 가져오는 로직은 제외하였다.
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.ses.SesClient;
@Configuration
@RequiredArgsConstructor
public class SesConfig {
@Bean
public SesClient sesClient(){
return SesClient.builder()
.region(Region.AP_NORTHEAST_2)
.build();
}
}
5. SES 샌드박스에서 나가기
- 샌드박스 환경에서는 하루 최대 200개의 메시지만 전송 가능 하고 확인된 자격 증명이 아니면 전송 불가능하다. 운영환경에서 SES를 사용하기 위해 프로덕션 액세스 요청을 했다.
[AWS-documentation] Amazon SES 샌드박스 환경에서 나가기 - 요청 제출 시, 사용사례에 대해 구체적으로 정보를 제공해야 하며 검토에는 24시간 조금 안되게 소요된다. 최초 제출할 때 실수로 리전을 버지니아 북부로 해서 신청을 했어서 정정하는데 하루가 더 걸렸다.
6. 운영 배포
- 운영 환경에서는 IAM Role을 사용하여 SES에 접근하게 구성하였다. EC2 프로필에 SESAccess Role을 추가해 주면 SES 서비스에 액세스 할 수 있다.
'프로젝트 > 단어일기장' 카테고리의 다른 글
[단어 일기장] UI/UX 분석 (0) | 2023.07.08 |
---|---|
[단어 일기장] 오픈 (0) | 2023.06.18 |
[단어 일기장] 제작 의도 (1) | 2023.06.14 |