LETO

와일드카드 레코드와 ALIAS/ANAME

와일드카드 레코드가 어떤 이름을 잡고 어떤 이름을 놓치는지, 명시적 레코드가 우선하는 규칙과 와일드카드의 위험을 정리했습니다. apex에 CNAME을 쓸 수 없는 제약을 ALIAS, ANAME, CNAME 플래트닝이 어떻게 우회하는지도 함께 다룹니다.

작성

와일드카드 레코드는 *.example.com 처럼 이름 자리에 별표를 넣어, 명시적 레코드가 없는 이름들을 한 번에 받아 주는 레코드입니다. 모든 이름에 무조건 적용되는 것이 아니라 "따로 정의된 이름이 없을 때만" 쓰이는 기본값에 가깝습니다. ALIAS와 ANAME은 전혀 다른 주제로, apex 도메인에 CNAME을 둘 수 없다는 표준 제약을 네임서버가 대신 풀어 주는 기능입니다.

두 기능 모두 레코드를 넣는 위치는 지금 도메인이 위임된 네임서버의 DNS 관리 화면입니다. 기본 레코드 종류와 입력 형식은 DNS 레코드 설정을 먼저 보시면 이해가 쉽습니다.

와일드카드가 잡는 이름과 놓치는 이름

*.example.co.kr.      3600   IN   A       203.0.113.50

이 한 줄을 넣으면 shop.example.co.kr, test.example.co.kr 처럼 존에 정의되지 않은 이름이 모두 같은 IP로 답합니다. 더 깊은 a.b.example.co.kr 같은 이름도, 중간 이름이 존에 정의되어 있지 않다면 이 와일드카드가 받습니다.

반대로 다음은 잡지 못합니다.

  • apex 도메인 자체 (example.co.kr). 별표는 한 단계 아래부터이므로 apex 에는 A 또는 AAAA 를 따로 넣어야 합니다
  • 이미 자기 레코드가 있는 이름. 종류가 달라도 그 이름에 무언가 정의되어 있으면 와일드카드는 쓰이지 않습니다
  • 다른 종류의 질의. A 와일드카드만 두고 MX 를 물으면 답이 없습니다. 종류별로 따로 넣어야 합니다
  • NS 로 위임한 하위 존 아래의 이름. 그 아래는 위임받은 네임서버가 답합니다
  • 중간 이름이 존에 정의된 경우의 그 아래 이름. b.example.co.kr 에 레코드가 있으면 a.b.example.co.kr 은 더 아래 단계의 와일드카드를 찾습니다

별표는 이름의 가장 왼쪽 자리에서만 와일드카드로 동작합니다. api.*.example.co.kr 같은 형태는 와일드카드가 아니라 별표라는 글자가 들어간 이름으로 취급되므로 의도한 대로 동작하지 않습니다.

레토 대시보드에서 입력할 때는 한 가지 규칙을 더 지켜야 합니다. 도메인 상세의 DNS 및 포워딩 탭에 있는 DNS 레코드 카드는 이름 칸에 *.이름 형태만 받고, 별표 하나만 넣으면 저장되지 않습니다. 예를 들어 *.dev 를 넣으면 *.dev.example.co.kr 아래의 이름들이 이 레코드로 답합니다.

명시적 레코드가 우선합니다

이 규칙 하나만 기억하면 대부분의 혼란이 정리됩니다. 질의한 이름에 레코드가 정의되어 있으면 와일드카드는 무시됩니다.

존에 있는 내용www.example.co.kr A 질의이유
와일드카드 A 만 있음와일드카드의 IP 로 응답명시적 레코드가 없음
와일드카드 A + www Awww 의 IP 로 응답명시적 레코드가 우선
와일드카드 A + www TXT 만 있음답 없음 (빈 응답)www 라는 이름이 이미 존재하므로 와일드카드를 쓰지 않음
와일드카드 A + www CNAMECNAME 을 따라간 결과명시적 레코드가 우선

