자체 도메인에서 보낸 트랜잭션 메일(가입 인증, 비밀번호 재설정 등)이 스팸함으로 빠진다면 거의 100% 메일 인증 문제입니다. 2024년부터 Gmail은 일정량 이상 발송하는 모든 도메인에 SPF·DKIM·DMARC를 의무화했습니다.
세 가지의 역할
| 인증 | 검증 대상 | 핵심 |
|---|---|---|
| SPF | “이 IP가 이 도메인을 보낼 자격이 있는가?” | 발송 IP 화이트리스트 |
| DKIM | “본문이 중간에 변조되지 않았는가?” | 디지털 서명(비대칭키) |
| DMARC | “SPF/DKIM 실패 시 어떻게 처리할 것인가?” | 정책 + 보고서 수신 |
SPF만 있으면 본문 변조를 못 잡고, DKIM만 있으면 발송지 IP를 속일 수 있습니다. 세 가지가 함께 동작해야 안전합니다.
사전 조건
- 일본 서버에 PTR(역방향 DNS)이 설정되어 있어야 합니다. TCP-80.NET은 PTR 등록을 @tcp80net 요청으로 처리합니다.
- 도메인의 DNS를 직접 편집할 수 있어야 합니다(Cloudflare, 가비아, AWS Route 53 등).
- 메일 서버(Postfix 등)가 이미 동작 중이어야 합니다.
1단계 — SPF 설정
SPF는 도메인의 TXT 레코드에 한 줄을 추가하는 것으로 끝납니다.
타입: TXT
이름: @
값: v=spf1 ip4:203.0.113.10 -all
여러 발송 경로가 있을 때:
v=spf1 ip4:203.0.113.10 ip4:203.0.113.11 include:_spf.google.com -all
| 표현 | 의미 |
|---|---|
ip4: ip6: |
허용 IP |
include: |
외부 발송 서비스(예: SendGrid, Mailgun)의 SPF 임포트 |
~all |
그 외는 SoftFail (일반적으로 권장) |
-all |
그 외는 HardFail (가장 엄격) |
?all |
중립 (사실상 의미 없음) |
처음에는 ~all로 시작하고, 안정되면 -all로 강화하는 것이 안전합니다.
검증:
dig +short TXT example.com
2단계 — DKIM 설정 (Postfix + OpenDKIM)
DKIM은 메일 본문에 서명을 추가하고, 공개키를 DNS에 게시해 수신 서버가 검증할 수 있게 합니다.
OpenDKIM 설치
sudo apt install opendkim opendkim-tools
sudo mkdir -p /etc/opendkim/keys/example.com
sudo chown -R opendkim:opendkim /etc/opendkim
키 생성
cd /etc/opendkim/keys/example.com
sudo opendkim-genkey -s default -d example.com
sudo chown opendkim:opendkim default.private
생성된 default.txt에 DNS 등록용 공개키가 들어 있습니다.
default._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )
이 내용을 도메인 DNS에 TXT 레코드로 추가합니다(이름: default._domainkey).
OpenDKIM 설정
# /etc/opendkim.conf
Syslog yes
UMask 002
Domain example.com
KeyFile /etc/opendkim/keys/example.com/default.private
Selector default
Socket inet:8891@localhost
Mode sv
SubDomains no
AutoRestart yes
SignatureAlgorithm rsa-sha256
Postfix 연동
# /etc/postfix/main.cf 끝에 추가
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
sudo systemctl enable --now opendkim
sudo systemctl restart postfix
테스트 메일을 보내고 Gmail 헤더에서 dkim=pass가 보이면 성공입니다.
3단계 — DMARC 설정
DMARC는 SPF/DKIM 실패 시 동작과 보고서 수신 주소를 정의합니다.
타입: TXT
이름: _dmarc
값: v=DMARC1; p=none; rua=mailto:dmarc@example.com; pct=100
정책 단계
DMARC는 단계적으로 강화해야 합니다. 처음부터 reject로 두면 정상 메일까지 차단되는 사고가 일어납니다.
| 단계 | 정책 | 동작 |
|---|---|---|
| 1단계 (모니터링) | p=none |
차단 없이 보고서만 수집 (1~2주) |
| 2단계 (격리) | p=quarantine |
실패 시 스팸함으로 (1~2주) |
| 3단계 (차단) | p=reject |
실패 시 메일 거부 |
rua=로 지정한 주소로 매일 인증 결과 보고서가 옵니다. 대규모 발송 환경이면 https://dmarcian.com 같은 분석 SaaS를 쓰는 게 편합니다.
4단계 — BIMI (선택)
BIMI는 인증된 도메인의 메일에 브랜드 로고를 표시해주는 표준입니다. DMARC p=quarantine 이상이 전제 조건입니다.
타입: TXT
이름: default._bimi
값: v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/vmc.pem
BIMI 자체는 인증이 아니지만, 사용자에게 메일이 정품임을 시각적으로 보여줘 클릭률을 높이는 효과가 있습니다.
5단계 — 검증 도구
설정이 다 끝나면 다음 도구로 확인합니다.
# 한 번에 보기
dig +short TXT example.com # SPF
dig +short TXT default._domainkey.example.com # DKIM
dig +short TXT _dmarc.example.com # DMARC
웹 도구:
- https://mxtoolbox.com/SuperTool.aspx — SPF/DKIM/DMARC 한 번에 확인
check-auth@verifier.port25.com으로 메일을 보내면 자동 응답으로 결과 분석
자주 빠지는 함정
SPF에 include: 너무 많이 추가
- SPF는 DNS 조회 횟수가 10회를 초과하면 실패 처리됩니다. SendGrid, Mailgun, Google 등을 모두 추가하면 한도를 넘기 쉬우니, 사용하지 않는 서비스는 제거하세요.
DKIM 키 길이 1024 → 2048 변경 시
- 일부 DNS 제공자는 TXT 레코드 한 줄 길이 제한이 있습니다. 따옴표로 분할해 넣어야 하는 경우가 있으니 등록 후
dig로 반드시 검증하세요.
DMARC reject 직행
- 외부 SaaS(설문, 청구서, CRM 등)도 같은 도메인으로 발송 중이라면, 정책을 강화하면 그쪽 메일이 모두 차단됩니다. 보고서로 발송 출처를 모두 파악한 뒤 단계적으로 강화하세요.
메일 발송 IP의 PTR 누락
- IPv6로 메일을 보낼 때 PTR이 없으면 Gmail은 거의 무조건 거부합니다. 호스팅사에 PTR 등록을 요청하세요.
마무리
SPF·DKIM·DMARC는 한 번 잘 설정해두면 도메인 평판이 안정적으로 누적됩니다. 설정 후에는 DMARC 보고서를 1주일 정도 모니터링한 뒤 정책을 점진 강화하세요.
TCP-80.NET의 일본 서버는 PTR 등록을 무료로 지원하며, 메일 서버 운영 중 막히는 부분이 있으면 @tcp80net으로 한국어 안내가 가능합니다.