이메일 유효성 검증 by MX 레코드

Daniel_Yang·2024년 6월 24일
0
post-thumbnail

이메일 검증의 필요성

이메일 검증이 왜 필요할까?

이메일 검증을 통해 해결할 수 있는 문제들이 있다.

  • 유저의 이메일 기재 실수
  • 이메일을 통해 뭔가 하려고 할 때
  • 악의적인 이메일 방지 등

이메일 검증은 어디까지 해야할까?

  • 이메일 형식 유효성 검사
  • 이메일 길이 유효성 검사
  • 이메일 도메인 주소가 유효한지
  • 이메일이 실제 유효한 이메일인지? (메일을 수신할 수 있는지)

이메일 검증 방법

이메일 형식 유효성 검증

1. 정규 표현식 사용

  • Java: 자바에서는 정규식을 활용해 문자열을 검증, 탐색을 돕는 Pattern, Matcher 클래스를 제공
    (1) Pattern : 정규 표현식이 컴파일된 클래스. 정규 표현식에 대상 문자열을 검증하거나, 활용하기 위해 사용되는 클래스
    (2) Matcher : Pattern클래스를 받아 대상 문자열과 패턴이 일치하는 부분을 찾거나 전체 일치 여부 등을 판별하기 위해 사용된다.

2. 라이브러리 활용

JavaScript: validator
Java: Apache Commons Validator
- Validator 인터페이스를 상속받아 구현체를 작성

이메일 서버 확인 (MX 레코드 검증)

이메일 서버 확인 = MX 레코드(Mail Exchange Record) 검증

  • MX 레코드는 도메인 이름 시스템(DNS)에서 특정 도메인에 대해 이메일을 수신할 메일 서버를 지정 하는 데 사용한다. 즉, 어떤 이메일이 특정 도메인으로 발송될 때, 해당 이메일을 어떤 메일 서버가 처리할지를 결정합니다.
    => 이를 통해 이메일이 제대로 전달될 수 있음을 보장한다.

  • MX 레코드를 조회하는 방법
    Python: dnspython 라이브러리
    Java: JNDI (Java Naming and Directory Interface)


SMTP 프로토콜을 이용한 이메일 존재 여부 확인

  • SMTP(Simple Mail Transfer Protocol)는 인터넷 표준 전자 메일 전송 프로토콜이다. 클라이언트가 메일 서버와 통신하여 이메일을 전송하는 데 사용. TCP 포트 25를 사용하며, 클라이언트가 서버에 접속하여 메일 전송 요청을 보내고, 서버는 이를 처리하여 수신자에게 전달한다. 또한, SMTP 프로토콜은 이메일 주소의 존재 여부를 확인하는 데도 사용할 수 있다.

SMTP를 이용한 이메일 주소 존재 여부 확인 방법

단계

  • SMTP 서버에 연결: 이메일 주소의 도메인에 해당하는 메일 서버에 연결합니다.
  • HELO/EHLO 명령: 서버와의 초기 통신을 설정합니다.
  • MAIL FROM 명령: 이메일 발신자를 지정합니다.
  • RCPT TO 명령: 검증하고자 하는 이메일 수신자를 지정합니다.
  • 서버 응답 확인: 서버의 응답 코드를 확인하여 이메일 주소의 존재 여부를 판단합니다.
  • QUIT 명령: 서버와의 연결을 종료합니다.

한계(chatGPT)

  • 서버의 제한: 많은 이메일 서버는 스팸 방지를 위해 SMTP 검증을 제한하거나 차단할 수 있습니다. 일부 서버는 연결 시도를 감지하고 차단할 수도 있습니다.
  • 프라이버시 및 법적 이슈: 이메일 주소의 유효성을 확인하기 위해 SMTP 검증을 사용하는 것은 프라이버시 침해로 간주될 수 있습니다. 사용자 동의 없이 이 방법을 사용하는 것은 법적 문제가 발생할 수 있습니다.
  • 정확성: 일부 서버는 모든 RCPT TO 명령에 대해 긍정적인 응답을 반환하여 이메일 주소의 유효성을 실제로 확인할 수 없도록 합니다.

이메일 검증 API 사용

  • 실제 유효한 이메일인지 검증하려면 결국 상용 API를 쓸 수밖에 없다. Hunter.io나 ZeroBounce 같은 것들이 해당된다.

MX 레코드를 사용하게 된 이유

프로젝트를 진행하고 있는데, 상용 API 신청이 가장 쉬워보이나, 신청 + 개발 + 테스트 + 금액 이슈로 인해 상용 API는 사용할 수 없게 되었다. 따라서, 실제 유효한 이메일인지는 체크하기 어려워진 상황이다. 이메일 형식, 길이 체크는 너무나 간단하니, 남은 것은 이메일 도메인이 유효한 지와 SMTP 프로토콜을 통해 이메일 존재를 확인하는 것이었다. 하지만, SMTP 프로토콜은 스팸 문제로 인해 특정 이메일 도메인들은 그냥 전부 success, fail 등으로 내고 있다. 그래서,
이메일 도메인이 유효한 지 체크하는 방법만이 남았다.

public static boolean checkMXRecord(String domain) {
        try {
            Hashtable<String, String> env = new Hashtable<>();
            env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
            DirContext ictx = new InitialDirContext(env);
            Attributes attrs = ictx.getAttributes(domain, new String[]{"MX"});
            Attribute attr = attrs.get("MX");

            if (attr == null) {
                return false;
            }

            return true;
        } catch (NamingException e) {
            return false;
        }
    }
  • 위와 같은 코드로 금방 MX 레코드를 조회할 수 있다.
  • 하지만, 가끔 사이트들을 보면 naver.co, gmail.co 등 도메인 주소를 전부 입력하지않았음에도 자연스럽게 리다이렉트되도록 하는 주소들이 있다.
    - 이 경우에는 attr이 null이 아니지만 MX: 0이 나와버려 이메일 수신과 거리가 먼 상황이다. 따라서, MX:0을 포함하는 경우에는 false가 되도록 처리가 되어야할 것이다.

gmail.com vs gmail.co


참고자료

intoDNS - check DNS server and mail server health
MX레코드 확인하는 방법
java pattern, matcher

0개의 댓글