Published on

CNAME flattening

Authors
  • avatar
    Name
    Jay
    Twitter

CNAME flattening는 무엇인가?

DNS specification에서 Domain의 Root record로는 CNAME가 될 수 없도록 되어 있다. 만약 jayground.com 도메인이 있고, 나의 서버가 59.34.124.34이라고 하면 A record로 Root record를 생성할 수는 있다. 하지만 Load balancer가 some.loadbalancer.com를 가지고 있으면, 이걸 CNAME으로 root record로 등록할 수가 없다. jayground.com에 직접 IP address를 연결하는 것보다 CNAME을 등록할 수 있으면 서버가 변경되거나 Scale in/out될 때 유연하게 대처할 수 있다. DNS specification을 벗어나서 CNAME을 등록하도록 할 수 있지만, 이런 규격을 기대하고 만들어진 서비스에서 문제가 발생할 수도 있다. 이러한 규격을 어기지 않고 Root record로 CNAME을 등록할 수 있게 해주는 방법이 CNAME flattening이다. DNS resolve 과정에서 Root record를 query할 때 CNAME에 있는 도메인을 내려주는 것이 아니라, 해당 도메인에 연결된 IP address를 찾아와서 내려주게 된다. 따라서 내부적으로는 이렇게 작업이 추가되지만, 외부에서는 Root record에 A record가 등록된 것처럼 생각 할 수 있는 것이다.

Custom Domain 등록

많은 SaaS product중에 개인이 가지고 있는 Domain을 등록할 수 있게 해주고 있다. Github에서는 Github pages라는 서비스로 간단하게 website를 publish할 수 있다. 만약 jayground.com의 도메인을 가지고 있다면, 먼저 jayground.com을 소유하고 있는지 TXT record를 등록해서 인증한다. 그리고 Github에서 제공하는 IP address들을 A record로 등록하면 된다. https://jayground.com로 접속을 하면 제공된 IP address로 이동하게 되고, Github pages에 custom domain을 등록해줬기 때문에 SSL 인증서와 같이 컨텐츠를 내려주게 된다. 이렇게 A record를 Root record으로 등록하게 된다.

그런데 Webflow에서는 Custom domain을 등록할 때, jayground.comA record를 등록한다. 그리고 www.jayground.com에는 CNAME으로 proxy-ssl.webflow.com을 등록하게 된다. Webflow 공식문서에서 www.jayground.com을 webflow 설정 페이지에서 default로 셋팅을 해야 된다고 설명하고 있다.

Your default domain should be set to the www subdomain (e.g., www.yourdomain.com). Setting the root domain (e.g., yourdomain.com) as the default requires a different setup for your DNS records.

이제 https://jayground.com으로 접속을 하면 https://www.jayground.com으로 Redirect가 된다. 그리고 www.jayground.com은 CNAME으로 proxy-ssl.webflow.com으로 되어 있어서, SSL 인증서와 함께 컨텐츠를 내려주게 된다.

Webflow의 default domain 변경

이제 문제는 Webflow에서 default가 www.jayground.com이 아니라 jayground.com으로 사용하고 싶은 경우이다. 이때는 CNAME flattening을 통해서 할 수가 있다. 이제 DNS에서 jaygroud.comwww.jayground.com 둘 다 CNAME으로 proxy-ssl.webflow.com으로 등록하고, Webflow에서 jayground.com을 Default로 설정하면 된다. 가비아에서 제공하는 DNS으로는 이렇게 CNAME flattening이 가능해서 CNAME을 등록하면, https://www.jayground.com에 접근을 할 때 https://jayground.com으로 Redirect 된다. 하지만 AWS Route53을 사용한다고 하면, CNAME flattening 같은 걸 제공하지 않는다. 따라서 jayground.com으로 CNAME record를 등록 할 수가 없다. AWS Route53에서 Root record로 AWS에 있는 resource들을 Alias로 등록할 수는 있지만, 다른 도메인을 등록할 수는 없다.

🤔 Webflow는 왜 이렇게 되어 있는 걸까?

CNAME flattening의 장점을 생각해보면, Webflow에서 고정된 IP address를 A record로 등록하게 하는 것보다 CNAME을 등록하면 인프라 리소스가 변경되어도 유연하게 대처할 수 있을 것이다. 그런데 기본적으로 Root record로 CNAME을 등록할 수가 없으니깐, jayground.com에는 A record를 등록할 수 있게 IP address를 제공한다. 그리고 이건 아주 간단하게 Redirect만 수행해서 인프라 자원을 최소한으로 쓰도록 한다. 그리고 redirect된 www.jayground.com은 CNAME을 등록할 수 있으니깐, proxy-ssl.webflow.com에서 Let's encrypt 인증서도 내려주고, 해당 컨텐츠들을 내려준다. 그런데 만약 CNAME flattening 지원한다고 하면 jayground.comwww.jayground.com 모두 CNAME으로 등록하여 인프라 자원의 유연함을 가져갈 수 있을 것이다.

🤔 Github pages는?

그런데 Webflow 케이스에 대한 나의 생각이 맞다면, Github pages의 경우에 사용하는 사용자 숫자가 훨씬 많을 텐데 왜 CNAME을 활용하지 않을까?🤔 Github pages의 경우에는 모두에게 문서에 나온 것처럼 특정한 IP를 제공하여 A record를 등록하게 한다.

185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153

이 IP의 서버들이 load balancer로 reverse proxy 역할을 할 것이고, 이 서버들의 사양이 충분히 대규모 사용자의 트래픽을 충분히 감당할 수 있게 설계가 되어 있을 것이다. 일단 DNS specification에서는 CNAME record를 root record로 등록할 수가 없고, CNAME flattening같은 건 CNAME을 등록할 수 있는 편법(?)같은 거니깐 CNAME은 생각하지 않는 것일까? 그리고 Github pages는 이미 대규모의 사용자를 가지고 있고, 그것을 위해 변화가 적은 인프라를 유지하고 있어서 구지 CNAME record를 통해서 유연함을 가져갈 필요가 없는 것일까? 🤔🤔🤔