자체 도메인에서 보낸 트랜잭션 메일(가입 인증, 비밀번호 재설정 등)이 스팸함으로 빠진다면 거의 100% 메일 인증 문제입니다. 2024년부터 Gmail은 일정량 이상 발송하는 모든 도메인에 SPF·DKIM·DMARC를 의무화했습니다.

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

웹 도구:


자주 빠지는 함정

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으로 한국어 안내가 가능합니다.