DMARC 정책과 리포트 — p=none으로 시작해야 하는 이유
DMARC를 처음부터 reject로 걸면 정상 메일이 차단됩니다. none으로 관찰하고 리포트로 발신 목록을 확인한 뒤 조이는 순서를 정리합니다.
SPF와 DKIM은 “검증”을 하고, DMARC는 그 검증이 실패했을 때 어떻게 하라는 발신자의 지시입니다. 동시에 내 도메인으로 나가는 메일에 대한 리포트를 받아 볼 수 있게 해 줍니다.
레코드는 이렇게 생겼습니다.
v=DMARC1; p=none; rua=mailto:[email protected]
_dmarc.example.com 위치에 TXT로 넣습니다. 도메인 루트가 아니라 _dmarc라는 이름 아래입니다.
넣은 뒤에는 조회해서 확인합니다.
dig +short TXT _dmarc.example.com
v=DMARC1로 시작하는 값이 하나만 나오면 됩니다. 두 개 이상 있으면 받는 서버는 정책이 없는 것으로 처리합니다.
정책 3단계
| 정책 | 검증 실패 시 | 언제 쓰나 |
|---|---|---|
p=none | 아무것도 안 함 (리포트만) | 시작 단계 — 관찰용 |
p=quarantine | 스팸함으로 | 발신 목록을 파악한 뒤 |
p=reject | 아예 거부 | 모든 경로가 인증을 통과할 때 |
p=none은 사칭을 막지 않습니다
none은 관찰 모드입니다. 리포트는 오지만 인증에 실패한 메일도 그대로 배달됩니다. 레코드를 넣었다는 것과 내 도메인 사칭이 차단된다는 것은 다른 이야기입니다.
그런데도 none으로 시작하는 이유가 있습니다.
왜 none으로 시작하나
p=reject를 처음부터 걸면 인증이 안 맞는 경로의 정상 메일이 그대로 사라집니다. 그리고 앞서 SPF 글에서 말씀드린 대로, 발송 경로는 본인이 아는 것보다 많은 경우가 대부분입니다.
- 그룹웨어
- 마케팅 발송
- 쇼핑몰 주문·배송 알림
- 예약·문의 자동응답
- 회계·세금계산서 발행 도구
이 중 하나만 SPF·DKIM이 안 맞아도 reject 상태에서는 그 메일이 고객에게 도착하지 않습니다. 더 나쁜 건, 거부는 조용히 일어나고 발신자는 모른다는 점입니다.
그래서 순서는 이렇습니다.
p=none으로 걸고 리포트를 받는다- 리포트에 뜨는 발신 IP·도메인을 전부 확인한다
- 정상인데 인증이 실패하는 경로를 고친다 (SPF에 추가하거나 DKIM 서명 설정)
- 다 맞으면
quarantine→reject로 조인다
리포트 읽기
rua=에 지정한 주소로 매일 XML 리포트가 옵니다. 받는 서버(구글·네이버 등)가 “당신 도메인으로 이런 메일들이 왔고, 인증은 이랬다”를 알려 주는 내용입니다.
핵심은 이 세 가지입니다.
- 발신 IP — 내가 모르는 IP가 있다면 사칭이거나, 잊고 있던 발송 경로
- SPF 결과 / DKIM 결과 — 어느 쪽이 실패하는지
- 처리 결과 — 실제로 어떻게 처리됐는지
여기서 자주 오해하는 부분이 있습니다. DMARC는 SPF와 DKIM 중 하나만 통과해도 통과입니다. 리포트에 spf=fail이 찍혀 있어도 DKIM이 통과했다면 그 메일은 문제없이 도착합니다. 둘 다 실패한 건만 실제 문제입니다.
XML이 사람이 읽기 불편해서, 리포트를 모아 표로 정리해 주는 도구를 쓰거나 직접 파싱하는 편이 낫습니다.
리포트가 오지 않을 때
rua=에 다른 도메인의 주소를 적었다면 한 가지가 더 필요합니다. 리포트를 받는 쪽 도메인에 아래 레코드가 있어야 그 주소로 보내는 것이 승인됩니다.
example.com._report._dmarc.받는도메인.com TXT "v=DMARC1"
앞부분(example.com)은 리포트를 요청한 도메인입니다. 이 승인 레코드가 없으면 보내는 서버 상당수가 리포트를 보내지 않습니다. 레코드는 정상인데 아무것도 안 오는 상태가 대개 여기서 나옵니다. 같은 도메인 안의 주소([email protected])로 받는다면 필요 없습니다.
리포트가 없는 다른 이유도 있습니다.
- 리포트는 보통 하루 한 번 집계로 옵니다 — 넣은 당일에는 오지 않습니다
- 모든 수신 서버가 보내지는 않습니다
- 그 기간에 해당 수신 서버로 나간 메일이 없으면 보낼 내용도 없습니다
조일 때 쓰는 두 손잡이 — pct와 sp
none에서 바로 전량을 reject로 넘기지 않아도 됩니다.
v=DMARC1; p=quarantine; pct=10; sp=none; rua=mailto:[email protected]
pct=— 정책을 적용할 비율입니다.pct=10이면 대상 메일의 10%에만 quarantine이 걸리고 나머지는 none처럼 지나갑니다. 일부부터 걸어 리포트를 확인할 수 있습니다.sp=— 하위 도메인에 적용할 정책입니다. 안 적으면 하위 도메인이p=를 그대로 물려받습니다. 본 도메인은 조였는데mail.example.com같은 하위 도메인에서 나가는 경로가 남아 있으면 여기서 걸립니다.
none에서 언제 넘어가나
기간이 아니라 리포트로 판정합니다. 두 가지가 확인되면 넘어갈 때입니다.
- 리포트에 뜨는 발신 IP·도메인이 전부 내가 아는 경로다
- 그 경로들이 SPF나 DKIM 중 하나를 통과하고, 아래 정렬까지 맞는다
발송량이 적으면 리포트가 드물게 오기 때문에 확인에 몇 주가 걸리기도 합니다.
정렬(alignment)
DMARC에는 한 가지 조건이 더 있습니다. SPF나 DKIM이 통과하는 것만으로는 부족하고, 그 통과한 도메인이 보낸사람 주소의 도메인과 맞아야 합니다. 이를 정렬이라 합니다.
외부 발송 도구를 쓸 때 이 부분이 자주 어긋납니다. 도구 쪽 도메인으로 인증은 통과하는데 보낸사람은 내 도메인이면, DMARC 기준으로는 실패입니다. 발송 도구에서 내 도메인으로 DKIM 서명을 하도록 설정하면 해결됩니다.
정렬 기준에는 완화(relaxed)와 엄격(strict) 두 가지가 있고, 따로 적지 않으면 완화가 기본입니다. 완화 모드는 상위 도메인이 같으면 정렬된 것으로 봅니다 — mail.example.com으로 서명해도 보낸사람이 example.com이면 맞는 것으로 처리됩니다. 완전히 같아야 한다면 adkim=s(DKIM)·aspf=s(SPF)를 붙입니다.
SPF 쪽은 여기서 한 번 더 걸립니다. SPF가 보는 것은 봉투의 반송 주소이지 수신자가 화면에서 보는 보낸사람이 아니라서, 발송 도구가 반송 주소를 자기 도메인으로 쓰면 SPF는 통과인데 정렬은 실패입니다. 이 경우 DKIM 쪽이 정렬을 통과해 주어야 DMARC가 성립합니다.
DMARC는 SPF와 DKIM이 갖춰진 뒤에 의미가 있습니다. 셋이 어떻게 맞물리는지는 SPF·DKIM·DMARC 정리를 참고하세요.
발송 도메인 인증, 무료로 점검해 드립니다
도메인만 알려주시면 SPF·DKIM·DMARC·역방향 DNS 설정을 조회해서, 무엇이 빠졌고 무엇이 위험한지 정리해 보내드립니다. 비용도 조건도 없습니다.
카카오톡 상담방에 도메인을 남겨 주세요.
전용 IP로 대량 발송할 인프라가 필요하시면 전용 IP 대량 발송 안내에서 구성과 가격을 확인하실 수 있습니다.