SPF 레코드 확인 — SPF 검증 도구
SPF 조회로 모든 도메인의 SPF 레코드를 수신 메일 서버와 같은 방식으로 확인하세요: include별 DNS 조회 비용, 한도 10회에 대한 누적 횟수, void 조회, 그리고 발신 IP별 결과와 그 결과를 결정한 항목까지 보여 줍니다.
입력한 이름 그대로 확인합니다: SPF에는 상속이 없으므로 mail.example.com에는 자체 레코드가 필요합니다.
SPF 레코드란?
SPF 레코드는 도메인을 대신해 메일을 보낼 수 있는 서버를 나열한 TXT 레코드입니다. v=spf1로 시작해 발신자를 항목별로 지정하고, 나머지 모든 발신자를 수신 서버가 어떻게 처리할지를 마지막에 밝힙니다(RFC 7208, 2014년 4월, 지금도 현행 표준).
수신 서버는 접속한 서버의 주소와 봉투 발신자(MAIL FROM 또는 Return-Path)의 도메인을 기준으로 확인하며, 받는 사람이 보는 From: 줄은 기준이 아닙니다. SPF를 From:과 연결하는 것은 DMARC의 역할입니다.
레코드는 게시된 정확한 이름에만 적용됩니다: SPF에는 상속이 없으므로 mail.example.com에는 자체 레코드가 필요합니다. 메일을 보내지 않는 도메인은 v=spf1 -all을 게시해야 합니다.
이 include는 _spf.google.com을(를) 가리킵니다 · 범위 8개, 추가 조회 없음
ip4:74.125.0.0/16ip4:209.85.128.0/17ip6:2001:4860:4864::/56ip6:2404:6800:4864::/56ip6:2607:f8b0:4864::/56ip6:2800:3f0:4864::/56ip6:2a00:1450:4864::/56ip6:2c0f:fb50:4864::/56~all
v=spf1이 맨 앞에 와야 합니다: 다른 방식으로 시작하는 레코드는 SPF 레코드가 아닙니다.redirect=는 확인을 다른 레코드에 넘기고, exp=는 fail의 이유를 설명합니다.~all에 이릅니다. 2026년 10월 24일에 Google Public DNS로 기록했습니다.SPF 레코드 확인 방법
위에 도메인을 입력하면 확인 도구가 TXT 레코드를 읽어 v=spf1로 시작하는 것을 고른 다음, 수신 서버처럼 모든 include와 redirect를 따라가며 DNS 조회를 하나씩 셉니다.
직접 확인하려면 TXT 레코드를 조회합니다: dig TXT example.com +short 또는 nslookup -type=TXT example.com. 응답에는 해당 이름의 모든 TXT 레코드가 들어 있으며, SPF 레코드는 v=spf1로 시작하는 것입니다. 긴 레코드는 따옴표로 묶인 여러 문자열로 나오고, SPF는 이를 공백 없이 이어 붙입니다. include마다 쿼리가 하나씩 더 필요하므로 횟수는 직접 세어야 합니다.
특정 서버가 메일을 보낼 수 있는지 보려면 IP 테스트로 전환하세요: 해당 주소에 같은 확인을 실행하고 일치한 항목을 보여 줍니다.
dig TXT example.com +short리졸버가 가진 해당 이름의 모든 TXT 레코드입니다. SPF 레코드는 v=spf1로 시작하는 것입니다. include마다 다시 실행하세요.
$ dig TXT github.com @dns1.p08.nsone.net +norec +noall +answer github.com. 300 IN TXT "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com include:_netblocks2.google.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net include:mktomail.com include:sendgrid.net ip4:62.253.2" "27.114 ip4:166.78.69.169 ip4:166.78.69.170 ip4:166.78.71.131 ~all" # 그다음 include를 하나씩 질의합니다: $ dig +short TXT _spf.salesforce.com "v=spf1 exists:%{i}._spf.mta.salesforce.com -all"
- v=spf1로 시작하는 레코드는 하나입니다. 옆에 있는 다른 TXT 레코드 23개(소유 확인 토큰 등)는 응답 크기를 빼면 SPF와 무관합니다.
- 문자열 2개을 공백 없이 이어 붙입니다. 255바이트 단위 분할이
ip4:62.253.227.114안에서 일어나지만, 수신 서버가 문자열을 다시 이어 붙이므로 문제없습니다. - TTL 5분. 변경 후 리졸버가 이 사본을 보관할 수 있는 시간입니다. 도메인 자체 서버는 5분이라고 답하며, 리졸버는 사본에 남은 시간을 보여 줍니다.
- include마다 쿼리가 따로 필요합니다. github.com의 레코드를 따라가려면 중첩된 것까지 조회 10회이 필요합니다. dig는 이름 하나씩만 보여 주므로 10회까지의 횟수는 직접 더해야 합니다.
$ nslookup -type=TXT github.com 8.8.8.8
# Google Public DNS에서 가져온 해당 이름의 모든 TXT 레코드 PS> Resolve-DnsName -Name github.com -Type TXT -Server 8.8.8.8
결과 읽는 법: include 트리
판정은 레코드에 없는 발신자에게 수신 서버가 받는 결과를 알려 줍니다: 종료 항목에 따라 유효(~all이면 softfail, -all이면 fail), 원인이 붙은 permerror, 또는 DNS가 응답하지 않았을 때의 "확인 불가"입니다.
남색 열은 조회 예산입니다: DNS 조회 하나가 칸 하나이며, 그 조회를 쓰는 include별로 색이 칠해지고, 10회에 대한 누적 횟수와 void 조회(고리 모양)가 표시됩니다. 10번째를 넘으면 칸이 빨갛게 바뀌고 수신 서버가 멈추는 가지가 표시됩니다.
트리 보기에는 실패한 항목부터 판독 결과가 RFC 절과 해결 방법과 함께 나오고, 그다음 수신 서버가 질의하는 순서대로 모든 조회가 나옵니다.

