-
시작하며
더보기플래시 세일(Flash Sale)을 주제로 프로젝트를 진행하고 있다. msa로 진행되고 있는데 그 중 알람 서비스도 맡게 되어, 플래시 세일 1시간 전 사용자가 알림 설정한 상품에 대해 메일을 발송하는 기능을 구현해야 했다.
먼저 메일이 어떤 원리로 전송이 되는지 대략적으로 정리하고, 어떤식으로 구현할 건지 간략하게 얘기해보겠다.
1. 이메일 시스템의 주요 구성 요소
이메일 발송 과정에서 핵심적으로 사용되는 구성 요소는 크게 3가지로 나뉜다. 이메일 클라이언트(MUA), 메일 서버(MTA), 메일 수신 서버(POP3, IMAP)이다.
이메일 클라이언트 (Mail User Agent)
이메일 클라이언트는 사용자가 이메일을 작성하고 발송하는 소프트웨어다. 흔히 사용되는 Gmail 등의 애플리케이션이 이에 해당한다. 클라이언트는 작성한 이메일을 메일 서버로 전달하며, 발송 과정에서 SMTP프로토콜을 사용한다.
메일 서버 (Mail Transfer Agent)
메일 서버는 이메일을 실제로 처리하고 전달하는 역할을 한다. 메일 서버는 발신자의 메일 서버와 수진자의 메일 서버로 나뉘며, 이 두 서버는 이메일 전송을 위해 서로 통신한다.
예를 들어, A가 Gamil로 B의 Naver mail에 메일을 보낸다고 하면, 구글의 메일 서버와 네이버의 메일 서버가 통신한다.
POP3, IMAP → 수신자의 메일 서버(MTA)에서 사용
수신된 이메일은 POP3나 IMAP 프로토콜을 통해 사용자에게 전달된다. 수신자는 이 서버에 접속하여 이메일을 다운로드(POP3)하거나 서버에서 직접 확인(IMAP)할 수 있다.
- POP3
수신자의 클라이언트에서 이메일을 MTA에서 다운로드한 후, 기본적으로 서버에서 삭제된다.
주로 단일 디바이스에서 이메일을 관리할 때 사용한다. - IMAP
이메일을 서버에 그대로 남겨두고, 여러 디바이스에서 이메일을 동기화할 수 있다.
여러 기기에서 이메일을 확인하는 경우 적합하다.
2. 메일 발송을 위한 프로토콜
이메일을 발송할 때 사용되는 핵심 프로토콜은 SMTP(Simple Mail Transfer Protocol)이다. 클라이언트가 메일 서버에 이메일을 전송하고, 메일 서버 간 이메일을 전송하는 표준 프로토콜이다.
SMTP의 작동 원리
SMTP는 클라이언트-서버 모델로 작동하며, 클라이언트가 서버에게 이메일을 보내면 서버는 이를 수신자의 메일 서버로 전송하는 역할을 한다.
또한, 통신은 명령어와 응답 코드로 이루어지는데, 이 부분은 추후에 다룰 기회가 있으면 자세하게 다뤄보겠다.
3. 이메일 발송의 단계별 과정
[발신자 클라이언트]
사용자가 이메일 클라이언트에서 이메일을 작성하고, 전송 버튼을 누르면 SMTP프로토콜을 통해 이메일이 발신자의 메일 서버로 전송된다. SMTP는 포트 25에서 작동한다.
[발신자 메일 서버]
사용자의 이메일 클라이언트로부터 받은 이메일은 발신자의 메일 서버(MTA)로 전송된다. MTA는 수신자의 이메일 주소를 분석하여 해당 이메일이 어떤 도메인으로 가야 하는지 확인한다.
DNS를 사용해 수신자의 도메인에 연결되 MX 레코드(Mail Exchange Record)를 조회한다. 이는 해당 도메인에서 메일을 수신할 수 있는 메일 서버의 정보를 포함하고 있다. 특히 IP 주소가 포함되어 있어, 이를 통해 발신자의 메일 서버는 수신자의 메일 서버로 연결할 수 있다.
[릴레이 서버]
이메일이 발신자의 메일 서버에서 수신자의 메일 서버로 전달될 때, 직접 전송이 될 수도 있지만, 여러 중간 서버를 거칠 수도 있다. 중간 서버를 릴레이 서버라고 하는데, 이 부분은 생략하겠다.
[수신자 메일 서버]
이메일이 수신자의 MTA에 도달하면, 수신자 MTA의 MDA(Mail Delivery Agent)는 이메일을 최종적으로 수신자의 메일함으로 전달한다. 이때 이메일은 수신자의 MTA에 저장된다.
[수신자 클라이언트]
이제 수신자는 자신의 이메일 클라이언트를 통해 메일 서버에 접속하여 이메일을 확인할 수 있다. 이때 이메일을 확인하는 방식에 따라 POP3, IMAP을 선택하게 되는데, 요즘은 거의 IMAP이 사용된다.
4. SMTP의 보안 강화 기술
SMTP는 인터넷이 비교적 작고 신뢰할 수 있는 환경에서 설계된 메일 전송 프로토콜이었기 때문에 보안이나 인증 측면이 약했다고 한다. 즉 서버 간에 신뢰를 전제로 설계되어 별도의 인증 없이도 메일을 주고받을 수 있었다. 하지만, 인터넷 환경이 복잡해지고 악의적인 사용자가 늘어남에 따라, 현대의 SMTP는 여러 보안 기술을 통해 신뢰 기반의 취약점을 보완하고 있다고 한다.
물론 우리가 흔히 쓰는 구글이나 네이버에서 보안관련 설정을 해주기 때문에 우리가 핸들링할 상황은 거의 없을 것 같지만, 그래도 어떤식으로 보안을 강화했는지 간단하게 정리해 보겠다.
- SPF (Sender Policy Framework)
발송자가 인증된 메일 서버를 통해 이메일을 보냈는지 검증한다. - DKIM (DomainKeys Identified Mail)
이메일 본문에 서명하여, 메일이 변경되지 않았음을 보장한다. - DMARC (Domain-based Message Authentication, Reporting & Conformance)
SPF와 DKIM을 함께 사용하여 발송자 신원 확인을 강화하고, 의심스러운 메일에 대해 정책을 설정하는 방법이다. - TLS (Transport Layer Security)
이메일 전송 중에 내용을 암호화하여, 이메일이 가로채지더라도 내용이 보호되도록 한다.
마치며
더보기메일 발송 기능을 구현하기 전 어떤 식으로 작동하는 건지 원리에 대해서 알아보았다. 물론 위에서 적은 내용들 중 내가 핸들링할 사항은 많지 않겠지만, 동작원리 및 전체적인 그림에 대해서 알고 가는 것이 중요하다고 생각하는데 잘 정리가 된 것 같다.
프로젝트 내에서 메일 발송 기능을 어떤식으로 구현할 건지도 적어보려 했으나, 내용이 길어져 다음 글에 써보도록 하겠다.
'회고' 카테고리의 다른 글
토큰 유효성 검사 관련 리팩토링 (0) 2024.10.07 AI 검증 비즈니스 프로젝트 - 로그인 관련 트러블 슈팅 (0) 2024.08.28 AI 검증 비즈니스 프로젝트 2일차 회고(1일차 고민 해결) (0) 2024.08.23 AI 검증 비즈니스 프로젝트 1일차 회고(API, ERD, 테이블, 인프라 명세서 작성) (0) 2024.08.22 - POP3