5분만에 끝내는 CNAME과 A 레코드

3

네트워크의 원리

목록 보기
7/7
post-thumbnail

Why

DNS 설정을 하다 보면, CNAME, A레코드, TXT, MX 등등의 새로운 용어들을 만나죠.
IP주소를 셋팅하러 왔는데 뭔가 많은 타입들을 보고 멈칫 하게 됩니다.

그런데, DNS 의 타입들은 꼭 필요한 것만 있다고 해도 과언이 아닙니다.
그래서 더 신중해지는데요.

여러 타입 중에서도 사람들은 CNAME 을 특히 어려워 해요.
A랑 헷갈리거든요.

오늘 이 차이를 완벽히 알아봅시다.

도메인, 전에 한번 다뤘죠.

우리가 막 14.169.188.13 이런 숫자 쓰지 않고, imweb.me 처럼 쓰는 거.
이게 바로 도메인이죠.

IP주소는 통신량을 줄이고 바이너리로 딱 4바이트로 만들기 위해 숫자로 되어 있습니다.
그런데 숫자는 사람들이 못외우니까… 어딘가 물어봐야 하니 DNS가 있죠.

그래서 개발자는 필연적으로 DNS 서버를 설정 해야 합니다.

근데 이때 말이에요.

A 는 IP 를 넣으면 되니 간단한데
CNAME 이란게 있네요? IP는 일단 안들어가네요?

A 레코드랑 CNAME, 뭐가 다르죠?

그냥 제일 중요한거 딱 하나만 기억하면 돼요.

  • A 레코드: 도메인 이름을 IP 주소에 바로 연결!
  • CNAME: 도메인 이름을 또 다른 도메인 이름에 연결!

음? 아직 모호하죠?
더 쉽게 풀어볼께요.

전화번호부에서 김철수라는 사람 정보를 찾는데,

  • A 레코드 방식은 "김철수: 010-XXXX-YYYY" 이렇게 이름 옆에 전화번호(IP 주소)가 딱 적혀 있는 거예요. 김철수 이름만 찾으면 바로 전화 걸 수 있죠.
  • CNAME 방식은 "박영희: 김미영 찾아보세요" 이렇게 이름 옆에 다른 사람 이름이 적혀 있는 거예요. 박영희한테 전화하려면, 일단 김미영부터 찾아보고 그 사람 전화번호를 다시 확인해야 하는 거죠.
    • 그러니까 CNAME은 별명(Alias)을 알려주는 거죠.
    • CNAME은 Canonical Name의 약자인데, 별명 이라고 생각하세요.

여러분이 www.example.com 주소를 DNS에 물어봤다고 칩시다.

  • 응답이 A 레코드로 1.2.3.4 라면, 브라우저는 고민 없이 바로 1.2.3.4 서버로 직진합니다.
  • 응답이 CNAME 레코드로 example.com 라면?
    • 브라우저는 "어? www.example.comexample.com이랑 같은 거구나" 라는걸 압니다.
    • 그리고 다시 example.com의 IP 주소를 물어봐요.
    • 그리고 example.com에 대한 A 레코드 (예: 1.2.3.4)를 받아서 그 IP 주소로 접속합니다.
    • 결국, CNAME은 이렇게 한 단계 더 거쳐서 찾아가는 방식이에요.

음.. 그럼 뭐하러 CNAME을 써요?

철수도, 영희도 둘다 전화번호 쓰면 안 되나요? → 됩니다. 근데…
CNAME이 빛을 발하는 순간들이 있죠.

가장 흔한 경우가, 여러 호스트명으로 똑같은 서버로 보내고 싶을 때에요.

example.com, www.example.com 둘 다 같은 사이트로 가야 한다고 해봅시다.

  • example.com은 A 레코드로 실제 IP 주소를 연결하고,
  • www.example.com은 CNAME으로 example.com에 연결하면 돼요.

이 상태에서, 서버 IP가 1.2.3.4에서 5.6.7.8로 바뀌었다면?

  • 여러분이 A 레코드만 썼다면, 둘 다 5.6.7.8로 일일이 바꿔줘야 해요.
    • 귀찮고, 누락될 수 있고, 레코드별 DNS 갱신 시간이 서로 맞지 않을수도 있어요
    • 우리가 제일 싫어하는거죠. 불확실한 상태 말이에요.
  • CNAME을 썼다면, CNAME은 놔두고 A 레코드만 5.6.7.8로 바꿔주면 끝납니다.
    • www.example.com은 CNAME으로 example.com 다른 도메인 자체를 가리키고 있으니까, example.com의 IP 주소가 바뀌는 대로 자동으로 새 IP 주소로 연결 됩니다.