판정레코드에 없는 발신자가 수신 서버에서 받는 결과와, 이를 결정하는 종료 항목입니다.항목별 레코드항목은 종류별로 색이 칠해지고, include에는 운영 주체의 표시와 자체 조회 비용이 붙습니다.판독레코드 수, 구문, 조회, void, 종료 항목, ptr, DMARC를 실패 항목부터, 각각 해결 방법과 함께 보여 줍니다.조회 예산DNS 조회를 칸 하나씩, 그 조회를 쓰는 include별 색으로 한도 10회와 함께 보여 줍니다.include별 비용include마다 가지 하나: 자체 칸, 중첩된 것, 누적 횟수를 보여 줍니다.void 조회빈 응답이 돌아온 쿼리를 고리로 표시하며, 세 번째에서 확인이 끝납니다.조회 10회 한도와 "too many DNS lookups"(permerror)
수신 서버는 DNS 질의가 필요한 모든 항목(include, a, mx, ptr, exists, redirect)을 중첩된 include까지 모두 세며 10회에서 멈춥니다. 11번째는 permerror입니다(RFC 7208 §4.6.4). ip4, ip6, all, exp에는 비용이 들지 않습니다.
이것은 fail이 아니라 permerror입니다: 수신 서버가 어떻게 처리할지는 각자의 선택이지만, DMARC에서는 permerror가 pass로 인정되지 않습니다. 또한 확인은 처음 일치한 항목에서 멈추므로, 한도를 넘은 레코드도 앞쪽에 등록된 발신자에게는 pass하고 뒤쪽에 등록된 발신자에서만 문제가 생깁니다.
비용은 include 안에 숨어 있습니다: include:_netblocks.mimecast.com은 혼자 9회, Yandex 360은 8회, Freshdesk는 7회, Mailgun은 5회를 씁니다. Google과 Microsoft 365의 include는 각각 1회입니다. 10회 이하로 맞추려면 더 이상 쓰지 않는 발신자를 지우고, 대량 발송 업체는 자체 레코드를 가진 서브도메인으로 옮기세요.
v=spf1 include:spf.protection.outlook.com include:_netblocks.mimecast.com include:mailgun.org include:sendgrid.net -all
나머지 모든 발신자도 레코드의 -all fail이 아니라 permerror를 받습니다: 수신 서버가 거기에 이르기 전에 멈추기 때문입니다.
- _netblocks.mimecast.comMimecast조회 9회
- _spf.yandex.netYandex 360조회 8회
- email.freshdesk.comFreshdesk조회 7회
- mailgun.orgMailgun조회 5회
- icloud.comiCloud+조회 5회
- spf.titan.emailTitan Email조회 4회
- secureserver.netGoDaddy조회 3회
- _spf.google.comGoogle Workspace조회 1회
- spf.protection.outlook.comMicrosoft 365조회 1회
void 조회란?
void 조회는 레코드가 하나도 돌아오지 않는 쿼리입니다: 이름이 존재하지 않거나(NXDOMAIN) 이름은 있지만 요청한 레코드가 없는 경우입니다. 수신 서버는 두 번까지 허용해야 하며, 세 번째는 permerror입니다(RFC 7208 §4.6.4).
없어진 호스트를 가리키는 항목 a:old.example.com은 그 자체로는 오류가 아닙니다: 일치하지 않고 void 1회로 셀 뿐입니다. Salesforce가 등록하지 않은 모든 발신자에 대한 exists:%{i}._spf.mta.salesforce.com도 마찬가지이며, 그래서 include의 순서가 중요합니다.
서버 장애나 시간 초과는 void가 아닙니다: temperror이며, 수신 서버는 보통 나중에 다시 시도합니다.
192.0.2.1 기준 salesforce.com의 자체 레코드, 2026년 10월 24일 기록
v=spf1 include:_spf.google.com include:_spf.salesforce.com exists:%{i}._spf.corp.salesforce.com ~all
exists:%{i}._spf.mta.salesforce.com192.0.2.1._spf.mta.salesforce.com → NXDOMAIN · 3번째 조회 · _spf.salesforce.com에서exists:%{i}._spf.corp.salesforce.com192.0.2.1._spf.corp.salesforce.com → NXDOMAIN · 4번째 조회 · salesforce.com에서
결과: softfail, 허용된 void 2회를 모두 소모
a:mail.example.com이 아직 존재하지만 더 이상 주소가 없는 이름을 가리킵니다: 답이 없는 NOERROR입니다. 일치 없음, void 1회로 세고 확인은 계속됩니다.NODATAvoid 조회exists:%{i}._spf.mta.salesforce.com은 발신 IP마다 이름을 만들며, Salesforce가 등록하지 않은 주소에서는 NXDOMAIN이 돌아옵니다: 매번 void 1회입니다.NXDOMAINvoid 조회mx:shop.example.com은 없어진 이름이며, 이미 void가 2회 발생한 뒤입니다: 수신 서버는 여기서 멈춥니다.NXDOMAINpermerrorinclude:_spf.vendor.example에 대한 SERVFAIL 또는 시간 초과: DNS 장애이므로 void로 세지 않습니다.SERVFAILtemperror, void 아님blastmail의 include include:spf.bmv.jp는 이런 exists 항목 두 개로 시작합니다: 등록되지 않은 주소에서는 허용된 void 2회를 혼자 모두 소모합니다.
SPF flattening: 도움이 될 때와 문제가 될 때
flattening은 include를 그 안에 나열된 주소로 바꿔 레코드의 조회 횟수를 줄이는 방법입니다. 거의 바뀌지 않는 범위에는 효과가 있지만, 제공업체가 서버를 추가했는데 복사해 두지 않았다면 역효과가 납니다: 그 서버의 메일은 SPF를 통과하지 못합니다.
Microsoft는 include:spf.protection.outlook.com을 flatten하지 말라고 안내하며, Google과 Microsoft의 include는 이미 각각 조회 1회입니다. 대량 발송 업체를 news.example.com 같은 서브도메인으로 옮기면 자체 레코드와 조회 10회가 생깁니다.
이전
include:mailgun.org
- 조회
- 5
- 가져온 레코드
- 5
- 내 레코드의 바이트
- 19
- Mailgun이(가) 범위를 변경
- 즉시 반영됨
이후
ip4:159.135.224.0/20 ip4:69.72.32.0/20 ip4:204.220.90.0/23 ip4:204.220.92.0/22 +18개 더
- 조회
- 0
- 내 레코드의 바이트
- 450
- 필요한 TXT 문자열
- 2
- Mailgun이(가) 범위를 변경
- 복사본이 오래됨
오래된 복사본의 위험. 지금 범위 22개를 복사해 두었는데, Mailgun이(가) 범위를 추가하면 누군가 알아채고 레코드를 고칠 때까지 그 범위의 메일은 SPF를 통과하지 못합니다.
- 복사
- Mailgun이(가) 범위 추가
- 그 범위의 메일이 SPF 실패
~all과 -all의 차이(그리고 DMARC)
마지막 항목은 등록되지 않은 모든 발신자가 어떻게 처리될지를 정합니다. -all은 fail로 가장 강한 선언이고, ~all은 softfail로 "아마 아님"이며, ?all은 neutral로 수신 서버가 SPF가 없는 것과 똑같이 취급하고, +all은 누구나 pass시키므로 절대 게시하면 안 됩니다.
~all과 -all 사이에는 틀린 답이 없습니다. Google은 Google Workspace에 ~all을, Microsoft는 Microsoft 365에 -all을 안내합니다. DMARC를 강제 정책으로 쓰면 ~all은 DKIM에 대한 판단을 DMARC에 맡깁니다: 일부 수신 서버는 DMARC가 통과한 DKIM 서명을 확인하기 전에 -all만으로 거부하므로 전달된 메일이 반송될 수 있습니다(RFC 9989 §7.1).
~all-all?all?all로 끝납니다: include 안에서는 pass만 일치하므로 거기서는 무해합니다.+allDMARC p=reject와 함께 쓴 -all
- SPF 결과 fail
- SMTP에서 거부
- DKIM은 확인하지 않음
일부 수신 서버는 SPF를 먼저 처리하므로, 유효한 DKIM 서명이 있는 전달된 메시지도 DMARC가 실행되기 전에 거부될 수 있으며, 이 손실은 DMARC 보고서에 나타나지 않습니다.
DMARC p=reject와 함께 쓴 ~all
- SPF 결과 softfail
- DMARC가 DKIM 확인
- 정렬된 DKIM: pass
DMARC가 결정합니다. 다만 DKIM 서명이 없으면 Microsoft는 ~all 실패에 대해 DMARC가 사실상 무시된다고 하며, 그래서 -all를 권장합니다.
~all과 -all은 모두 유효한 선택입니다. ?all은 아무 선언도 하지 않고, +all은 누구나 pass시킵니다.자주 보는 SPF 오류와 해결 방법
깨진 레코드의 대부분은 세 가지 실수에서 나옵니다: 첫 번째 레코드와 합치지 않고 옆에 SPF 레코드를 하나 더 추가함, 이미 떠난 업체의 include가 남아 있음, 문서에서 복사한 값에 오타가 있음.
업체 문서에 이런 실수가 그대로 실려 있기도 합니다: Mimecast는 –all을 엔 대시로, Postmark는 include: spf.mtasv.net을 공백과 함께, Twilio SendGrid는 존재하지 않는 aaaa 메커니즘을 안내합니다. 구문 오류가 하나라도 있으면 레코드 전체가 permerror입니다. 반면 도메인 끝의 점은 유효합니다.
SPF 레코드 2개permerror
v=spf1 include:_spf.google.com ~allv=spf1 include:sendgrid.net ~all해결: 하나로 합치세요: v=spf1 하나, 모든 include는 한 번씩, 종료 항목 하나.
조회 10회 초과permerror
v=spf1 include:_netblocks.mimecast.com include:mailgun.org -all조회 14회
해결: 더 이상 쓰지 않는 발신자를 지우거나, 대량 발송 업체에 자체 서브도메인을 주세요.
세 번째 void 조회permerror
v=spf1 a:old.example.com mx:gone.example.net exists:%{i}.spf.example.org -allvoid 3회
해결: 없어진 이름의 항목을 삭제하고 exists include는 맨 뒤에 두세요.
SPF 레코드가 없는 이름의 includepermerror
v=spf1 include:spf.retired-vendor.example -all해결: 이름을 수정하거나, 떠난 업체를 제거하세요.
–all의 엔 대시permerror
v=spf1 include:_netblocks.mimecast.com –allMimecast의 공식 문서에 이 형태로 실려 있음
해결: 일반 하이픈을 쓰세요: -all.
include: 뒤의 공백permerror
v=spf1 a mx include: spf.mtasv.net ~allPostmark의 공식 문서에 이 형태로 실려 있음
해결: include:spf.mtasv.net
aaaa 메커니즘permerror
v=spf1 aaaa:example.com ~allTwilio SendGrid의 공식 문서에 이 형태로 실려 있음
해결: a:example.com. a가 이미 IPv6 발신자의 AAAA 레코드와도 일치합니다.
끝의 점유효
v=spf1 include:spf.protection.outlook.com. -all유효: RFC 7208 §7.3은 게시하지 말라고 하지만, 수신 서버는 받아들여야 합니다.
Zendesk의 도움말에는 “redirect: 구문을 지원합니다”라고도 되어 있지만, 수정자는 redirect=로 씁니다(RFC 7208 §6.1).
Gmail, Yahoo, Microsoft의 요건
2024년 2월부터 Gmail과 Yahoo는 모든 발신자에게 SPF 또는 DKIM 설정을 요구합니다. 대량 발송자는 둘 다, 최소 p=none의 DMARC 레코드, 그리고 둘 중 하나와 정렬된 From: 도메인이 필요합니다. Outlook.com은 대량 발송자에게 SPF와 DKIM을 모두 요구하며, 2025년 5월 5일부터 이를 갖추지 않은 메일을 거부하고 있습니다.
Gmail의 기준은 개인 계정으로 하루 5,000통 초과이고, Yahoo는 기준을 공개하지 않습니다. SPF만으로는 메일이 "정렬"되지 않습니다: MAIL FROM 도메인이 제공업체의 반송 도메인이 아니라 자기 도메인이어야 합니다.
| Gmail | Yahoo | Outlook.com | |
|---|---|---|---|
| 대량 발송 기준 | Gmail개인 Gmail 계정으로 하루 5,000통 초과, 기본 도메인 기준 | Yahoo공개된 기준 없음: “발송량 기준을 명시하지 않습니다” | Outlook.com하루 5,000통 초과(Microsoft 블로그), 하나의 From: 도메인에서 5,000통 이상(지원 문서) |
| 모든 발신자 | GmailSPF 또는 DKIM, 그리고 정방향·역방향 DNS, TLS, 0.3% 미만의 스팸 신고율 | YahooSPF 또는 DKIM, 그리고 정방향·역방향 DNS, 0.3% 미만의 스팸 신고율 | Outlook.com필수 규칙 없음 |
| 대량 발송자 | GmailSPF 그리고 DKIM, DMARC(p=none이면 충분), SPF 또는 DKIM과 정렬된 From:, 마케팅 메일의 원클릭 구독 취소 | YahooSPF 그리고 DKIM, 최소 p=none이며 통과하는 DMARC, SPF 또는 DKIM과 정렬된 From:, 원클릭 구독 취소 | Outlook.comSPF가 반드시 pass하고 DKIM도 반드시 pass, 최소 p=none의 DMARC, SPF 또는 DKIM과 정렬 |
| 시행 시기 | Gmail2024년 2월 1일. 거부는 2025년 11월부터 강화 | Yahoo2024년 2월 | Outlook.com2025년 5월 5일(거부) |
| SPF 실패 표시 | Gmail4.7.275.7.27 | YahooSPF에 대해서는 안내 없음 | Outlook.com550 5.7.515 |
일본: NTT docomo의 가장 엄격한 설정 「全て拒否する」은 도메인의 SPF 레코드가 허용하지 않은 IP에서 온 메일과, SPF 레코드를 아예 게시하지 않은 도메인의 메일을 거부합니다. docomo.ne.jp
출처support.google.comsenders.yahooinc.comtechcommunity.microsoft.com
SPF 조회와 dig, nslookup의 차이
dig와 nslookup은 리졸버가 가진 TXT 레코드를 보여 줍니다: SPF 레코드와 해당 이름에 있는 그 밖의 레코드입니다. include를 따라가거나 조회와 void를 세지 않으며, 수신 서버가 어떻게 판단할지도 알려 주지 않습니다.
이 도구 같은 SPF 조회는 레코드 전체를 따라가므로 수치가 수신 서버의 계산과 일치합니다. 이름 하나를 볼 때는 dig, 판정을 볼 때는 이 확인 도구를 사용하세요.
dig TXT | nslookup -type=TXT | ||
|---|---|---|---|
| TXT 레코드 표시 | 이 확인 도구예항목별로 나눠서 | dig TXT예 | nslookup -type=TXT예 |
| 긴 레코드의 문자열 이어 붙이기 | 이 확인 도구예수신 서버처럼 | dig TXT아니요문자열을 따로 표시 | nslookup -type=TXT아니요문자열을 따로 표시 |
| 모든 include 따라가기 | 이 확인 도구예트리 전체 | dig TXT아니요쿼리당 이름 하나 | nslookup -type=TXT아니요쿼리당 이름 하나 |
| 10회까지 조회 세기 | 이 확인 도구예include별 누적 횟수 | dig TXT아니요직접 | nslookup -type=TXT아니요직접 |
| void 조회 세기 | 이 확인 도구예이름과 함께 | dig TXT아니요 | nslookup -type=TXT아니요 |
| 레코드 2개 = permerror라고 알려 줌 | 이 확인 도구예 | dig TXT아니요둘 다 출력 | nslookup -type=TXT아니요둘 다 출력 |
| 발신 IP 테스트 | 이 확인 도구예check_host와 일치한 항목 | dig TXT아니요 | nslookup -type=TXT아니요 |
| 내 리졸버에 질의 | 이 확인 도구아니요저희 서버에서 Google Public DNS로 | dig TXT예 | nslookup -type=TXT예 |
SPF 레코드 확인: 자주 묻는 질문
SPF 레코드 확인이란 무엇인가요?
IP 주소가 내 도메인의 메일을 보낼 수 있는지 어떻게 테스트하나요?
"SPF too many DNS lookups"는 무슨 뜻인가요?
SPF permerror란 무엇인가요?
SPF의 void 조회란 무엇인가요?
SPF 레코드는 ~all과 -all 중 무엇으로 끝내야 하나요?
도메인에 SPF 레코드를 두 개 둘 수 있나요?
SPF flattening이란 무엇이며 사용해야 하나요?
서브도메인에도 자체 SPF 레코드가 필요한가요?
SPF가 여기서는 pass인데 Gmail에서는 fail인 이유는 무엇인가요?
SPF, DKIM, DMARC는 어떻게 다른가요?
SPF 레코드를 변경하면 적용되기까지 얼마나 걸리나요?
부족한 점이 있습니까?기능 또는 새 도구 제안하기
관련 이메일·DNS 도구
MX 조회
메일 교환 레코드 및 메일 서버 세부 정보 확인
DMARC 레코드 확인
도메인의 DMARC 정책 및 정렬 설정 확인
DKIM 확인
자동 셀렉터 감지로 DKIM 레코드 검증
이메일 헤더 분석
원시 이메일 헤더를 분석하고 이메일 경로 추적
IP 블랙리스트 확인
IP 주소가 스팸 또는 악성코드 블랙리스트에 등록되었는지 확인
역방향 DNS 조회
PTR 레코드로 IP 주소에 연결된 호스트 이름 검색
DNS 조회
도메인 자체 네임서버의 모든 DNS 레코드를 Google·Cloudflare 캐시와 나란히 확인
SPF 레코드 생성기
이메일 서비스와 서버에 맞는 유효한 SPF TXT 레코드를 만들고 DNS 조회 10회 제한을 실시간으로 확인
