도입
어느 날 고객으로부터 연락이 옵니다.
"귀사에서 이상한 이메일을 받았는데, 이거 진짜인가요?"
확인해 보니, 누군가가 우리 회사 도메인(@yourcompany.com)을 사칭하여 피싱 메일을 보내고 있습니다.
이메일 시스템은 기본적으로 "보낸 사람" 주소를 검증하는 기능이 없기 때문에, 아무나 우리 도메인을 넣어서 이메일을 보낼 수 있습니다.
이런 이메일 스푸핑(Email Spoofing)을 방지하는 첫 번째 방어선이 바로 SPF(Sender Policy Framework)입니다.
SPF란? — 한 줄 정의
SPF(Sender Policy Framework)란, 도메인 소유자가 "이 도메인으로 이메일을 보낼 수 있는 서버 목록"을 DNS에 공개하여, 수신 서버가 허용되지 않은 서버에서 온 이메일을 식별할 수 있게 하는 이메일 인증 기술입니다.
쉽게 말해, "방문자 명단"입니다 — 우리 도메인 대신 이메일을 보낼 수 있는 서버를 미리 등록해 둡니다
수신 메일 서버는 이 명단을 확인하여, 명단에 없는 서버에서 온 이메일을 의심스러운 메일로 처리합니다
DNS TXT 레코드로 게시합니다
왜 SPF가 필요한가요?
이메일 프로토콜(SMTP)은 1980년대에 설계되었고, 발신자 인증 기능이 없습니다.
누구든 "보낸 사람" 필드에 아무 이메일 주소를 넣어서 보낼 수 있습니다.
SPF가 있을 때 | SPF가 없을 때 |
|---|---|
허용된 서버 목록에 없는 발신은 실패 처리 | 누구든 우리 도메인으로 이메일 발송 가능 |
도메인 사칭(스푸핑) 시도를 수신 서버가 탐지 | 사칭 이메일과 정상 이메일을 구분할 수 없음 |
도메인 평판(Reputation) 보호에 기여 | 스팸 발송자가 도메인 평판을 훼손 |
이메일 전달률(Deliverability) 향상 | 정상 이메일도 스팸으로 분류될 가능성 높음 |
DMARC 정책 적용의 토대 | DMARC를 적용해도 SPF 검증 불가 |
2024년부터 Google, Yahoo, Microsoft는 대량 발송자에게 SPF, DKIM, DMARC를 모두 필수로 요구합니다. SPF가 없으면 이메일이 거부되거나 스팸으로 분류될 수 있습니다.
SPF는 어떻게 작동하나요?
1단계: 도메인 소유자가 SPF 레코드 게시
도메인의 DNS에 허용된 발신 서버 목록을 TXT 레코드로 게시합니다
예:
v=spf1 ip4:192.168.1.100 include:_spf.google.com -all
2단계: 이메일 발송
이메일이 발송되면, 발신 서버의 IP 주소가 이메일과 함께 전달됩니다
3단계: 수신 서버가 SPF 레코드 확인
수신 메일 서버가 이메일의 Return-Path(반송 주소) 도메인에서 SPF 레코드를 DNS로 조회
발신 서버의 IP 주소가 SPF 레코드의 허용 목록에 있는지 확인
4단계: 결과 판정
Pass: 발신 IP가 허용 목록에 있음 → 정상
Fail: 허용 목록에 없음 → SPF 레코드의 정책에 따라 처리
SoftFail: 허용 목록에 없지만 엄격하게 거부하지는 않음 (테스트 단계에서 주로 사용)
Neutral: 판단 보류
SPF 레코드 구성 요소
SPF 레코드는 여러 메커니즘(Mechanism)과 한정자(Qualifier)로 구성됩니다.
주요 메커니즘
메커니즘 | 의미 | 예시 |
|---|---|---|
ip4 | 특정 IPv4 주소 또는 범위를 허용 | ip4:203.0.113.0/24 |
ip6 | 특정 IPv6 주소 또는 범위를 허용 | ip6:2001:db8::/32 |
include | 다른 도메인의 SPF 레코드를 참조 | include:_spf.google.com |
a | 도메인의 A 레코드 IP를 허용 | a:mail.example.com |
mx | 도메인의 MX 레코드 서버를 허용 | mx |
all | 위 규칙에 해당하지 않는 모든 발신에 대한 기본 정책 | -all |
한정자 (Qualifier)
한정자 | 의미 | 사용 예 |
|---|---|---|
+ (Pass) | 허용 (기본값, 생략 가능) | +ip4:1.2.3.4 |
- (Fail) | 허용되지 않음 → 거부 | -all |
~ (SoftFail) | 허용되지 않지만 엄격히 거부하지 않음 | ~all |
? (Neutral) | 판단 보류 | ?all |
실전 팁: SPF 레코드 끝의 all 앞 한정자가 핵심입니다. -all은 "목록에 없으면 거부", ~all은 "목록에 없으면 의심하되 일단 받아줘"입니다. 최종 목표는 -all이지만, 처음에는 ~all로 시작하여 정상 이메일이 차단되지 않는지 확인하는 것이 안전합니다.
SPF 레코드 읽는 법 — 실전 예시
실제 SPF 레코드를 하나 분석해 보겠습니다.
v=spf1 ip4:203.0.113.5 include:_spf.google.com include:servers.mcsv.net ~all
부분 | 의미 |
|---|---|
v=spf1 | SPF 버전 1 (항상 이것으로 시작) |
ip4:203.0.113.5 | 이 IP 주소의 서버에서 보내는 이메일을 허용 |
include:_spf.google.com | Google Workspace의 메일 서버를 허용 |
include:servers.mcsv.net | Mailchimp의 메일 서버를 허용 |
~all | 위 목록에 없는 서버에서 보낸 이메일은 SoftFail 처리 |
SPF vs DKIM vs DMARC — 뭐가 다른가요?
구분 | SPF | ||
|---|---|---|---|
핵심 질문 | "이 서버가 이 도메인으로 메일을 보낼 권한이 있는가?" | "이메일이 변조되지 않았는가?" | "인증 실패 시 어떻게 처리할 것인가?" |
검증 대상 | 발신 서버 IP 주소 | 이메일 콘텐츠 무결성 + 발신 도메인 | SPF/DKIM 결과 + From 주소 정렬 |
비유 | 방문자 명단 | 위조 방지 도장 | 경비 지침 |
DNS 레코드 | TXT (도메인) | TXT (selector._domainkey.도메인) | TXT (_dmarc.도메인) |
단독 사용 시 한계 | 이메일 내용 변조 감지 불가, From 주소 정렬 미검증 | 인증 실패 시 처리 정책 없음 | SPF 또는 DKIM 없이는 작동 불가 |
세 가지가 함께 작동해야 완전한 보호가 됩니다. SPF는 "허용된 서버인가?", DKIM은 "내용이 진짜인가?", DMARC는 "실패하면 어떻게 할 것인가?"를 각각 담당합니다. 하나만 있으면 빈틈이 생깁니다.
SPF 설정하는 법
1. 이메일 발송 서비스 목록 정리
우리 도메인으로 이메일을 보내는 모든 서비스를 파악합니다
자체 메일 서버, Google Workspace, Microsoft 365, 마케팅 도구(Mailchimp, HubSpot 등), CRM, 고객 지원 도구, 트랜잭션 이메일 서비스 등
빠뜨리면 해당 서비스의 이메일이 SPF 실패 처리됩니다
2. SPF 레코드 작성
v=spf1로 시작하고, 각 서비스의 IP 또는 include 도메인을 추가합니다마지막에
~all(SoftFail) 또는-all(Fail)을 붙입니다처음에는
~all로 시작하여 테스트 후-all로 강화하는 것을 권장합니다
3. DNS에 TXT 레코드 등록
도메인의 DNS 관리 콘솔에서 TXT 레코드를 추가합니다
호스트:
@또는 빈칸 (도메인 루트)값: 작성한 SPF 레코드 전체
4. 테스트 및 검증
테스트 이메일을 보내고 이메일 헤더에서 SPF 결과를 확인
Gmail에서 "원본 보기"로
Received-SPF: pass여부를 확인온라인 SPF 검증 도구(MXToolbox 등)로 레코드 문법 확인
SPF 설정 시 주의사항
❌ 하지 마세요 | ✅ 이렇게 하세요 |
|---|---|
하나의 도메인에 여러 개의 SPF 레코드 게시 | SPF 레코드는 반드시 1개만 — 여러 서비스는 하나의 레코드에 통합 |
DNS Lookup 10개 제한 초과 | include, a, mx 등 DNS 조회가 필요한 메커니즘은 총 10개까지만 가능 |
서드파티 서비스를 SPF에 추가하지 않음 | 우리 도메인으로 메일 보내는 모든 서비스를 빠짐없이 포함 |
SPF만 설정하고 DKIM, DMARC는 무시 | SPF + DKIM + DMARC 세 가지를 모두 설정 |
설정 후 방치하고 새 서비스 추가 시 갱신 안 함 | 새로운 이메일 발송 서비스 도입 시 즉시 SPF 레코드에 반영 |
처음부터 -all로 시작 | ~all로 시작하여 테스트 후 -all로 강화 |
DNS Lookup 10개 제한은 가장 흔한 실수입니다. include, a, mx, redirect 등 DNS 조회가 필요한 메커니즘은 총 10개까지만 허용됩니다. 이를 초과하면 SPF 검증 자체가 실패(PermError)합니다. ip4, ip6는 DNS 조회가 아니므로 제한에 포함되지 않습니다.
SPF의 한계
SPF는 이메일 인증의 중요한 첫 단계지만, 단독으로는 완벽하지 않습니다.
From 주소를 검증하지 않음: SPF는 Return-Path(봉투 발신 주소)를 검증하지만, 사용자가 실제로 보는 "보낸 사람(From)" 주소는 검증하지 않습니다. DMARC의 정렬(Alignment) 기능이 이 갭을 메웁니다
이메일 내용 변조 감지 불가: SPF는 발신 서버만 확인하고, 이메일 내용이 중간에 변조되었는지는 알 수 없습니다. 이것은 DKIM의 역할입니다
이메일 전달(Forwarding) 시 깨짐: 이메일이 전달되면 발신 서버 IP가 바뀌므로 SPF가 실패할 수 있습니다
DNS Lookup 10개 제한: 많은 서드파티 서비스를 사용하면 제한에 도달하기 쉽습니다
SPF가 B2B 비즈니스에 미치는 영향
콜드 이메일 전달률: SPF가 없으면 아웃바운드 영업 이메일이 스팸함으로 직행할 가능성이 높습니다
마케팅 이메일: 뉴스레터, 프로모션 이메일의 도달률에 직접 영향
거래 이메일: 주문 확인, 비밀번호 재설정 등 중요한 거래 이메일이 전달되지 않을 수 있습니다
도메인 평판: SPF 없이 사칭당하면 도메인 블랙리스트에 올라갈 위험
파트너/고객 신뢰: 보안에 민감한 B2B 고객은 이메일 인증 여부를 확인합니다
핵심 요약
항목 | 내용 |
|---|---|
SPF란 | 도메인 대신 이메일을 보낼 수 있는 서버 목록을 DNS에 게시하는 인증 기술 |
작동 원리 | 수신 서버가 발신 IP를 SPF 레코드의 허용 목록과 대조 |
레코드 위치 | DNS TXT 레코드 (도메인 루트) |
DKIM과의 차이 | SPF는 "누가 보냈는가(서버)", DKIM은 "변조되지 않았는가(콘텐츠)" |
DMARC와의 관계 | DMARC는 SPF/DKIM 결과 + From 주소 정렬을 확인하고 정책을 적용 |
주의사항 | 레코드 1개만, DNS Lookup 10개 제한, 모든 발송 서비스 포함 |
비유 | "방문자 명단" — 허용된 서버만 우리 이름으로 메일을 보낼 수 있음 |