진단 · 출처 기반 답변

DKIM 실패: body hash did not verify 원인 진단

DKIM body hash did not verify 오류는 DKIM 서명이 적용된 뒤에 이메일 본문이 수정될 때 발생합니다. 수신 서버가 받은 본문의 해시를 다시 계산했는데 DKIM-Signature 헤더에 저장된 해시와 일치하지 않아 검증에 실패합니다.

본문이 수정되는 원인

가장 흔한 원인은 중간 메일 서버나 보안 장비가 메시지 내용을 변경하는 것입니다. 끝부분 공백 추가, 추적 픽셀 삽입, 법적 고지문 추가, 줄 바꿈을 CRLF에서 LF로 변경하는 것 등이 여기에 해당합니다. 본문이나 MIME 구조에서 문자 하나만 바뀌어도 암호화 해시가 무효화되어 fail 결과가 나옵니다.

정규화(Canonicalization) 설정

DKIM은 정규화 알고리즘으로 해시가 실패하기 전까지 얼마나 수정을 허용할지 결정합니다. simple 정규화는 엄격해서 어떤 변경이든 실패로 처리합니다. relaxed 정규화는 일부 공백 변경과 헤더 대소문자 차이를 무시합니다. 릴레이를 거치며 메시지가 자주 수정된다면 relaxed 정규화로 바꿔 불필요한 실패를 막을 수 있습니다.

MIME 및 인코딩 문제

Content-Transfer-Encoding을 잘못 처리하면 해시 불일치가 생길 수 있습니다. 릴레이가 메시지를 quoted-printable에서 8bit로 변환하거나 문자 집합을 바꾸면 본문 해시가 달라집니다. 본문 무결성을 유지하려면 서명 에이전트와 전송 계층이 모두 RFC 2045에 정의된 표준을 따르도록 하세요.

진단 단계

이 문제를 해결하려면 실패한 메시지의 원본 헤더를 살펴보세요. 발송한 원래 본문과 수신된 본문을 비교해 수정이 정확히 어디서 일어났는지 확인합니다. SendHQ 또는 무료 도구(https://sendhq.cc/tools)로 현재 DKIM 레코드 설정을 확인하고 공개 키가 DNS에 올바르게 게시되어 있는지 점검할 수 있습니다.

예방 전략

내용을 수정하는 메일 릴레이는 사용하지 마세요. 푸터를 추가하는 서비스를 꼭 써야 한다면 서명이 전달 체인의 마지막 홉에서 이루어지도록 하세요. 또는 ARC(Authenticated Received Chain)를 도입해 여러 홉에 걸쳐 원래의 인증 결과를 보존하면, 최종 수신자가 원래의 서명을 신뢰할 수 있습니다.

팀에서 자주 묻는 질문

본문 해시 실패가 SPF에 영향을 주나요?

아니요. SPF와 DKIM은 서로 독립적입니다. DKIM 본문 해시 실패가 SPF 통과를 무효화하지는 않지만, DKIM이 주된 인증 방식이었다면 DMARC 정렬에는 영향을 줄 수 있습니다.

푸터를 추가하면 이 오류가 생기나요?

네. 메시지에 서명한 뒤 기업 고지문이나 메일링 리스트 푸터를 추가하면 본문 내용이 바뀌어 DKIM 본문 해시가 무효화됩니다.

simple 정규화와 relaxed 정규화는 무엇이 다른가요?

simple은 엄격해서 어떤 변경이든 실패로 처리합니다. relaxed는 공백과 헤더 대소문자의 사소한 변경을 허용하므로 릴레이에서 일어나는 수정에 더 강합니다.

제목을 바꾸면 본문 해시가 실패하나요?

아니요. 제목은 헤더에 속합니다. 제목이 바뀌면 본문 해시가 아니라 헤더 해시 실패가 발생합니다.

1차 출처