iCloud Mail에 개인 도메인 연결하기 (feat. iCloud+)

들어가며
이번 포스팅에서는 iCloud Mail에 개인 도메인을 연결해서 나만의 이메일 주소를 만드는 방법을 알아보겠습니다.
참고로 iCloud Mail에서 사용자 설정 이메일 도메인 기능을 사용하기 위해서는, iCloud+ 구독이 필요합니다. (최저 ₩1,100/월)
왜 사용할까?
어른이 되면 뭔가를 시도할 때, 명분이 필요한 법이죠.
저 같은 경우는 일단
- iCloud 비공개 릴레이, 기기 동기화 용량 추가 사용을 위해 iCloud+ 구독중이고
- 블로그 운영을 위해 거금을 들여서($11) 도메인 구입했으니 활용도를 높여야 만족스럽고
- 개인 도메인으로 이메일 사용하면 뭔가 있어보임 (이게 가장 핵심입니다)
이렇게 명분 충분히 챙겼으니 바로 설정해보겠습니다.
설정하기
iCloud+ 홈페이지 접속 후 로그인 해주신 다음에
사용자 설정 이메일 도메인 등록 시작해주시고
저희가 소유한 도메인 사용할거니, 내가 소유한 도메인 추가 버튼 클릭
저 같은 경우는 저 혼자 사용할거니까 나만 버튼 클릭
도메인 주소 입력해주고, 검증 기다리면
이렇게 Cloudflare에서 구입한 도메인이면, iCloud Mail 사용에 필요한 레코드 등록을 쉽게 할 수 있도록 권한 요청 화면이 나오는데요
레코드 직접 타이핑하기 귀찮으니 권한 부여해주고 DNS 레코드 업데이트하시면
이렇게 레코드 모두 잘 등록된 것을 확인할 수 있습니다.
그런데 CNAME 보시면 저희 도메인 주소 없이 단순 sig1._domainkey 레코드만 등록된 것을 보실 수 있는데요
이렇게 Cloudflare 같은 DNS 회사에서 자동으로 sig1._domainkey.mydomain.com으로 확장해주니 걱정 안하셔도 됩니다.
이제 개발자답게 nslookup 명령어로 레코드 잘 반영되었는지 확인 한번 해주시면
# 메일서버
nslookup -type=mx day1swhan.com
day1swhan.com mail exchanger = 10 mx02.mail.icloud.com.
day1swhan.com mail exchanger = 10 mx01.mail.icloud.com.
# DKIM 확인(CNAME)
nslookup -type=cname sig1._domainkey.day1swhan.com
sig1._domainkey.day1swhan.com canonical name = sig1.dkim.day1swhan.com.at.icloudmailadmin.com.
# DKIM 확인(TXT)
nslookup -type=txt sig1.dkim.day1swhan.com.at.icloudmailadmin.com
sig1.dkim.day1swhan.com.at.icloudmailadmin.com text = "v=DKIM1; k=rsa; p=xxxxx"
# SPF, 애플 도메인 검증 확인(TXT)
nslookup -type=txt day1swhan.com
day1swhan.com text = "apple-domain=gjCxpAGJ7rLlKoz0"
day1swhan.com text = "v=spf1 include:icloud.com ~all"
이렇게 이메일이 수신, 발신에 필요한 필수 요소인 MX 레코드, 스팸 처리 당하지 않기 위한 필수 요소인 CNAME 레코드(DKIM), TXT 레코드(SPF) 모두 잘 등록된 것을 보실 수 있습니다.
최종 레코드 정리입니다.
유형 | 예상값 | 목적 |
---|---|---|
MX | mx01.mail.icloud.com, mx02.mail.icloud.com | 메일 수신 서버 설정 |
CNAME | sig1._domainkey → sig1.dkim.xxx.at.icloudmailadmin.com. | DKIM 인증 |
TXT | v=spf1 include:icloud.com ~all | SPF 설정 |
TXT | apple-domain=xxxxxxxx | apple 도메인 인증 |
확인하기
이제 설정이 모두 끝났으니, 실제로 Gmail 같은 외부 메일 서비스에서도 잘 처리되는지 확인해보겠습니다.
사용하실 이메일 주소 입력해주시고, 저희가 설정한 주소와 일치하지 않는 메일들은 수신하지 않기 위해서 모든 수신 메시지 허용 옵션은 꺼주시면됩니다.
이제 개인 Gmail 계정으로 테스트 메일 하나 보내면
이렇게 정상적으로 수신되고, 스팸으로 처리 당하지 않기위해 적용한 SPF & DKIM 설정도 정상 작동중인지 원본 메일 옵션에서 점검해보면
아직 설정하지 않은 DMARC 옵션 제외하고 정상 작동중인 것을 보실 수 있습니다.
저희 소유 도메인을 이용한 이메일 발송이 성공했으니 저희 도메인으로 이메일 수신도 잘 되는지 확인해봐야겠죠?
방금 받은 메일에 정성껏 답장 작성하고, iCloud 메일함 확인해보시면
저희 도메인 주소로 메일 수신까지 성공한 것을 보실 수 있습니다.
추가 상식
SPF, DKIM 단어 처음 들어보는 분들도 있을 것 같아서 간단한 설명 타임 가지겠습니다.
이메일이라는 도구가 세상에 나온 순간 당연히 스팸 메일도 폭발적으로 늘어나면서, 여러분 메일함도 더러워진 경험 다들 있으시죠?
AI 같이 화려한 기술로 스팸 방지하는 방법도 있지만, 저희도 실생활에서 모든 인증이 필요한 순간에 홍채&정맥 인증 하는게 아닌, 간단한 비밀번호&휴대폰 인증이라는 방법 사용하듯이 이메일 세상에서도 어느정도 간단하게 스팸 메일을 방지하기 위해서 사용하는 방법이 SPF, DKIM라는 것입니다.
DMARC 레코드라는 이메일 수신자에게 “내 메일 도메인이 SPF/DKIM 기준을 만족하지 않으면 어떻게 처리할지” 정책을 통보하는 방법도 있는데, 현재 기초 설정에선 생략하고 추후 포스팅 수정할 때 반영하도록 하겠습니다.
DKIM(DomainKeys Identified Mail)
말 그래도 도메인키 식별 메일이란 공개 키 암호화 방식을 사용해서 이메일을 검증하는 시스템입니다.
저희 케이스로 작동 원리를 설명해보면, 저희는 애플에게 iCloud Mail에서 개인 도메인을 이용해 이메일 주고 받을거라고 등록한 상황이죠?
그러면 애플은 저희 도메인에서 발송되는 메일에 사용할 공개 키, 개인 키를 내부적으로 준비한 다음에, 저희가 어딘가로 이메일을 발송하게 되면 디지털 서명을 만들어서 이메일에 첨부해줍니다.
- 이메일 원본에서 from, to, subject 같이 상대방이 수신 할 때 검증이 필요한 요소들을 뽑아서
- 개인 키를 이용해서 서명을 해주고
- 이메일 원본 파일(eml) DKIM 헤더에 서명 첨부해서 수신자에게 발송 후
- 수신 서버는 DKIM 헤더 검증을 위해서 DNS TXT 레코드 조회 (sig1._domainkey.day1swhan.com)
- TXT 레코드에 나온 공개키로 서명 확인
이 과정을 통해 수신 서버는 메일 내용의 위변조 여부를 검증할 수 있습니다.
SPF(Sender Policy Framework)
전송자 정책 프레임워크라는 뭔가 있어보이는 용어지만 이건 간단하게 자격증 증명서 같은 도구라고 생각하시면 됩니다.
위에 설명한 것처럼 nslookup으로 TXT 레코드 확인해보면 "v=spf1 include:icloud.com ~all" 이렇게 나오는데요, 이 텍스트 의미는
- day1swhan.com 도메인에서 발송되는 이메일은
- icloud.com에서도 보낼 수 있으니 알아두고 (include:icloud.com)
- 만약 icloud.com에서 보낸게 아니면 내가 보낸거 아니니까 위험한거야~ (~all)
이렇게 선언한거라고 할 수 있습니다.
이제 수신 서버가 이 정보를 기반으로 icloud.com 도메인에서 사용하는 SPF 레코드 조회 후(nslookup -type=txt icloud.com)
ip4:17.41.0.0/16 ... 이렇게 icloud.com에서 메일 발송할 때 사용하는 ip 대역이 나오는데요,
발신 서버 ip가 방금 조회한 ip 대역과 일치하는지 비교 함으로써 발신 서버의 정당성을 확인할 수 있습니다.
마무리
이렇게 iCloud Mail에 개인 소유 도메인을 연결해서 뭔가 있어보이는 이메일 서비스를 이용할 수 있고, SPF & DKIM 설정을 통해서 수신 서버에게
- "이 메일 어디서 보냈어?" (SPF)
- "진짜 네가 쓴 거 맞아?" (DKIM)
이 두 가지를 증명할 수 있게 되었습니다. (스팸함으로 추락하지 않으려면 이 정도 설정은 필수입니다)