가입 시 일회용 이메일 주소를 차단하는 방법
가입 양식에서 임시 이메일을 잡아내는 세 가지 방법을 고정 차단 목록부터 API까지 코드와 함께 소개하고, 실제 사용자를 막는 실수도 짚습니다.
일회용 이메일이란
일회용(또는 임시) 주소는 가입 없이 메일함을 내주는 서비스에서 나오며, 보통 몇 분에서 몇 시간 동안만 쓸 수 있습니다. Mailinator, Guerrilla Mail, 10 Minute Mail과 수많은 덜 알려진 도메인이 이런 식으로 동작합니다. 뉴스레터를 피하려는 사람에게 유용하고, 계정을 많이 만드는 사람에게도 똑같이 유용합니다.
자주 혼동되지만 다르게 다뤄야 하는 비슷한 범주가 세 가지 있습니다.
- 개인정보 보호 릴레이: “Apple로 로그인”의
privaterelay.appleid.com, DuckDuckGo의duck.com, Firefox Relay 등은 실제로 오래 쓰는 메일함으로 전달합니다. 이를 차단하면 개인정보를 중시하는 고객이 피해를 봅니다. 기껏해야 작은 위험 신호로만 다루세요. - 무료 메일 서비스: Gmail, Outlook.com, Yahoo 등은 일회용이 아닙니다. 남용 패턴이 다르며, 한 메일함의 별칭입니다. Gmail 별칭 가이드에서 다룹니다.
- 아예 메일을 받을 수 없는 도메인:
gmial.com같은 오타나 지어낸 도메인입니다. 그곳에서는 누구도 계정을 인증할 수 없으므로 이것도 잡아낼 가치가 있습니다.
방법 1: 코드에 넣은 고정 차단 목록
GitHub에는 수만 개 항목이 담긴 오픈소스 일회용 도메인 목록이 관리되고 있습니다. 가장 간단한 방법은 그 목록을 집합으로 불러와 가입 시 도메인을 확인하는 것입니다.
# Python DISPOSABLE = set(open("disposable_domains.txt").read().split()) def is_disposable(email: str) -> bool: domain = email.rsplit("@", 1)[-1].strip().lower().rstrip(".") parts = domain.split(".") # 하위 도메인도 확인: mail.tempdomain.com -> tempdomain.com return any(".".join(parts[i:]) in DISPOSABLE for i in range(len(parts) - 1))
비용도 들지 않고 지연도 없습니다. 단점은 다음과 같습니다.
- 낡습니다. 새 일회용 도메인은 끊임없이 생기고, 많은 서비스가 차단 목록을 피하려고 일부러 도메인을 바꿉니다. 6개월 전에 복사한 목록에는 최신 도메인이 없는데, 바로 그것이 남용자들이 쓰는 것입니다.
- 목록끼리 다릅니다. 목록마다 담긴 도메인이 다르고, 오류가 있는 것도 있습니다. 여러 개를 합치면 범위는 넓어지지만 관리 부담도 커집니다.
- 갱신 작업이 필요하고, 바뀔 때마다 배포(또는 재로딩)해야 합니다.
방법 2: 메일 서버(MX) 확인
도메인의 MX 레코드를 DNS로 조회하면 메일을 받을 수 있는지 알 수 있습니다. 어떤 목록에도 없는 오타와 지어낸 도메인을 잡아냅니다.
# Python, dnspython 사용 import dns.resolver def can_receive_mail(domain: str) -> bool: try: return len(dns.resolver.resolve(domain, "MX", lifetime=2)) > 0 except dns.resolver.NXDOMAIN: return False except Exception: return True # DNS 문제는 사용자 탓이 아님: 통과
결과는 도메인별로 캐시하고, 타임아웃은 짧게 하며, 여러분의 DNS 리졸버가 잠깐 문제를 일으켰다고 가입을 거절하지 마세요. 참고로 MX 검사로는 일회용 서비스를 잡을 수 없습니다. 메일을 잘 받는 것이 그들의 일이기 때문입니다.
방법 3: 둘 다 처리하고 스스로 최신을 유지하는 API
API를 쓰면 목록 관리와 MX 조회를 코드 밖으로 뺄 수 있습니다. Attrelix는 여러 공개 목록을 합쳐 매일 갱신하고, 각 도메인이 처음 확인된 날짜를 기록하고, 메일 서버를 확인하며, 같은 호출에서 Gmail 별칭을 정규화합니다. 네트워크와 기기도 함께 평가하므로 이메일 판정만이 아니라 가입마다 하나의 판단을 받습니다. 도메인 조회는 일회용 이메일 검사기에서 무료로 써 볼 수 있습니다.
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"someone@mailinator.com","ip":"203.0.113.9"}'
응답에는 email.disposable, email.relay, email.mx와 정규화된 주소가 전체 판단 및 이유와 함께 들어 있습니다.
실제 사용자를 차단하는 실수
- 릴레이 차단. Apple의 비공개 릴레이는 Apple로 로그인하는 많은 iPhone 사용자가 씁니다. 이를 막으면 그들을 막는 것입니다.
- DNS 오류로 차단. 타임아웃은 도메인이 가짜라는 증거가 아닙니다.
- 너무 넓은 목록. 일부 커뮤니티 목록에는 정상적인 소규모 서비스나 회사 도메인이 들어 있습니다. 고객이 불만을 제기하면 따지지 말고 그 도메인을 허용하세요.
- 출구 없는 오류 메시지. “잘못된 이메일”은 진짜 주소를 입력한 사람을 혼란스럽게 합니다. 임시 메일함은 받지 않는다고 알리고 다른 주소를 요청하세요.
일회용 검사가 잡지 못하는 것
일회용 도메인을 막아도 남용 비용은 조금 오를 뿐이고, 남용자는 Gmail로 옮겨 갑니다. 그다음부터 남용은 한 메일함이나 한 기기 뒤의 수많은 계정으로 나타납니다. 이때 다중 계정 탐지가 필요합니다.
요약
- 일회용 도메인, 개인정보 보호 릴레이, 무료 메일 서비스, 죽은 도메인을 구분하세요.
- 고정 목록은 좋은 출발점이지만 낡습니다. 갱신하거나 API를 쓰세요.
- 죽은 도메인에는 MX 검사를 쓰고, DNS 문제 시에는 통과시키세요.
- 남용자가 Gmail 별칭으로 옮겨 갈 것을 예상하고 주소를 정규화하세요.