Skip to content

Latest commit

 

History

History
58 lines (39 loc) · 4.91 KB

이메일 발송용 메일 서버 변경 작업.md

File metadata and controls

58 lines (39 loc) · 4.91 KB

이메일 발송용 메일 서버 변경 작업 회고

본 문서는 메일 발송 기능을 MTA에서 AWS SES로 변경하는 작업에 대한 회고록입니다.

서버 스펙 : AWS EC2 + Ubuntu(22.04) + PHP(7.3) + MariaDB(10.5)

서론

외주 개발로 제작한 자사 서비스를 운영하던 중 사용자 수의 증가로 인해 ReadOnly RDS를 구축하는 과정에서 서비스의 전반적인 기능에 대한 QA를 진행하였고 이내 이메일 기능이 동작하지 않는 것을 발견했습니다.

비밀번호 찾기 시 SMS와 이메일을 통해 임시 비밀번호를 발급받을 수 있도록 구현되어있는 상황에서 시스템상으로는 메일 발송이 성공하였지만 실질적으로 발송이 되지 않는 상황이었습니다.

이메일 발송이 어느 시점부터 실패했는지에 대한 로그가 존재하지 않는 상황으로 다양한 가능성을 확인해야했습니다. 다음은 이메일 발송 로직을 확인하여 도출한 몇 가지 가능성입니다.

  1. 메일 서버 만료
  2. 메일 서버 네트워크 인바운드 제한
  3. 운영 서버 네트워크 아웃바운드 제한
  4. MTA 권한 누락
  5. MTA 미설치 혹은 미가동

메일 서버 확인

가장 먼저 확인한 사항은 메일 서버의 정상 가동 여부였습니다.
기존 로직 확인 시 PHPMailer 라이브러리를 사용하여 카페24 웹메일 호스팅 서버의 SMTP를 통해 메일을 발송하는 상황이었으며 메일 서버의 경로 및 계정이 외주사의 서버 경로 및 계정으로 설정되어 외주사와의 유지보수 계약 해지 후 메일 서버가 만료되면서 메일 발송 기능이 제한된 것으로 추정하였습니다.

MTA 사용

가장 먼저 시도한 방법은 운영 서버 내부에 MTA 프로그램을 설치하여 별도의 메일 서버 없이 메일을 발송하는 방법이었습니다.

메일 발송 기능 자체가 자주 사용되는 기능이 아니므로 서버에 SendMail을 설치하고 PHP의 내장 함수인 mail 함수를 통해 메일 발송 기능을 간단하게 구현하려는 목적이었습니다.

결과적으로 MTA 사용은 실패하였습니다.
PHP의 mail 함수를 사용하여 SendMail로 발송 데이터 전달에 성공했고 이후 해당 데이터가 Queue에 추가되는 것 까지 확인했으나 Queue에 등록된 메일이 발송되지 않는 이슈가 발생하였기 때문입니다.

해당 이슈는 AWS EC2 인스턴스에 의한 것으로 PHP mail 함수의 경우 기본적으로 25번 포트를 사용하게 되는데 AWS의 EC2 인스턴스가 보안상 25번 포트의 아웃바운드를 차단하여 발생한 이슈였습니다. ["]

결국 서버 내부의 MTA를 사용하여 메일 발송 기능 구현 시 포트 변경 및 MTA 설정, 인증 및 암호화 등 예상보다 작업 시간이 길어지게되므로 외부의 메일 서버를 사용하는 것으로 노선을 변경하게됩니다.

SES 사용

외부의 메일 서버를 사용하는 것으로 결정 후 가장 먼저 떠오른 서비스는 SES(Simple Email Service)였습니다.

다른 서비스의 경우 상급자에게 요청을 해야만 사용이 가능했고 SES의 경우 저의 권한만으로 사용이 가능했기 때문입니다.

다음은 SES 서비스 등록 순서입니다.

  1. 설정 시작 항목을 선택하여 SES 생성을 시작합니다.
  2. 메일 발송 시 발송자로 등록할 이메일 주소를 입력합니다.
  3. 메일 발송 시 해당 메일의 신뢰성을 검증하는데 사용하기 위한 도메인을 입력합니다.
  4. SES를 생성한 뒤 등록한 이메일에 발송된 인증 메일을 확인하여 이메일의 소유권을 확인합니다.
  5. 등록한 도메인의 DNS에 제공된 CNAME 레코드를 등록하여 도메인의 소유권을 확인합니다.
  6. 스팸 메일 발송 방지 등을 위해 샌드박스 상태로 생성된 SES 서비스의 프로덕션 액세스를 요청합니다.
  7. SES의 SMTP를 사용하기 위해 IAM에 사용자를 생성합니다.

메일 발송 테스트

기존의 PHPMailer 라이브러리를 사용하여 구현된 로직에서 Host, Port, SMTPSecure, Username, Password를 각각 SES SMTP 엔드포인트, 587(또는 2587)포트, TLS, SMTP IAM UserName, SMTP IAM Password로 변경한 뒤 메일 발송 테스트를 진행합니다.

마치며

메일 서버가 외주 업체의 계정으로 등록되었던 것과 그 것이 계약 해지 전 인수인계가 되지 않았다는 것은 아쉽지만 메일 서버와 그 구조에 대해 더욱 명확하게 인지하고 SES 서비스 경험을 쌓을 수 있었다는 것은 긍정적으로 볼 수 있는 부분입니다.

또한 아무 생각 없이 mail 함수를 사용하여 25번 포트로 암호화되지 않은 데이터를 전송하려 했다는 것을 반성하며 앞으로 보안에 더 많은 관심을 기울여야 할 것 같습니다.