SMTP 란
이메일을 송신하기 위한 표준 프로토콜이다.
메일 클라이언트가 메일 서버로 송신할 때, 그리고 메일 서버가 다른 메일 서버로 송신 요청을 보낼 때 SMTP 프로토콜을 사용하게 된다.
포트는 통상적으로 아래 3가지가 사용된다.
| 용도 | 암호화 방식 | 인증 | 권장 여부 | 특징 | |
| 25 | 서버 ↔ 서버 전송 | 없음 (STARTTLS 가능) |
거의안씀 | 비권장 | 옛날의 SMTP 기본 포트 스팸 때문에 ISP에서 차단 많음 |
| 587 | 클라이언트 → 서버 전송 | STARTTLS | 필수 | 권장 | 표준 메일 제출 포트 (Mail Submission) |
| 465 | 클라이언트 → 서버 전송 | SSL/TLS 즉시 | 필수 | 조건부 권장 | SMTPS, 예전엔 비표준 → 요즘은 다시 사용됨 |
위의 표에서 언급되는 단어에 대한 설명은 아래와 같다.
인증
SMTP 서버에 내가 메일을 송신하기 위한 권한을 가지고 있음을 인증하는 방식이다.
보통 SMTP 서버에 권한이 있는 계정을 만들어 id/pwd 를 이용하여 인증을 시도한다.
다만 25번 포트의 경우에는 인증을 사용하지 않고도 메일 송신이 가능하기에 취약한 포트라고 볼 수 있다.
따라서 보통 서로 신뢰하는 서버 간의 SMTP 통신이나, IP 기반으로 화이트리스트를 관리하는 사내 메일 등을 제외하면 서비스단에서 인증 없이 통신하는 경우는 보통 없다.
STARTTLS vs SSL/TLS
STARTTLS 는 일단 평문으로 연결한 후, 중간에 암호화로 업그레이드하는 방식이고
SSL/TLS 는 처음부터 끝까지 암호화 연결을 하는 방식이다.
아래는 쉽게 풀어쓴 예시이다.
STARTTLS
1. TCP 연결 (평문)
2. EHLO
3. STARTTLS 명령
4. TLS 핸드쉐이크
5. 이후부터 암호화
6. AUTH (ID / PW)
7. 메일 전송
SSL/TLS
1. TCP 연결
2. TLS 핸드쉐이크 (바로 암호화 시작)
3. 암호화된 상태
4. EHLO
5. AUTH
6. 메일 전송
차이를 보면 STARTTLS 는 먼저 클라이언트가 EHLO 로 인사 후 응답에 STARTTLS 가 포함되어있으면 TLS 핸드쉐이크를 시작하는 반면,
SSL/TLS 는 바로 TCP 연결이 되자마자 TLS 핸드쉐이크를 시도한다.
(펼치기) EHLO 에 대해 더 알고싶다면
EHLO (Extended HELO)
클라이언트가 서버에게 확장 SMTP를 쓰기 위해 서버로부터 지원하는 기능 리스트를 받기 위해 사용하는 명령어이다.
옛날에 사용하는 SMTP 는 기능이 단순했으나 현대로 넘어오면서 STARTTLS, 인증 등의 기능이 추가되어, 서버가 어떤 기능을 지원할 수 있는지 확인이 필요해지게 되었다.
아래는 EHLO 의 예시다.
C: EHLO myapp.company.com
S: 250-mail.company.com
S: 250-STARTTLS
S: 250-AUTH LOGIN PLAIN
S: 250-SIZE 52428800
Relay 란
Mail Relay (SMTP Relay) 는 메일을 대신 전달해주는 중계 서버를 의미한다.
따라서 SMTP 서버로 클라이언트가 메일을 바로 보내지 않고, 중간에 Relay 서버를 거쳐서 메일을 송신할 수 있다.
Relay 를 사용하는 이유는 클라이언트가 직접 Gmail 이나 Naver SMTP 같은 곳으로 메일을 송신하게 되면
클라이언트의 ip 를 신뢰할 수 없고 SPF, DKIM 서명 등의 보안 없이 SMTP 서버로 바로 가기에 SMTP 서버가 해당 메일을 스팸으로 분류할 수 있다.
즉, 이러한 메일 수신자에 대한 신뢰 및 안정성을 보장해주는 것이 Relay 서버다.
메일 클라이언트는 Relay 서버까지만 메일을 정상적으로 전달하면, 그 뒤는 Relay 서버가 다른 SMTP 서버와 통신하며 안정성 있는 메일 전달을 보장해준다
아래는 쉽게 들은 Relay 서버 유무에 대한 시나리오의 차이다.
Relay 서버가 없을 때
[Java 서비스]
↓
[Gmail / Naver SMTP]
Relay 서버가 있을 때
[Java 서비스]
↓ 587 (AUTH + TLS)
[SMTP Relay]
↓ 25
[외부 메일 서버]
다만 Relay 라고 해서 SMTP 서버와 별개의 개념은 아니고, SMTP 서버에 Relay 의 기능이 포함되어 있다고 볼 수 있다.
따라서 클라이언트 쪽에 붙어있는 SMTP 서버가 다른 곳으로부터 메일을 수신 받음과 동시에 내가 송신하려는 메일의 Relay 기능도 동시에 할 수 있다.
Relay의 핵심 기능
1. 릴레이 제어
Relay 는 아래와 같이 모든 클라이언트에 대해 수신을 받지 않고 문제가 있는 송신은 걸러주는 역할을 한다.
- 인증된 사용자만 발송
- 허용된 IP만 발송
- 특정 도메인만 발송
아무 인증도 없이, 아무나, 아무 메일이나 보낼 수 있는 것을 Open Relay 라고 하는데, 이것을 방지하는 기능을 한다.
만약 릴레이 제어 없이 Open Relay 를 하게 되면 악의적인 해커가 해당 SMTP 서버를 통해 다른 곳으로 스팸 메일을 대량으로 발송해도 막을 수 없다.
2. 큐잉 (Queue)
아래와 같은 상황에서 메일 임시 저장 후 재시도 등의 처리를 해준다.
- 상대 서버 다운
- 네트워크 문제
3. 스팸 대응
아래와 같은 보안 확인을 통해 스팸 메일 여부를 체크 한다.
- DKIM 서명
- SPF alignment
- DMARC 정책 준수
이 외에 송/수신처 및 내용, 성공 여부에 대한 로깅 등도 함께 기록해준다.
SPF / DKIM / DMARC 에 대한 개념
SPF / DKIM / DMARC 는 이 메일이 정말 신뢰가 가능한지를 검증하기 위한 보안 장치다.
SPF 는
xxx.com 이라는 주소로 어떤 서버가 메일을 보내도 되는지 확인하는 절차이다.
SMTP 서버가 gmail 일 때, aaa@company.com -> bbb@gmail.com 송신해주려는데 메일을 보낸 클라이언트 서버 정보가 등록이 되어있지 않으면 SPF 단계에서 fail 이 발생한다.
이 때 SPF 는 송신자(회사 등) 도메인의 SPF 레코드에 SMTP Relay 서버 IP를 추가해야 한다.
아래는 SPF 가 성공하는 예시다.
김대리: kim@company.com
회사 메일 서버: 203.0.113.10
수신자: user@gmail.com
1. 김대리가 수신자에게 보낸 메일이 회사 SMTP Relay (203.0.113.10) 를 거쳐 Gmail SMTP 서버로 나간다.
2. Gmail이 DNS 를 통해 company.com 의 SPF 를 조회한다.
DNS 결과: v=spf1 ip4:203.0.113.10 -all
3. spf 에 회사 메일 서버인 203.0.113.10 가 등록되어 있음을 확인하고 SPF 검증을 패스하여 메일을 송신한다.
DKIM 는
송신한 메일의 도메인을 신뢰할 수 있으며, 중간에 내용이 변경되지 않았음을 증명하기 위한 전자 서명이다.
IP 가 아닌 메일 내용 자체를 증명하기 위한 수단으로, 위조 및 변조 방지에 목적이 있다.
아래는 DKIM 에 대한 시나리오다.
김대리: kim@company.com
회사 메일 서버: 203.0.113.10
수신자: user@gmail.com
1. 김대리가 수신자에게 보낸 메일이 회사 SMTP Relay (203.0.113.10) 를 거친다.
2. SMTP Relay 는 메일 내용 일부를 해시한 뒤 비밀키로 서명 후 서명 결과를 메일 헤더에 붙인다. 그 후 Gmail SMTP 로 송신한다.
3. Gmail SMTP 는 DKIM 서명이 있는 것을 확인하고 공개키로 서명 검증을 한다. 공개 키로 서명 검증에 성공하고 메일 내용 해시가 일치하면 DKIM 검증이 패스되어 메일을 송신한다.
DMARC 는
SPF / DKIM 검사 결과를 보고 이 메일을 어떻게 처리할지 도메인 주인이 수신자에게 지시하는 규칙이다.
From 도메인의 DNS 에 DMARC 를 설정할 수 있으며, 아래의 p= 부분에 설정된다.
p= 의 값이 어떤 것인지에 따라 차단하지 않고 보고만 해줄지(none), 스팸함으로 넣을지(quarantine), 아예 거절할지(reject) SMTP 서버에서 결정할 수 있다.
v=DMARC1;
p=quarantine;
rua=mailto:dmarc@company.com;
ruf=mailto:dmarc@company.com;
'클라우드' 카테고리의 다른 글
| 암호화와 서명의 개념 (0) | 2026.05.20 |
|---|---|
| AD 계정 사용자의 프로필(Profile) 개념 (0) | 2026.05.04 |
| [쿠버네티스] 쿠버네티스에서 yaml config 파일 작성하는 방법과 pod 만들어보기 (1) | 2023.11.23 |
| [쿠버네티스] 쿠버네티스의 기본 구성요소 (1) | 2023.11.20 |
| 클라우드란? 클라우드 개념 쉽고 간단하게 이해하기 (0) | 2023.11.10 |