세 번째 줄이 진단을 가장 어렵게 만드는 경우입니다. 소유 확인용 TXT를 www 에 하나 넣은 것만으로 그 이름이 와일드카드 적용에서 빠지고, 다른 모든 서브도메인은 열리는데 www 만 연결되지 않는 증상이 나타납니다. 이때는 www 에 A 또는 CNAME을 명시적으로 추가하면 해결됩니다.

와일드카드의 위험

편리해 보이지만, 와일드카드는 "이름이 없다"는 정보를 없애 버립니다. 그 대가가 생각보다 큽니다.

위험어떻게 드러나나
오타 이름이 전부 응답wwww.example.co.kr 도 사이트로 연결되어 잘못된 주소가 유통됨
설정 누락을 못 알아챔레코드를 빠뜨려도 이름 없음 오류가 아니라 기본 서버가 응답하므로 늦게 발견됨
의도하지 않은 노출내부용 이름 규칙을 추측한 요청이 모두 서버까지 도달함
서버 쪽 기본 동작에 의존모르는 이름으로 온 요청이 어떤 가상 호스트로 가는지에 따라 엉뚱한 사이트가 열림
인증서와의 불일치DNS 는 모든 이름에 응답하는데 인증서에는 그 이름이 없어 경고 화면이 나옴

그래서 실무에서는 이름이 수십 개 이상으로 늘어나거나 사용자가 직접 이름을 만드는 서비스처럼 이름을 미리 알 수 없는 경우에만 와일드카드를 쓰고, 일반적인 회사 사이트는 필요한 이름만 명시적으로 두는 편이 좋습니다. 와일드카드를 쓴다면 서버에서 모르는 이름으로 온 요청을 명확히 거부하거나 안내 페이지로 보내는 기본 설정을 함께 만들어야 합니다. 개별 이름을 만드는 방법은 서브도메인 만들기에 있습니다.

apex 에 CNAME 을 쓸 수 없는 이유

CNAME은 "이 이름에 대한 질의를 전부 저쪽으로 넘긴다"는 뜻이라 같은 이름에 다른 레코드가 함께 있을 수 없습니다. 그런데 존의 정점인 apex 에는 SOA와 NS가 반드시 존재하므로, apex 에는 CNAME을 둘 수 없습니다. 이 제약과 기본적인 우회 방법은 DNS 레코드 설정에도 정리되어 있습니다.

문제는 요즘 외부 서비스가 IP 대신 호스트 이름을 알려 준다는 점입니다. 로드밸런서나 CDN은 IP가 수시로 바뀌므로 고정 IP를 주지 않습니다. apex 를 대표 주소로 쓰려면 이름을 가리킬 방법이 필요합니다.

ALIAS, ANAME, CNAME 플래트닝

이 기능들은 권한 네임서버가 대신 일을 합니다. 관리자는 apex 에 대상 이름을 적어 두지만, 네임서버는 질의를 받을 때 그 이름을 직접 조회해 얻은 IP를 A 레코드나 AAAA 레코드 형태로 응답합니다. 클라이언트는 평범한 A 응답을 받으므로 표준 위반이 아닙니다.

# 관리 화면에 넣는 값 (제공자별 표기 예)
example.co.kr.   ALIAS   endpoint.service-provider.example.

# 실제로 클라이언트가 받는 응답
example.co.kr.   60   IN   A   203.0.113.60

알아 둘 점은 네 가지입니다.

  • 표준 레코드 종류가 아닙니다. 이름과 지원 여부가 DNS 제공자마다 다르고, 지원하지 않는 제공자도 있습니다
  • 존 파일을 그대로 옮겨도 이 설정은 따라오지 않습니다. DNS 를 옮길 때는 대체 수단을 먼저 확인해야 합니다
  • 대상 이름을 조회하는 주체가 네임서버이므로, 대상이 접속 위치에 따라 다른 IP 를 주는 구성이면 기대와 다른 IP 가 응답될 수 있습니다
  • TTL 은 보통 대상의 TTL 이나 제공자가 정한 짧은 값을 따릅니다. 응답 값이 수시로 바뀌는 것을 전제로 운영해야 합니다