결국 CNAME은 DNS 레코드를 관리하기 편하게 만들어 줍니다.

특히 요즘 클라우드에서 LB나 CDN처럼 IP 주소가 변할때 CNAME이 아주 유용해요.
클라우드가 아무리 IP를 바꿔도 우리는 아무것도 안해도 되니까요.

CNAME 레코드는 해당 호스트명으로 유일 해야 합니다.

CNAME은 한가지 제약 사항이 있어요.
같은 호스트명으로 다른 레코드가 있을 수 없어요.

  • www.abc.com A 한개
  • www.abc.com CNAME 한개
  • → 둘다 www 불가 하다는거죠.

그 이유는 생각해보면 당연 합니다.

영희의 전화번호는 김미영 번호니까, 김미영을 알려줘야 하는데요.
찾아보니 영희가 별명이 하나, 전화번호가 하나 이렇게 두개 있다고 해봐요.

그럼 나는 뭘 선택해야돼요? 헷갈리죠.

그래서 이런 일을 방지해고자
CNAME 은 해당 호스트명으로 유일 해야 합니다.

이쯤에서 알아보는 MX, TXT, Apex

여기까지 오신 김에 같이 알아봐요.

  • TXT 레코드
    • 이건 그냥 뭔가 관리자가 저장해둔 값을 그대로 제공하는 레코드예요.
    • 무언가 도메인에 대한 부가 정보를 제공해야할 때 사용합니다. (SPF, DMARC…)
    • 용량제한이 있으니 주의해야해요.
  • MX 레코드
    • Mail Exchanger의 약자예요.
    • 이 도메인이 포함된 이메일 주소로 메일을 보낼때는 어디로 보내야 하는지 알려주는 레코드 에요.
    • example.com 도메인으로 온 메일은 DNS에서 example.com의 MX 레코드를 찾아서 메일 서버 주소를 알아내고 거기로 들어가서 보내는 거죠.
  • 그럼 Apex 는 뭘까요?
    • 도메인 앞에 호스트명이 없을 때 Apex 라고 부르는 것입니다.
      • Apex 레코드 라는 레코드 타입은 없어요.
      • www.abc.com → www 가 호스트명
      • abc.com → 호스트명이 없음. → 이런걸 Apex 레코드 라고 부릅니다. (루트도메인 이라고 하는 사람도 있어요)
    • 왜 Apex 얘길 하냐면,
      • 보통 MX나 TXT 같은 레코드는 호스트명 없이 Apex 로 설정 하는게 국룰 이에요.
      • 즉, MX abc.com, TXT abc.com 처럼요.
      • 근데 CNAME 레코드를 Apex 로 만들었다? 그러니까 CNAME abc.com 을 했다?
      • 아까 제가 유일한 제약 사항이 있다 했죠.
        • CNAME은 해당 호스트명에서 유일해야 합니다.
        • 그런데 CNAME으로 Apex 를 걸었다?
        • 그럼 다른 Apex 레코드들(MX, TXT)이 전부 다 문제가 됩니다.
      • 그래서 대부분의 DNS는 Apex 로 CNAME 을 설정 못하게 아예 막아둡니다.

알고보니 좀 복잡하지만 쉽죠?

마무리

우리가 매일 쓰는 인터넷 주소, 그 뒤에는 이렇게 복잡한 DNS 레코드 타입들이 있었습니다.

A 레코드는 IP로 직진, CNAME은 다른 이름으로 우회

  • 왜 Apex 에 CNAME 을 못걸게 하지?
  • CNAME 은 대체 왜 필요하지?
  • CNAME 은 왜 한개만 등록 가능하지?
  • SaaS 에서 내 도메인 쓰려면 CNAME 으로 자기들 도메인을 넣으라던데? 왜 IP로 안하고 도메인으로 하지?
  • 내 도메인에 CNAME 레코드를 등록하면 CORS 는 대상 도메인? 내 도메인? 뭘로 하지? 리다이렉트 되는건가?

오늘 글로, 위 질문들이 조금 해결 되셨기를 바랍니다.

다음에도 유익하고 재밌는 이야기로 찾아올게요.

아임웹 CTO 매튜 드림.

profile
CTO at Imweb, 20년차 개발 장인, 전) 플레이오토 CTO/창업자

0개의 댓글