가이드

Gmail 점과 더하기 별칭: 중복 가입을 잡아내는 방법

j.doe+7@gmail.com과 jdoe@gmail.com은 같은 메일함입니다. Gmail 주소 규칙의 동작 방식, JavaScript와 Python 정규화 함수, 그리고 발목을 잡는 예외 상황.

6분 분량 · 2026-10-31 업데이트 · Attrelix

메일함 하나, 주소는 무한대

Gmail에는 메일함 하나로 계정을 손쉽게 대량으로 만들 수 있게 하는 주소 규칙이 두 가지 있습니다.

  • 점은 무시됩니다. @gmail.com 주소에서 jane.doe, janedoe, j.a.n.e.d.o.e는 같은 메일함입니다. 열 글자 이름이면 점을 찍는 방법이 수백 가지입니다.
  • 더하기 기호 뒤의 내용은 무시됩니다. janedoe+test1@gmail.com, janedoe+test2@gmail.com 등은 모두 janedoe@gmail.com으로 배달됩니다. 변형의 수에는 제한이 없습니다.

또한 @googlemail.com은 @gmail.com과 같은 서비스입니다. 인증 메일이 실제로 도착하므로 모든 변형이 이메일 인증을 통과합니다. 가입 양식 입장에서는 전부 서로 다른 새 사용자입니다.

더하기 주소는 Gmail만의 기능이 아닙니다. Fastmail과 Proton Mail도 지원하고, 많은 회사 메일 서버도 마찬가지입니다. 반면 점을 무시하는 것은 개인용 Gmail만의 특징입니다.

정규화한 뒤 비교하세요

해결책은 원래 주소 옆에 정규화된 형태를 저장하고, 새 가입을 그것과 비교하는 것입니다. 원래 주소는 메일 발송용으로 남겨 두세요. 사용자가 직접 입력한 것이고, 더하기 태그로 메일을 분류하는 사람도 있습니다.

// JavaScript
function normalizeEmail(input) {
  const raw = input.trim().toLowerCase();
  const at = raw.lastIndexOf("@");
  if (at < 1) return null;
  let local = raw.slice(0, at);
  let domain = raw.slice(at + 1).replace(/\.$/, "");
  if (domain === "googlemail.com") domain = "gmail.com";
  const plus = local.indexOf("+");
  if (plus > 0) local = local.slice(0, plus);
  if (domain === "gmail.com") local = local.replaceAll(".", "");
  return `${local}@${domain}`;
}

normalizeEmail("J.Doe+trial7@GoogleMail.com"); // "jdoe@gmail.com"
# Python
def normalize_email(value: str) -> str | None:
    raw = value.strip().lower()
    local, sep, domain = raw.rpartition("@")
    if not sep or not local:
        return None
    domain = domain.rstrip(".")
    if domain == "googlemail.com":
        domain = "gmail.com"
    base = local.split("+", 1)[0] or local
    if domain == "gmail.com":
        base = base.replace(".", "")
    return f"{base}@{domain}"

그다음 열과 인덱스를 추가하고 가입 시 조회하세요.

ALTER TABLE users ADD COLUMN email_normalized text;
CREATE INDEX users_email_normalized ON users (email_normalized);

-- 가입 시
SELECT count(*) FROM users WHERE email_normalized = $1;

발목을 잡는 예외 상황

  • 개인용 Gmail 외에는 점을 지우지 마세요. 대부분의 서비스와 Google Workspace 회사 도메인에서 jane.doe@와 janedoe@는 서로 다른 사람입니다. 거기서 점을 지우면 남남을 하나로 묶게 됩니다.
  • 다른 서비스에서 더하기 제거는 추정일 뿐입니다. 거의 모든 곳에서 더하기 태그는 별칭이지만, 메일 서버가 +를 일반 문자로 다룰 수도 있습니다. Gmail 밖에서의 일치는 증거가 아니라 신호로 다루세요.
  • 더하기 태그 자체를 거절하지 마세요. 신중한 사람들은 사이트마다 name+service@gmail.com을 씁니다. 새 메일함에 더하기 태그가 있는 것은 정상이고, 이미 계정이 있는 메일함에 더하기 태그가 붙은 것이 신호입니다.
  • 비교 전에 소문자로 바꾸고, 공백과 끝의 점을 없애세요. 실제로 서비스들은 로컬 부분의 대소문자를 구분하지 않습니다.
  • 다른 서비스에는 각자의 별칭 방식이 있습니다(Yahoo의 일회용 주소, 같은 계정의 Outlook 별칭 등). 정규화로는 잡을 수 없으니 기기와 네트워크 신호가 나설 차례입니다.

일치하면 어떻게 할까

정규화 후 일치한다는 것은 새 계정이 이미 계정이 있는 메일함으로 메일을 받는다는 뜻입니다. 대개 올바른 대응은 오류가 아니라 안내입니다. “이 이메일로 이미 계정이 있습니다. 로그인하시겠어요?” 체험과 무료 크레딧의 경우, 체험을 주지 않거나 가입을 검토로 보낼 강력한 이유이기도 합니다. 전체 판단 흐름은 무료 체험 남용을 막는 방법을 참고하세요.

Attrelix의 방식

모든 검사는 주소를 정규화하고(Gmail 점, 더하기 태그, googlemail.com, Proton 도메인), 같은 메일함을 쓰는 기존 계정을 찾고, 발견하면 이유에 alias_of_existing을 추가합니다. 여러분 데이터의 원래 주소는 절대 바뀌지 않으며, 연결된 계정이 응답에 담겨 그룹 전체를 볼 수 있습니다.

요약

  • Gmail은 점과 더하기 태그를 무시하고, 많은 서비스가 더하기 태그를 무시합니다.
  • 원래 주소 옆에 정규화된 주소를 저장하고 인덱스를 거세요.
  • 점은 개인용 Gmail에서만 지우고, 다른 일치는 신호로 다루세요.
  • 일치하면 로그인을 안내하고 두 번째 체험은 주지 마세요.

다른 가이드