SPF 레코드 구문 해설: 개발자를 위한 실용 가이드
Source: Dev.to
SPF(Sender Policy Framework)는 DNS 레코드로, 수신 메일 서버에 어떤 서버가 도메인을 대신해 이메일을 보낼 수 있는지 알려줍니다. 목록에 없는 서버가 해당 도메인에서 보낸 것처럼 이메일을 보낼 경우, 수신 서버는 이를 거부하거나 플래그를 달 수 있습니다.
문법을 이해하면 올바르게 설정하고, 10회 조회 제한을 실수로 초과하는 등의 흔한 오류를 피할 수 있습니다.
SPF 레코드는 도메인 DNS에 등록되는 TXT 레코드이며 항상 다음으로 시작합니다.
v=spf1
그 뒤에 허용할 발신자를 메커니즘 형태로 나열하고, 마지막에 all 지시자를 넣습니다.
예시 SPF 레코드:
v=spf1 include:_spf.google.com include:spf.sendinblue.com ip4:203.0.113.50 ~all
ip4: 와 ip6:
특정 IP 주소 혹은 CIDR 범위를 허용합니다.
ip4:203.0.113.50
직접 관리하는 메일 서버의 정확한 IP를 알고 있을 때 사용합니다.
include:
다른 도메인의 SPF 레코드를 참조합니다. include: 하나당 DNS 조회가 한 번 발생합니다.
include:_spf.google.com
대부분의 서드파티 이메일 서비스는 추가할 include: 값을 제공합니다. 해당 서비스의 SPF 레코드에 포함된 모든 IP가 허용됩니다.
a:
도메인의 A 레코드를 허용합니다. 도메인의 A 레코드와 이메일 발신 IP가 일치하면 통과합니다.
mx:
도메인의 MX 레코드를 허용합니다. 흔히 사용되지는 않으며, 메일 서버와 MX 레코드가 동일한 호스트일 때 주로 씁니다.
ptr:
사용하지 않는 것이 좋습니다. 조회가 느리고 신뢰성이 낮으며 실제로는 폐기된 방식입니다.
all 지시자
레코드 끝에 위치하며, 목록에 없는 서버에서 온 메일에 대해 어떻게 처리할지를 정의합니다.
~all(softfail) — 실패하지만 보통은 메일을 전달하고, 의심스러운 것으로 표시합니다.-all(hardfail) — 메일을 거부합니다.+all(pass all) — 모든 것을 허용합니다. SPF의 의미가 사라집니다.?all(neutral) — 정책이 없으며, SPF가 없는 것과 동일합니다.
대부분의 발신자는 ~all을 기본으로 사용하면 안전합니다. 레코드가 완전하다고 확신이 서면 -all로 전환해 보안을 강화하세요.
DNS 조회 제한
SPF는 평가당 10회의 DNS 조회 제한이 있습니다. include:, a:, mx:, ptr: 각각이 한 번씩 조회를 차지합니다. 10회를 초과하면 SPF 검사는 permerror를 반환하고, 이는 레코드가 실패한 것으로 간주됩니다.
여러 서비스를 동시에 사용하는 경우(예: Google Workspace, Mailchimp, SendGrid, CRM 등) 이 제한을 쉽게 초과할 수 있습니다.
해결 방법
- 레코드를 검토하고 조회 횟수를 셉니다.
- 더 이상 사용하지 않는 서비스를 제거합니다.
include:값을 실제 IP 주소로 교체해 레코드를 플래튼(flatten) 합니다(제공자가 IP를 변경하면 업데이트가 필요합니다).- 발신자가 많아 줄일 수 없을 경우 SPF 플래튼 서비스 이용을 고려합니다.
- InboxGreen의 SPF 조회 도구를 사용하면 현재 레코드와 조회 횟수 문제를 확인할 수 있습니다.
기타 주의사항
- Multiple SPF records: 도메인당 하나의 TXT SPF 레코드만 허용됩니다. 두 번째 레코드가 있으면 SPF 검증이 완전히 깨집니다. 하나로 합쳐야 합니다.
- Wrong domain: SPF는 DMARC 정렬을 위해
From:헤더에 있는 도메인과 일치해야 합니다. 예를 들어noreply@mail.yourdomain.com에서 보낸다면 SPF 레코드는mail.yourdomain.com에 있어야 합니다. - Forgetting subdomains:
yourdomain.com에 설정한 SPF는mail.yourdomain.com이나info.yourdomain.com을 커버하지 않습니다. 각 서브도메인마다 별도의 레코드가 필요합니다. - Missing all: 모든 SPF 레코드는 반드시
all형태로 끝나야 합니다. 없으면 결과가 정의되지 않습니다. - InboxGreen 무료 검사기는 SPF 레코드를 가져와 메커니즘을 파싱하고 도메인에 대한 인증 검사를 수행합니다. 로그인 없이 바로 사용할 수 있습니다.