들어가며
처음 서버를 배포하고 도메인을 연결할 때, 대부분은 이런 경험을 한다. 호스팅 업체 가이드를 따라 뭔가를 입력하고, 몇 분 기다렸다가 도메인이 연결됐다는 걸 확인한다. 그 설정 화면에 A, CNAME, MX, TXT 같은 항목들이 있었는데, 가이드가 시키는 대로 했을 뿐 그게 뭘 의미하는지는 몰랐다.
이 글은 그 설정들이 실제로 무엇인지를 정리한다.
DNS가 하는 일 복습
브라우저에 example.com을 입력하면 브라우저는 IP 주소가 필요하다. 하지만 사람은 203.0.113.42 같은 숫자를 외우지 않는다. 이 변환을 해주는 게 DNS(Domain Name System) 다.
DNS를 인터넷의 전화번호부라고 흔히 비유한다. 이름(도메인)을 번호(IP)로 바꿔주는 데이터베이스다. 그리고 그 데이터베이스 안의 각 항목을 DNS 레코드라고 부른다.
레코드 정리
A 레코드
가장 기본적인 레코드다. 도메인을 IPv4 주소에 직접 매핑한다.
example.com. / A / 203.0.113.42
서버를 배포하고 도메인을 연결할 때 쓰는 바로 그것이다. AWS EC2나 VPS의 공인 IP를 여기에 입력한다. 브라우저가 example.com을 요청하면 DNS는 이 레코드를 찾아 203.0.113.42를 돌려준다.
하나의 도메인에 A 레코드를 여러 개 등록할 수 있다. 이 경우 DNS는 여러 IP를 돌아가며 반환해 부하를 분산한다.
AAAA 레코드
A 레코드의 IPv6 버전이다. IPv4가 32비트 주소(4개의 숫자)라면 IPv6는 128비트(8개의 16진수 그룹)이다.
example.com. / AAAA / 2001:db8::1
현재는 IPv4가 여전히 대세라 A 레코드와 함께 선택적으로 등록하는 경우가 많다.
CNAME 레코드
CNAME(Canonical Name)은 도메인을 IP가 아닌 다른 도메인에 연결한다.
www.example.com. / CNAME / example.com.
blog.example.com. / CNAME / mysite.github.io.
www.example.com에 접속하면 DNS는 "이건 example.com을 따라가" 라고 알려준다. 브라우저는 다시 example.com의 A 레코드를 찾아 최종 IP에 도달한다.
Vercel, Netlify, GitHub Pages에 도메인을 연결할 때 CNAME을 쓰는 이유가 이것이다. 이 서비스들의 IP는 자주 바뀔 수 있기 때문에, IP 대신 그들이 제공하는 도메인(cname.vercel-dns.com 같은)을 가리키게 한다.
A와 CNAME의 가장 중요한 차이가 하나 있다.
루트 도메인(example.com, 앞에 서브도메인이 없는 것)에는 CNAME을 쓸 수 없다. DNS 표준상 루트 도메인에는 다른 레코드(MX, TXT 등)가 함께 존재해야 하는데, CNAME은 "모든 조회를 다른 곳으로 넘겨라"는 의미라 충돌이 생긴다. 그래서 루트 도메인에는 항상 A 레코드를 써야 한다.
실전
레코드 종류를 알면 실제 설정이 보인다.
Vercel에 커스텀 도메인 연결
루트 도메인(example.com)은 A 레코드로 Vercel이 제공하는 IP를 입력하고, www는 CNAME으로 cname.vercel-dns.com을 가리킨다.
GitHub Pages에 연결
A 레코드로 GitHub의 IP 4개를 모두 등록하고, www는 CNAME으로 username.github.io를 가리킨다.
Gabia에서 도메인 구매 후 외부 서버 연결
Gabia는 도메인 등록 기관이자 DNS 호스팅도 제공한다. 도메인 관리 → DNS 정보 변경에서 레코드를 직접 편집할 수 있다. EC2나 외부 VPS를 연결할 때는 A 레코드에 서버 공인 IP를 입력하면 된다.
단, Gabia의 기본 DNS를 그대로 쓰는 경우와 네임서버를 AWS Route 53 등 외부로 위임한 경우를 구분해야 한다. 네임서버를 바꿨다면 Gabia DNS 설정이 아니라 위임한 쪽에서 레코드를 관리해야 한다.
AWS Route 53
Route 53은 DNS 호스팅 서비스다. Gabia에서 도메인을 샀더라도 네임서버를 Route 53으로 위임하면 이후 레코드 관리는 Route 53 콘솔에서 한다.
Route 53에는 일반 DNS에 없는 Alias 레코드가 있다. CNAME과 비슷하게 도메인을 다른 도메인으로 연결하지만, 루트 도메인에도 쓸 수 있다는 게 차이다. AWS 내부 리소스(ALB, CloudFront, S3 정적 웹사이트 등)에 루트 도메인을 연결할 때 Alias를 쓴다.
마치며
각 레코드가 하는 일을 정리하면 아래와 같다.
- A레코드 : IPv4 주소, 서버 IP 직접 연결
- AAAA 레코드 : IPv6 주소, IPv6 서버 연결
- CNAME 레코드 : 다른 도메인, 서브 도메인을 외부 서비스와 연결
각 레코드가 무슨 역할을 하는지 알면, 가이드가 "이 값을 입력하세요"라고 할 때 그게 왜 그런지도 이해하면서 설정할 수 있다.