본문 바로가기

프로젝트/단어일기장

[단어 일기장] 이메일 인증기능 개발 : Amazon SES

오래된 계획이었던 이메일 인증기능 개발을 드디어 완료하여 그 과정을 간단히 정리했다.

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