레토 DNS는 ALIAS 라는 전용 타입을 두지 않고 CNAME 레코드에 플래트닝을 켜는 방식으로 이 기능을 제공합니다. 도메인 상세의 DNS 및 포워딩 탭에 있는 DNS 레코드 카드에서 타입을 CNAME 으로 고르면 CNAME Flatten 체크박스가 나오고, 이것을 켜면 루트 도메인에도 CNAME을 둘 수 있습니다. 이름 칸에는 루트를 뜻하는 @ 를, 값 칸에는 대상 호스트 이름을 넣습니다. 저장 뒤에는 질의 결과가 CNAME이 아니라 A 레코드로 돌아오는지 확인하세요.

선택 기준 정리

상황권장 설정
서브도메인이 몇 개로 고정되어 있다이름마다 A 또는 CNAME 을 명시적으로
이름을 미리 알 수 없고 수가 많다와일드카드 + 서버의 기본 동작 정의 + 와일드카드 인증서
apex 를 대표 주소로 쓰고 대상이 호스트 이름만 준다CNAME 플래트닝이나 ALIAS 계열 기능, 없으면 apex 는 리다이렉트 전용
apex 를 대표 주소로 쓰고 대상이 고정 IP 를 준다apex 에 A/AAAA, www 는 apex 로 301

apex 를 리다이렉트 전용으로 두는 구성의 실제 설정은 도메인 포워딩과 리다이렉션에, 와일드카드 인증서의 발급 조건은 SSL 인증서 적용하기에 있습니다. 설정한 뒤에는 이름별로 직접 질의해 의도한 값이 나오는지 확인하세요.

dig @ns1.example-dns.com A nonexistent-name.example.co.kr +noall +answer
dig A example.co.kr +short
dig MX random-name.example.co.kr +noall +answer +comments

자주 묻는 질문

명시적 레코드가 없는 이름에 대해서만 응답합니다. 특정 이름에 레코드를 따로 두면 그 이름은 와일드카드가 아니라 자기 레코드로 답하고, apex 도메인 자체는 와일드카드의 적용 대상이 아닙니다. 또 와일드카드는 종류별로 동작하므로 A 와일드카드만 있는 상태에서 MX를 물으면 답이 없습니다.

존재하지 않는 이름도 모두 응답하게 되어 오타 서브도메인까지 사이트나 서버로 연결됩니다. 설정 누락이 이름 없음 오류로 드러나지 않아 문제를 늦게 발견하게 되고, 쓰지 않는 이름이 외부 서비스 선점이나 검증 우회에 이용될 여지가 생깁니다. 필요한 이름만 명시적으로 두는 편이 운영상 안전합니다.

DNS 제공자가 ALIAS, ANAME, CNAME 플래트닝 같은 기능을 제공하면 그것으로 해결합니다. 네임서버가 대상 이름을 대신 조회해 A 또는 AAAA 값으로 답해 주므로 표준을 위반하지 않습니다. 레토 대시보드에서는 CNAME 레코드에 CNAME Flatten 을 켜는 방식이고, 지원하지 않는 제공자라면 대상이 안내한 고정 IP를 A 레코드로 넣거나 apex 는 리다이렉트 전용으로 두고 실제 서비스는 www 에 둡니다.

동작 목적은 같고 이름만 제공자마다 다릅니다. ALIAS, ANAME, CNAME 플래트닝, 가상 레코드 등으로 불리며 표준 레코드 종류가 아니라 각 DNS 제공자의 구현입니다. 그래서 지원 여부, 설정 화면, TTL 처리 방식이 제공자마다 달라 DNS를 옮길 때 그대로 이전되지 않습니다. 레토 DNS는 ALIAS 전용 타입을 두지 않고 CNAME Flatten 으로 같은 일을 합니다.

별개입니다. 와일드카드 레코드는 DNS 응답에 관한 것이고, 와일드카드 인증서는 인증기관이 발급하는 별도의 인증서입니다. 와일드카드 레코드로 이름이 모두 응답하더라도 인증서에 그 이름이 없으면 브라우저는 경고를 띄웁니다.

관련 가이드