도메인 검증(Domain Verification)

도메인 검증(Domain Verification)

*도메인 검증(domain verification)*을 통해 계정 관리자는 DNS TXT 레코드로 계정이 이메일 도메인을 소유하고 있음을 증명할 수 있어요. 도메인이 검증되면, 조직의 모든 계정에서 이메일 주소가 해당 도메인에 있는 모든 사용자가 검증 링크를 각각 클릭하지 않아도 자동으로 검증된 이메일을 가진 것으로 처리돼요. 하나의 계정이 조직 전체를 대신해 도메인을 한 번 검증해요.

출처: Snowflake 문서

본문

도메인 검증이 중요한 이유

Snowflake는 검증된 이메일 주소를 가진 사용자에게만 보안 및 기타 알림(예: MFA 등록 프롬프트, 비밀번호 재설정 메시지, 리소스 모니터 알림)을 전달해요. 예시는 다중 인증(MFA)과 리소스 모니터 다루기를 참고해요.

도메인 검증이 없으면 각 사용자가 Snowsight에서 개별적으로 자신의 주소를 검증해야 해요. 같은 이메일 도메인에 수백·수천 명의 사용자가 있는 조직에서는 운영 비용이 커요. 새 사용자는 로그인해 개인별 흐름을 완료할 때까지 보안 및 기타 알림을 받을 수 없고, 검증되지 않은 사용자는 그 알림을 조용히 놓쳐요.

도메인을 한 번 검증하면 그 작업이 단일 DNS 구성 단계로 옮겨져요.

중요(Important): 도메인 검증은 조직 전체 작업이에요. 조직의 어떤 계정이 도메인을 검증하면 그 조직의 모든 계정이 해당 도메인의 사용자를 검증된 이메일을 가진 것으로 처리해요. 검증하는 계정을 의도적으로 선택해요. 나중에 도메인을 검증 해제할 수 있는 계정은 그 계정뿐이에요.

검증 작동 방식

도메인 검증은 표준 DNS TXT 레코드 챌린지를 사용해요.

  • 계정 관리자가 도메인 이름으로 SYSTEM$VERIFY_DNS_DOMAIN을 호출해요. Snowflake는 snowflake-verification=<uuid> 형태의 검증 토큰을 반환해요.
  • 관리자가 도메인에 대해 SYSTEM$VERIFY_DNS_DOMAIN이 다음에 호출될 때 Snowflake가 적시(just-in-time) 검증 확인을 수행해요. 게시된 TXT 레코드가 예상 토큰과 일치하면 도메인이 Verified 상태로 전환돼요.
  • 도메인이 검증되어 있는 동안, 이메일 주소가 해당 도메인에 있는 모든 사용자가 알림, MFA, 및 이메일 검증을 조건으로 하는 기타 기능의 목적으로 검증된 이메일 주소를 가진 것으로 처리돼요.

검증은 호출 계정의 전체 조직(복제 그룹)에 공유돼요. 한 계정에서 도메인이 검증되면 그 검증이 조직의 모든 계정에 복제되어, 모든 계정의 일치하는 사용자에게 즉시 검증된 이메일 상태를 부여해요.

하지만 검증의 소유권은 등록 계정에 남아요. 즉, 특정 도메인에 대해 원래 SYSTEM$VERIFY_DNS_DOMAIN을 호출한 계정만 그 도메인을 검증 해제하거나 재검증할 수 있어요. 조직의 다른 계정은 검증을 볼 수 있지만 수정할 수는 없어요.

도메인 상태와 유예 기간(Grace Period)

검증된 도메인은 스스로 검증 상태를 유지하지 않아요. Snowflake는 백그라운드에서 주기적으로 TXT 레코드를 다시 확인해 드리프트(예: DNS 레코드 제거 또는 교체)를 감지해요. 각 도메인은 다음 상태 중 하나를 가져요.

상태 설명
Pending 도메인이 SYSTEM$VERIFY_DNS_DOMAIN으로 등록되었지만 TXT 레코드가 아직 관찰되지 않았어요. 도메인의 사용자는 검증된 이메일을 가진 것으로 처리되지 않아요.
Verified 최근 확인에서 TXT 레코드가 발견됐어요. 도메인의 사용자는 검증된 이메일을 가진 것으로 처리돼요.
유예 기간(48시간) 재검증이 실패했어요. 도메인은 여전히 검증된 것으로 처리되지만, Snowflake가 레코드를 다시 확인할 거예요. 관리자는 이 전환 시점부터 48시간 내에 DNS 구성을 수정해야 해요.
유예 기간(7일) 재검증이 처음 48시간 창 이후에도 계속 실패했어요. Snowflake가 계정 관리자에게 경고 알림을 보내요. 도메인은 추가로 7일 동안 검증된 것으로 처리돼요.
Unverified 총 유예 기간(48시간 + 7일)이 성공적인 재검증 없이 경과했어요. 도메인의 사용자는 더 이상 검증된 이메일을 가진 것으로 처리되지 않으며, Snowflake가 최종 알림을 보내요.

