SPF 란?

이메일을 전송하는 SMTP 는 송신자의 IP 를 확인하는 기능이 없습니다. 초기의 인터넷은 대학이나 국가기관등 소수의 유저들만 사용 가능했으므로 지금처럼 스팸 메일이 극성일것이라고 생각할수 없었을 겁니다.

SPF는 이런 문제를 해결하기 위해 송신자가 자신의 메일 서버 정보와 정책을 나타내는 항목을 DNS 에 등록하고 수신자는 수신시 발송자의 IP와 DNS에 등록한 SPF IP 를 비교해서 수신 여부를 결정하는 표준입니다.


SPF에 대한 자세한 내용은 인터넷진흥원의 spam 센터에서 확인해 볼 수 있습니다.

메일서버등록제(SPF: Sender Policy Framework)
메일서버 정보를 사전에 DNS에 공개 등록함으로써 수신자로 하여금 이메일에 표시된 발송자 정보가 실제 메일서버의 정보와 일치하는지를 확인할 수 있도록 하는 인증기술

  • 대다수 스팸발송자가 자신의 신원을 감추기 위하여 발송자 주소나 전송경로를 허위로 표기하거나 변경하는 경우가 많다는데 착안

SPF를 이용한 이메일 인증절차

  • 발신자 : 자신의 메일서버 정보와 정책을 나타내는 SPF 레코드를 해당 DNS에 등록
  • 수신자 : 이메일 수신시 발송자의 DNS에 등록된 SPF 레코드를 확인하여 해당 이메일에 표시된 발송IP와 대조하고 그 결과값에 따라 수신여부를 결정 (메일서버나 스팸차단솔루션에 SPF 확인기능이 설치되어 있어야 함)

특정 도메인이 SPF 필드를 등록했는지 여부는 nslookup 으로 TXT 필드를 조회하면 확인할 수 있습니다.

$ nslookup -q=txt google.com


Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
google.com      text = "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
google.com      text = "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
google.com      text = "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
google.com      text = "v=spf1 include:_spf.google.com ~all"
google.com      text = "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"

Authoritative answers can be found from:
BASH

또는 host 명령어를 사용해도 됩니다.

$ host -t txt google.com

google.com descriptive text "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
google.com descriptive text "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
google.com descriptive text "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
google.com descriptive text "v=spf1 include:_spf.google.com ~all"
google.com descriptive text "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
BASH


TXT 레코드중 다음 내용이 SPF 와 관련된 설정입니다.

"v=spf1 include:_spf.google.com ~all"
CODE


SPF mechanism

SPF 는 어떻게 동작할지를 정의하는 메카니즘(Mechanism)이라 불리는 규칙을 정의할 수 있으며 zero 또는 하나 이상의 메카니즘을 설정할 수 있습니다.

all | ip4 | ip6 | a | mx | ptr | exists | include
CODE

SPF 메카니즘의 해석은 앞에서 뒤로 이루어 집니다.


메카니즘의 맨 뒤는 다음 4개의 한정자(qualifiers) 중 하나로 끝나며 의미는 다음과 같습니다.

  • "+" :  Pass :  IP 가 일치하면 SPF 통과합니다.
  • "-":    Fail:     IP가 일치하면 SPF 실패 처리합니다.
  • "~":   SoftFail : IP가 일치할 경우 SPF SoftFail로 처리하며 의미는 수신자가 메일 수신을 허용할 수 있지만 SPF failure 라고 표시합니다.
  • "?":    Neutral: IP 가 일치할 경우 SPF pass 또는 fail 로 처리합니다.


-all 과 ~all 의 의미는 다음과 같습니다.

  • - 의미:  수신 서버는 SPF 레코드에 없는 발신자의 메일을 drop 할 수 있습니다.
  • ~ 의미:  수신 서버는 일반적으로 SPF 레코드에 없는 발신자의 메일을 수신하지만 의심스러운 메일로 표시합니다.


a 메카니즘

해당 도메인의 모든 a 레코드 중 하나가 발송 호스트의 IP와 일치할 경우 이 메커니즘이 적용되며 도메인 명이 명시되지 않은 경우 현재 도메인을 사용합니다.


다음 설정은 도메인의 A 레코드가 발송 호스트의 IP 와 동일한 서버만 메일을 발송하며 그 이외의 호스트에서는 발송하지 않습니다.

v=spf1 a -all
CODE


다음 설정은 발송 호스트의 IP 가 example.com 의 A 레코드와 동일한 서버만 메일을 발송하며 그 이외의 호스트에서는 발송하지 않습니다.

v=spf1 a:example.com -all
CODE

mx 메카니즘

해당 도메인의 모든 mx 레코드의 A 레코드 중 하나가 발송호스트의 IP와 일치 하도록 할 때 이 메커니즘을 사용합니다.


다음은 발송호스트 IP가 발송 도메인의 mx 레코드 중 하나의 IP와 일치하거나 deferrals.example.com 의 mx 레코드에 등록된 IP와 동일한 서버만 메일을 발송하며 그 이외의 어떤 호스트에서도 메일을 발송하지 않습니다.

v=spf1 mx mx:deferrals.example.com -all
CODE


다음은 발송 호스트 IP가 발송 도메인의 mx 레코드의 C 클래스 네트워크 주소중 하나와 일치하거나 외부 도메인(site.external.com) 의 mx 레코드의 C 클래스와 일치하는 IP 에서만 메일을 발송하며 그 이외의 어떤 호스트에서도 메일을 발송하지 않습니다.

v=spf1 mx/24 mx:site.external.com/24 -all
CODE


ip4 메카니즘

발송 호스트의 IP 를 CIDR 로 정의된 네트워크의 IP 범위와 일치시킵니다. CIDR 을 생략할 경우 /32 가 적용됩니다.


다음은 발송 호스트의 IP 가 192.168.0.1/16 구간에 있는 호스트만 메일을 발송하며 그 이외의 어떤 호스트에서도 메일을 발송하지 않습니다.

v=spf1 ip4:192.168.0.1/16 –all
CODE

include 메카니즘

발송 호스트의 IP가 해당 도메인의 외부에 위치할 때(즉 타사 이메일 서버에서 발송할때) include를 사용하여 외부 발송 도메인을 정의할 수 있습니다.

v=spf1 include:servers.mail.net -all
CODE


all 메카니즘

모든 경우에 해당되며 항상 레코드의 마지막에 위치합니다.

다음 설정은 해당 도메인은 메일을 발송하지 않음을 의미합니다.

"v=spf1 -all"
CODE


같이 보기

Ref