요즘 메일 보내는게 까다로워 졌습니다.
그냥 보내면 어김없이 스팸함으로 가버립니다.
조금 찾아보면,
SPF
, DMARC
, DKIM
등등 왠 사람 이름 같은 기술 제시하며 뭘 하라고 합니다.
아니 뭐 이렇게 많아요? 이거 다 해야돼요?
사실 별거 아닙니다.
오늘 위 3가지 기술의 배경과 스팸으로 가는 이유를 알아봐요~
우선, 상식적으로 생각해보세요.
우리가 편지를 상대방에게 주려면, 물리적으로 만나야 합니다. (우체부를 통한 전달도 만남의 일종)
이메일도 마찬가지 인데요.
메일을 보내려면, 당연히 메일 서버에 접속해서 데이터(메일)를 전달 해야 합니다.
그러니까 중요한건, 메일을 보낼 때, 직접 내 메일을 수신자의 메일 서버로 갖다 주는 방식 이라는 것입니다.
수신자의 메일 서버가 어딘가에서 가져오는게 아니라요.
누가 메일을 갖다주냐구요?
메일 발신 서버
가요.
우리가 인터넷에서 게시판에 글을 올리는 것과 하등 차이가 없습니다.
원인 제공자가 찾아가는 서비스
인것이죠.
a@sender.com
가 b@receiver.com
에게 메일을 보낸다고 가정 할께요.
a
는 sender.com
의 웹메일에 들어가서 메일을 작성 합니다. (웹메일이 있다고 가정)보내기
를 누릅니다.이때, 내부적으로 어떤 일이 일어나는지, 하나씩 따라가볼께요.
메일을 보낼때는 TCP/IP
위에서 SMTP
라는 프로토콜을 씁니다.
sender.com
의 메일 처리 서버는, 수신자의 도메인을 확인 합니다.receiver.com
겠죠? DNS
서버에 질의를 하는데요.DNS
가 맞아요. 근데 MX
레코드 (Mail-eXchange)를 요청 합니다.receiver.com
도메인 소유자가 등록해 놓은 메일 (받을) 서버 IP
를 알려 달라고 하는 것입니다. sender.com
서버는 거기로 가서 메일을 던지고 와야 하니까요.SSL/TLS
는 빼고 얘기할께요.)@앞부분 b
라는 유저의 메일함에 넣게 됩니다.굉장히 상식적이죠?
그런데 문제가 있어요.
일단 원래도 프로토콜이 빈약 했는데, 인터넷이 발전하면서 더 문제가 많아졌어요.
얼핏 봐도 많은 문제가 있죠.
대부분은 요즘 기술적으로 해결을 했습니다.
SSL
을 사용하고, MX 서버
도 큐잉을 하는 등 많은 발전이 있었지만…
위조 문제는 프로토콜 자체를 뜯어고치지 않는 한 어쩔수 없었어요.
스팸 메일을 근본적으로 해결하지 못한 이유죠.
무료로 불특정 다수에게 뭔가를 심기에 최고이기 때문 입니다.
그리고 메일 프로토콜 특성상, 스팸에 대응하기가 까다롭죠. (위조 가능 문제+누구나 발신 문제)
그래서 나왔습니다. 세가지 사람 이름 같은 기술이…
SPF
, DKIM
, DMARC
말이에요.
하나씩 알아보죠.
이것은 위 문제중, 발신자가 진짜인지 확인하는 기술 입니다.
v=spf1 ip4:192.0.2.0/24 include:_spf.google.com -all
이렇게 생겼는데요.
간단해요
TXT 레코드
로 SPF 정보
를 넣어둡니다.sender.com
도메인 소유자가 자신의 DNS
에 TXT
로 SPF
관련 정보를 넣어두는 거죠.a@sender.com
라고 하면, DNS
에게 sender.com
의 SPF
정보를 물어보는거죠.receiver.com)
지금 메일을 보내러 들어온 니 IP는 1.1.1.1 인데 말야. receiver.com)
내가 sender.com 의 SPF의 IP를 보니깐, 2.4.6.8 이네? 넌 뭐야???공격자)
딱 걸렸내~그래서 딱 걸리면 SPF 검증에 실패
했다고 태그를 달아서 메일을 받아요.
그럼 그런 메일은 안보여주면 되겠죠.
SPF
랑 비슷한데요, 좀더 모던 하게 처리 합니다.
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3...
요렇게 생겼고,
RSA 암호화를 이용하고, 공개키/개인키 쌍을 이용 해요. 위에 p 어쩌고가 공개키 입니다.
IP 를 한정하기 어려운 상황도 있기 때문에, 키를 사용 합니다.
예를 들어 발신자가 abc.com
인데 나는 구글웍스
를 쓴다면 내가 메일 발신 IP
를 알기도 어렵잖아요?
그래서 좀 더 똑똑하게 서명 방식을 쓰는데요.
인터넷으로 똑똑하게 서명하려면 뭐다? RSA
죠 뭐.
sender.com
가 미리 자신의 공개키
를 DNS
에 넣어둡니다.sender.com
한테 메일을 받으면, DNS
에서 공개키를 갖고오고요.receiver.com)
내가 sender.com
의 키로 서명 풀어봤는데 안풀리는데? 넌 뭐야???공격자)
딱 걸렸내~이후는 SPF와 똑같겠죠?
이거는 가장 마지막 기술인데요.
v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-failures@example.com; pct=100
이렇게 생겼는데, 셋중 제일 뭔가 복잡 합니다.
SPF
, DKIM
으로 발신자를 잘 체크 하기는 했는데 말입니다.
막는 방법이 2개나 있다보니 둘다 통과 하던지, 하나만 하던지 조금씩 원하는게 다를 겁니다.
그러니까 SPF
는 통과 했는데 DKIM
은 실패했다거나, 반대라거나 등등 일때 어떻게 할지 정해주는 거예요.
그래서 발신자의 DNS의 정보에 그 처리방법을 적어둡니다.
sender.com
의 DNS
에 TXT
로 DMARC 값
을 넣는데 이게 그냥 정책 입니다.SPF
, DKIM
중 하나만 통과하면 OK냐 아니면 둘다 통과해야 OK냐 등등등 receiver.com)
내가 sender.com
의 DMARC
보니깐 넌 DKIM
통과 해야하는데 SPF
만 통과했네?공격자)
sender.com
메일 서버를 해킹 해서 SPF
통과 했는데, 딱 걸렸내~이 결과를 가지고 메일을 보여줄지 말지 스팸함으로 갈지 말지 결정 하도록 합니다.
또한 DMARC
는 사람의 개입이 필요하니, 어떤 메일들이 오고 가는지 모니터링을 해야 정책을 잘 잡을 수 있는데요.
그래서 설정 값중에 보고서를 받을 메일 주소를 넣게 됩니다.
정책 통과 못한 메일은 보고서 메일 주소로 오도록요. (메일 내용은 오지 않아요~)
이메일들을 보고 모니터링을 해야, 각각 정책을 수정할 수도 있겠죠?
HTTP/3
마냥 메일의 세계도 그냥 가만히 있지는 않았죠.
거듭 발전해 오고 있으나, 프로토콜 자체는 매우 오래된 구식 입니다.
마치 태양계 밖으로 나간 보이저 1호
를 유지보수 하는 느낌이랄까요.
최근 Gmail
이 DMARC
를 강제하면서 부랴부랴 DNS
설정 한바탕 난리 부르스
를 추신 분들이 많으실 겁니다.
하면서도 왜 하는지 몰랐다면,
에헤이 별 것 아니었네
하면서 이 글로 인해 자세히 알아가셨길 바랍니다.
다음에도 좋은 글로 찾아올께요.
아임웹 CTO 매튜 드림.