인증과 DNS
DKIM
DKIM은 DomainKeys Identified Mail의 약자입니다. 보내는 모든 메일에 디지털 서명을 추가합니다. 받는 쪽 서버는 이 서명을 확인해, 메일이 내 도메인에서 왔고 보낸 뒤에 바뀌지 않았다는 것을 확인합니다.
DKIM이란?
DKIM은 DomainKeys Identified Mail의 약자입니다. RFC 6376에 정의되어 있습니다. DKIM은 내 서버에서 나가는 메일마다 디지털 서명을 추가합니다. 디지털 서명이란 내 서버만 만들 수 있는 긴 코드입니다.
받는 쪽 서버는 이 코드를 확인합니다. 코드가 유효하면 두 가지가 사실입니다. 메일은 내 도메인이 서명했습니다. 보낸 뒤에 아무도 메일을 바꾸지 않았습니다.
도메인이란 이메일 주소에서 @ 뒤에 오는 이름으로, example.com 같은 것입니다. DKIM은 도메인 단위로 작동합니다. 메일을 보내는 도메인은 각각 자신의 키로 서명해야 합니다.
예시: 쇼핑몰이 영수증을 보낼 때
example.com에서 운영하는 쇼핑몰이 있습니다. 레나가 램프를 사자, 쇼핑몰은 레나의 Gmail 주소로 영수증을 보냅니다. 이때 DKIM이 하는 일은 다음과 같습니다.
- 쇼핑몰의 발송 서버가 영수증 메일을 작성합니다.
- 서버는 개인 키로 메일의 서명을 만듭니다. 개인 키란 발송 서버에만 보관하는 비밀 파일입니다.
- 서버는
DKIM-Signature라는 헤더로 메일에 서명을 추가합니다. 헤더란 메일 맨 위에 있는 기술 정보 한 줄입니다. 읽는 사람에게는 보통 보이지 않습니다. - 메일이 Gmail에 도착합니다.
- Gmail이 헤더를 읽습니다. 도메인 example.com과 셀렉터 s2026a를 찾습니다.
- Gmail은 쇼핑몰의 DNS에서 그 셀렉터의 공개 키를 조회합니다. DNS는 도메인이 자신의 설정을 공개하는 공개 디렉터리입니다.
- Gmail은 공개 키로 서명을 확인합니다. 확인을 통과합니다.
- Gmail은 결과를 example.com에 대한 DKIM pass(통과)로 기록합니다.
누군가 보낸 뒤에 영수증의 금액을 바꿨다고 가정하겠습니다. 그러면 7단계의 확인은 실패합니다. 공개 키는 서명을 확인할 수는 있지만 만들 수는 없습니다. 서명은 개인 키만 만들 수 있습니다.
DKIM 서명
DKIM 서명은 여러 부분으로 이루어진 헤더 하나입니다. 각 부분을 태그라고 합니다. 태그는 문자 하나, 등호, 값으로 이루어집니다. 가장 중요한 태그는 두 개입니다.
d=: 서명한 도메인입니다. 예:d=example.coms=: 셀렉터입니다. 예:s=s2026a. 셀렉터란 키 하나를 가리키는 이름입니다. 도메인은 키를 동시에 여러 개 가질 수 있고, 키마다 셀렉터가 따로 있습니다.
헤더에는 다른 태그도 있습니다. 서명 자체는 b= 태그에, 메일 본문에 대한 코드는 bh= 태그에 들어 있습니다. 받는 쪽 서버는 이 모든 태그를 사용해 확인합니다.
DKIM 레코드
공개 키는 DKIM 레코드로 게시합니다. 이 레코드는 DNS TXT 레코드, 즉 일반 텍스트를 담는 DNS 항목입니다. 레코드 이름은 셀렉터와 도메인으로 만듭니다.
s2026a._domainkey.example.com
레코드 값은 다음과 같은 형태입니다.
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
v=DKIM1: 이것이 DKIM 레코드라는 뜻입니다.k=rsa: 키의 종류입니다.p=: 공개 키가 들어갑니다. 실제 값은 수백 자 길이입니다.
개인 키는 절대 DNS에 넣지 않습니다. 발송 서버에만 보관합니다. 키 길이는 2048비트를 사용하십시오. Gmail은 최소 1024비트를 받아들이지만 2048비트를 권장합니다. RFC 8301은 서명하는 쪽이 2048비트를 사용하도록 권고합니다.
DKIM이 중요한 이유
DKIM은 메일이 포워딩되어도 유지됩니다. 누군가 쇼핑몰의 영수증을 다른 계정으로 포워딩한다고 가정하겠습니다. 포워딩하는 서버는 자신의 IP 주소에서 메일을 보냅니다. IP 주소란 인터넷에서 서버를 식별하는 번호입니다. 그 IP 주소는 쇼핑몰의 SPF 레코드에 없으므로 SPF는 실패합니다. DKIM 서명은 메일 안에 담겨 함께 가므로 여전히 통과합니다.
DMARC는 DKIM을 사용합니다. From 주소에 표시된 도메인과 같은 도메인으로 SPF나 DKIM이 통과하면 DMARC도 통과합니다. 포워딩되면 SPF가 실패하므로, DMARC를 통과하게 만드는 확인은 DKIM인 경우가 많습니다.
DKIM은 대량 발신자에게 필수이기도 합니다. Google의 발신자 가이드라인은 Gmail로 하루 5,000통 이상 보내는 발신자에게 SPF, DKIM, DMARC를 요구합니다. Microsoft도 Outlook.com, Hotmail, Live에 같은 규칙을 적용합니다.
DKIM 설정 방법
DKIM 설정 방법은 누가 메일을 보내는지에 따라 다릅니다.
- 이메일 서비스를 사용하는 경우. Google Workspace, Microsoft 365, Mailchimp, SendGrid 같은 서비스입니다. 서비스가 키를 만들어 줍니다. DNS 호스트에 추가할 DKIM 레코드도 보여 줍니다. DNS 호스트는 보통 도메인을 구매한 회사입니다.
- 직접 메일 서버를 운영하는 경우. 키 쌍을 직접 만듭니다. Giggal.ai의 DKIM 생성기는 브라우저에서 2048비트 키 쌍과 TXT 레코드를 만듭니다. 개인 키는 서버에 설치하고, 레코드는 DNS에 게시합니다.
자주 생기는 문제 하나를 확인하십시오. 많은 이메일 서비스는 기본 설정에서 자사의 공용 도메인으로 서명합니다. 서명은 통과하지만 d=의 도메인이 내 도메인이 아니므로 DMARC 정렬(alignment)이 실패합니다. 서비스 설정에서 맞춤 DKIM(custom DKIM)을 켜서 d=에 내 도메인이 표시되게 하십시오. 이것이 왜 중요한지는 DMARC 정렬 페이지에서 설명합니다.
DKIM이 작동하는지 확인하는 방법
- 내 도메인에서 개인 Gmail 계정으로 메일을 보냅니다.
- Gmail에서 그 메일을 엽니다.
- 점 3개 메뉴를 클릭하고 “원본 보기”를 선택합니다.
- 위쪽에서 DKIM 줄을 찾습니다. 내 도메인과 함께 PASS라고 표시되어야 합니다.
FAIL이라고 표시되면 두 가지를 확인하십시오. DNS 레코드 게시가 아직 끝나지 않았을 수 있습니다. 또는 서버의 셀렉터가 DNS의 셀렉터와 정확히 일치하지 않을 수 있습니다.
DKIM과 이메일 검증
DKIM은 메일이 내 도메인에서 왔다는 것을 증명합니다. 받는 사람의 주소가 존재한다는 것은 증명하지 않습니다. 올바르게 서명된 메일도 쓰이지 않는 주소로 보내면 반송됩니다. 이메일 유효성 검사 도구는 보내기 전에 각 메일함이 존재하는지 받는 쪽 서버에 묻습니다. 대량 이메일 검증 도구는 리스트 전체에 같은 일을 합니다. DKIM은 누가 메일을 보냈는지 증명하고, 이메일 검증은 메일을 받을 수 있는 주소로 보내도록 해 줍니다.
관련 용어
- SPF 레코드SPF 레코드는 도메인에 두는 텍스트 한 줄로, 그 도메인의 메일을 보낼 수 있는 서버를 나열합니다. 받는 쪽 서버는 이 레코드를 확인해, 내 도메인에서 왔다고 주장하는 메일이 실제로 내 서버에서 보내졌는지 확인합니다.
- DMARCDMARC는 도메인의 DNS에 게시하는 규칙입니다. 내 도메인에서 왔다고 주장하지만 SPF와 DKIM을 통과하지 못한 메일을 어떻게 처리할지 받는 쪽 서버에 알려 줍니다. 보고서를 어디로 보낼지도 알려 줍니다.
- DNS TXT 레코드DNS TXT 레코드는 도메인 설정에 저장되는 텍스트 한 줄입니다. 메일 서버는 TXT 레코드를 읽어 SPF, DKIM, DMARC를 확인합니다. 다른 서비스는 TXT 레코드를 읽어 도메인 소유자가 맞는지 확인합니다.
- 이메일 스푸핑이메일 스푸핑이란 가짜 발신자 주소로 메일을 보내, 다른 사람이 보낸 것처럼 보이게 하는 것입니다. 사기범은 이 방법으로 은행, 거래처, 직장 상사를 사칭합니다. 도메인에서 스푸핑을 막는 레코드는 SPF, DKIM, DMARC입니다.
- BIMIBIMI는 지원하는 받은편지함에서 메일 옆에 브랜드 로고를 표시하는 이메일 표준입니다. Brand Indicators for Message Identification의 약자입니다. 도메인이 quarantine 또는 reject 정책으로 DMARC를 통과할 때만 작동합니다.
