SMTP
해당 문서는 Gemini 를 사용하여 대화한 내용을 요약한 것임을 밝힙니다.
이메일은 현대 인터넷 통신의 근간이며, 그 중심에는 **SMTP(Simple Mail Transfer Protocol)**가 있습니다. 본 포스팅에서는 직접적인 CLI 실습 경험을 바탕으로 SMTP의 동작 메커니즘과 하부 계층과의 상호작용, 그리고 실무에서 중요한 보안 정책을 정리합니다.
1. SMTP(Simple Mail Transfer Protocol)란?
SMTP는 인터넷을 통해 이메일을 전송하기 위한 응용 계층(Application Layer) 프로토콜입니다. 이름 그대로 ‘단순하게’ 메시지를 전달하는 것에 초점이 맞춰져 있으며, 텍스트 기반의 명령어와 응답 코드를 주고받는 방식으로 동작합니다.
- 역할: 메일 클라이언트(MUA)가 서버(MTA)로 메일을 보낼 때, 혹은 서버와 서버 간에 메일을 중계(Relay)할 때 사용됩니다.
- 포트 명세:
- 25번: 서버 간 전송을 위한 표준 포트.
- 587번: 보안이 강화된 클라이언트 메일 제출용 포트 (STARTTLS 권장).
- 465번: 암호화(Implicit TLS/SSL)를 사용하는 구형 표준 포트.
2. 이메일 시스템의 구성 요소 (Agents)
이메일이 사용자에게 전달되기까지는 여러 단계의 서버 엔진이 필요합니다.
- MUA (Mail User Agent): 사용자가 사용하는 인터페이스 (Gmail, Outlook, iOS Mail 등).
- MTA (Mail Transfer Agent): SMTP를 구현하여 실제 메일을 전송하고 수신하는 서버.
- MDA (Mail Delivery Agent): 도착한 메일을 사용자의 사서함(Inbox)에 배치하는 역할.
- 수신 프로토콜: 저장된 메일을 읽어올 때는 IMAP(서버와 동기화)이나 POP3(로컬 다운로드)을 사용합니다.
3. 네트워크 하부 계층과의 상호작용
SMTP는 독립적으로 존재하지 않으며, 신뢰성 있는 전송을 위해 DNS와 TCP/IP를 활용합니다.
3.1 DNS MX 레코드 조회
발신 서버는 수신자의 도메인(@naver.com)만 알고 있습니다. 따라서 DNS에 **MX 레코드(Mail Exchanger)**를 질의하여, 해당 도메인의 메일을 수신할 책임이 있는 서버의 주소를 찾아냅니다.
3.2 TCP/IP 3-Way Handshake
SMTP는 전송 신뢰성을 보장하는 TCP 위에서 동작합니다. 데이터를 전송하기 전, 발신 서버와 수신 서버는 SYN, SYN-ACK, ACK 패킷을 주고받으며 가상 연결 통로를 생성합니다.
4. [실습] CLI를 통한 SMTP 세션 재현
터미널에서 nc(Netcat)나 telnet을 통해 서버와 나눈 실제 대화 과정을 복기합니다. 이는 JavaScript의 net 모듈이 내부적으로 자동화하는 과정과 동일합니다.
4.1 연결 및 핸드셰이크
$ nc -v mx1.naver.com 25
# 220 mx.naver.com ESMTP ... (서버의 첫 인사)
HELO mycomputer.com
# 250 OK (서버가 나를 인식함)
4.2 봉투(Envelope) 정의
우체부가 배달을 위해 확인하는 ‘봉투’ 정보입니다.
MAIL FROM:<sender@example.com>
# 250 2.1.0 OK
RCPT TO:<receiver@naver.com>
# 250 2.1.5 OK
4.3 데이터 및 메시지 헤더(Message Header) 작성
DATA 명령어 이후에는 실제 편지 내용과 사용자가 메일 앱에서 보게 될 ‘헤더’ 정보를 작성합니다.
DATA
# 354 Enter mail, end with "." on a line by itself
Subject: Test Mail from CLI
From: <sender@example.com>
To: <receiver@naver.com>
This is the body of the email.
.
# 250 2.0.0 OK: queued as ... (전송 성공)
QUIT
# 221 2.0.0 Closing connection
- 주의: 헤더와 본문 사이에는 반드시 **빈 줄(CRLF)**이 하나 있어야 하며, 전송 종료는 단독 줄의 마침표(
.)로 알립니다.
5. 이메일 보안 기술 (SPF, DKIM, DMARC)
SMTP는 설계 당시 보안 기능이 부재했기 때문에, 사칭(Phishing)을 막기 위한 추가적인 인증 체계가 필수적입니다.
- SPF (Sender Policy Framework): 발신자의 IP 주소가 도메인 주인이 DNS에 등록한 정당한 IP인지 확인하는 기술입니다.
- DKIM (DomainKeys Identified Mail): 비대칭키 암호화 방식을 활용하여, 메일 헤더에 디지털 서명을 첨부합니다. 수신자는 DNS의 공개키로 본문의 위변조 여부를 검증합니다.
- DMARC: SPF/DKIM 인증 실패 시 처리 지침(무시, 격리, 차단)을 선언하여 최종적인 도메인 보안 정책을 확립합니다.
6. 서비스 운영: Bounce Handling
메일 발송 이후 발생하는 오류 메세지인 **Bounce**를 적절히 처리하는 것은 서버의 평판(Reputation) 관리에 매우 중요합니다.
- Hard Bounce: 수신자 이메일 주소가 존재하지 않거나 도메인이 잘못된 경우입니다. 영구적인 실패이므로 발송 대상에서 즉시 제외해야 합니다.
- Soft Bounce: 수신자 사서함 용량 초과 등 일시적 장애입니다. 일정 횟수 재시도(Retry)를 수행합니다.
AWS SES나 Resend 같은 Managed SMTP 서비스들은 이러한 바운스 이벤트를 수집하여 개발자에게 Webhook 형태로 전달해 줍니다. 개발자는 이를 수신하여 DB의 유저 상태를 자동으로 관리하는 로직을 구현해야 합니다.