유예 기간은 일시적인 DNS 문제나 짧은 오구성이 도메인의 모든 사용자의 검증된 이메일 상태를 즉시 철회하지 않도록 하기 위해 존재해요. 검증되지 않은 도메인을 복구하려면 DNS 레코드를 수정하고 SYSTEM$VERIFY_DNS_DOMAIN을 다시 호출해 새 확인을 트리거해요.

Snowflake는 두 시점에 계정 관리자에게 이메일을 보내요. 처음 48시간 창이 경과하고 도메인이 7일 창으로 이동할 때(도메인이 검증되지 않게 될 날짜를 포함한 경고), 그리고 도메인이 검증되지 않게 될 때 다시 보내요. 처음 48시간은 의도적으로 조용히 지나가므로, 짧은 DNS 중단이 노이즈를 만들지 않아요.

상태를 알기 위해 이메일을 기다릴 필요는 없어요. 언제든지 SYSTEM$VERIFY_DNS_DOMAIN을 다시 호출해 도메인의 현재 상태를 확인할 수 있어요. 도메인이 유예 기간에 있는 동안 응답은 검증 상태로 유지되는 정확한 날짜와 시간까지 보고하므로, DNS 레코드를 수정할 시간이 얼마나 남았는지 항상 알 수 있어요.

도메인 검증

도메인 검증은 3단계 과정이에요. 먼저 토큰을 얻기 위해 도메인을 등록하고, 그다음 DNS에 토큰을 게시하고, 마지막으로 Snowflake가 이를 관찰하게 해요.

1단계: 도메인 등록

계정 관리자(또는 계정에 대한 MODIFY 권한이 있는 사용자)로서 도메인 이름으로 SYSTEM$VERIFY_DNS_DOMAIN을 호출해요.

SELECT SYSTEM$VERIFY_DNS_DOMAIN('example.com');

이 함수는 TXT 레코드 값과 현재 상태를 포함하는 JSON 객체를 반환해요.

{
  "txt_record": "snowflake-verification=550e8400-e29b-41d4-a716-446655440000",
  "domain": "example.com",
  "message": "Domain example.com is pending verification. Add the following DNS TXT record to verify ownership: snowflake-verification=550e8400-e29b-41d4-a716-446655440000"
}

이미 등록된 도메인에 대해 함수를 호출해도 같은 토큰을 반환해요. 호출은 멱등(idempotent)이에요.

2단계: TXT 레코드 게시

DNS 제공자에서 txt_record 필드에 반환된 값으로 도메인에 TXT 레코드를 추가해요. 레코드 이름은 검증하려는 도메인의 에이펙스(apex)예요(예: _snowflake.example.com이 아니라 example.com).

DNS 전파는 제공자와 도메인의 TTL에 따라 몇 분에서 몇 시간이 걸릴 수 있어요.

3단계: 검증 트리거

검증 확인을 수행하려면 SYSTEM$VERIFY_DNS_DOMAIN을 다시 호출해요.

SELECT SYSTEM$VERIFY_DNS_DOMAIN('example.com');

TXT 레코드가 존재하고 예상 토큰과 일치하면 응답 메시지가 도메인이 검증되었음을 보고해요. 이 시점부터 example.com에 이메일 주소가 있는 모든 사용자가 검증된 이메일을 가진 것으로 처리돼요.

검증된 도메인 제거

도메인의 사용자를 검증된 이메일을 가진 것으로 처리하지 않으려면 SYSTEM$UNVERIFY_DNS_DOMAIN을 호출해요. 원래 도메인을 등록한 계정만 검증을 해제할 수 있어요.

SELECT SYSTEM$UNVERIFY_DNS_DOMAIN('example.com');

도메인이 현재 검증 상태이거나 유예 기간에 있으면 활성 검증을 제거하려는 의도를 확인하려면 두 번째 인자로 TRUE를 전달해야 해요.

SELECT SYSTEM$UNVERIFY_DNS_DOMAIN('example.com', TRUE);

제거 후 도메인의 사용자는 이전에 가졌던 개별 이메일 검증 상태로 되돌아가며, DNS TXT 레코드는 삭제할 수 있어요.

고려사항

  • Snowflake는 TXT 레코드를 대소문자 구분 없이 비교하지만 리터럴 snowflake-verification= 접두사를 기대해요. SYSTEM$VERIFY_DNS_DOMAIN이 반환한 값을 따옴표로 묶거나, base64 인코딩하거나, 다른 방식으로 변형하지 마요.
  • 도메인 검증이 부여하는 검증된 이메일 상태는 개별 이메일 검증을 대체하는 것이 아니라 추가하는 것이에요. 개인적으로 검증된 이메일을 가진 사용자는 나중에 도메인이 검증되지 않게 되어도 그 상태를 유지해요.

더 알아보기 (Learn more)