DKIM이란?
DKIM(도메인키 식별 메일)은 발신 서버가 메일에 디지털 서명을 추가하는 이메일 인증 방식입니다. 수신 서버는 DNS에 게시된 공개 키로 서명을 검증해 전송 중 메일이 변경되지 않았고 주장된 도메인에서 발송되었는지 확인합니다.
DKIM의 작동 방식
1. 키 생성: 도메인 소유자가 공개 키와 개인 키의 쌍을 생성합니다.
2. DNS 게시: 공개 키를 TXT 레코드로 게시합니다.
3. 메시지 서명: 발신 메일에 개인 키로 서명합니다.
4. 서명 검증: 수신 서버가 공개 키를 가져와 서명을 검증합니다.
서명 과정
이메일을 보낼 때:
1. Mail server calculates a hash of message headers and body
2. Hash is encrypted with the private key (creating the signature)
3. Signature is added as a DKIM-Signature header
4. Email is transmitted
검증 과정
이메일을 받을 때:
1. Server extracts the DKIM-Signature header
2. Finds selector and domain (s=selector; d=domain.com)
3. Queries DNS for selector._domainkey.domain.com TXT record
4. Uses public key to decrypt the signature
5. Calculates its own hash of the message
6. Compares: match = pass, mismatch = fail
DKIM 레코드 형식
DKIM 레코드는 특정 하위 도메인에 있는 TXT 레코드입니다.
selector._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0..."
레코드 구성 요소
| 태그 | 설명 | 예시 |
|---|---|---|
| v | 버전 | v=DKIM1 |
| k | 키 유형 | k=rsa |
| p | 공개 키(base64) | p=MIGfMA0GCSqG... |
| t | 플래그(선택 사항) | t=y (testing mode) |
| h | 해시 알고리즘 | h=sha256 |
셀렉터
셀렉터를 사용하면 도메인마다 여러 DKIM 키를 둘 수 있습니다.
google._domainkey.example.com # Google Workspace
s1._domainkey.example.com # Sendgrid
mailchimp._domainkey.example.com # Mailchimp
각 이메일 서비스는 자체 셀렉터와 키를 제공합니다.
DKIM 서명 헤더
DKIM 서명은 다음과 같은 형태입니다.
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=google;
c=relaxed/relaxed; q=dns/txt;
h=from:to:subject:date:message-id;
bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=;
b=AuUoFEfDxTDkHlLXSZEpZj79...
주요 필드:
- d=: 서명 도메인
- s=: DNS 레코드를 찾는 셀렉터
- h=: 서명에 포함된 헤더
- b=: 실제 서명
- bh=: 본문 해시
DKIM 설정
Google Workspace에서 설정
1. 관리자 콘솔에서 앱 → Gmail → 이메일 인증 메뉴로 이동합니다.
2. DKIM 키를 생성합니다(2048비트 권장).
3. Google이 제공한 TXT 레코드를 추가합니다.
4. DKIM 서명을 활성화합니다.
제3자 서비스에서 설정
대부분의 이메일 서비스(SendGrid, Mailchimp 등)는 다음 중 하나를 제공합니다.
1. 관리형 키를 위한 CNAME 레코드
2. 공개 키가 포함된 TXT 레코드
SendGrid 예시:
s1._domainkey.example.com CNAME s1.domainkey.sendgrid.net
DKIM 확인
헤더를 표시하는 서비스(Gmail은 인증 결과를 표시)로 테스트 메일을 보냅니다.
명령줄 사용:dig google._domainkey.example.com TXT
DomScan 사용:
curl "https://domscan.net/v1/health?domain=example.com"
# Reports DKIM status based on common selectors
DKIM 모범 사례
2048비트 키 사용
오래된 1024비트 키는 점점 취약해지고 있어 대부분의 제공업체는 2048비트를 사용합니다.
정기적으로 키 교체
매년 또는 보안 사고 후 DKIM 키를 교체합니다. 전환 전에 새 셀렉터로 새 키를 게시합니다.
중요한 헤더에 서명
From, To, Subject, Date, Message-ID가 서명에 포함되는지 확인합니다.
서명된 메시지 수정 금지
메일링 리스트나 전달 서비스가 내용을 수정하면 DKIM이 깨집니다. 전달 메일에는 ARC(Authenticated Received Chain)를 사용합니다.
DKIM의 한계
DKIM만으로는 스푸핑을 막을 수 없습니다. 메시지가 변경되지 않았다는 사실만 증명하므로, 공격자는 서명되지 않은 위조 메일을 보낼 수 있습니다. DMARC는 서명되지 않은 메시지의 처리 정책을 지정해 이 문제를 보완합니다.