[DNS 기초] 가비아 DNS 설정 가이드: A, CNAME, TXT 레코드 정리
A, CNAME, TXT 레코드가 각각 무엇을 의미하고, 어떤 상황에서 사용해야 하는지 알기 쉽게 정리해 보았습니다.
DNS 레코드 완전 정복: A, CNAME, TXT 레코드의 모든 것
대상 독자: 도메인을 구입하고 처음 DNS 설정을 해보는 입문자부터, 레코드 간 차이가 헷갈리는 개발자까지
핵심 요약: DNS 레코드는 "도메인을 어디로, 어떤 방식으로 안내할 것인가"를 정의하는 규칙이다.
📋 목차
- DNS란 무엇일까?
- A 레코드 (Address)
- CNAME 레코드 (Canonical Name)
- TXT 레코드 (Text)
- 레코드 간 차이 심화: 언제 무엇을 써야 할까?
- DNS 전파 및 TTL 이해
- 한눈에 보는 요약
1. DNS란 무엇일까?
DNS(Domain Name System)는 인터넷 세상의 '전화번호부' 입니다.
컴퓨터는 123.45.67.89와 같은 숫자로 된 IP 주소로 서로를 인식합니다. 하지만 사람이 이 숫자를 일일이 외우는 건 불가능하죠. 그래서 minseok.life 같은 문자로 된 도메인을 입력하면, DNS가 이를 컴퓨터가 알아들을 수 있는 IP 주소로 변환하여 정확한 목적지(서버)로 안내해 줍니다.
DNS 조회 동작 원리 (DNS Resolution Flow)
브라우저에 minseok.life를 입력하면 실제로 다음 과정이 일어납니다.
[브라우저]
↓ "minseok.life의 IP 주소가 뭐야?"
[로컬 캐시 확인] → 없으면 ↓
[Recursive Resolver (ISP 또는 8.8.8.8)]
↓ Root DNS 서버에 질의
[Root DNS 서버] → ".life 담당은 여기야" → TLD 서버 안내
[TLD(Top Level Domain) 서버] → "minseok.life 담당 네임서버는 여기야"
[권한 네임서버 (가비아, AWS Route53 등)]
↓ 실제 레코드 반환 (A, CNAME, TXT 등)
[브라우저] → 해당 IP로 서버에 접속
이 과정에서 "어떤 레코드를 반환할 것인가" 를 정하는 것이 바로 DNS 레코드 설정입니다.
2. A 레코드 (Address) : IP 주소로 직접 연결
A 레코드는 도메인 이름을 숫자로 된 IPv4 주소로 직접 연결하는, 가장 기본적이고 직관적인 방식입니다.
| 항목 | 내용 |
|---|---|
| 연결 방식 | 도메인 → IPv4 주소 (예: 123.45.67.89) |
| 응답 속도 | 가장 빠름 (조회 단계 1회) |
| IP 변경 시 | DNS 레코드를 직접 수정해야 함 |
| 루트 도메인 사용 | 가능 (minseok.life 자체에 설정 가능) |
설정 예시 (가비아 기준)
타입 : A
호스트 : @ ← '@'는 루트 도메인(minseok.life) 자체를 의미
값 : 123.45.67.89
TTL : 3600
타입 : A
호스트 : www ← www.minseok.life에 별도 설정
값 : 123.45.67.89
TTL : 3600
주로 언제 사용할까?
- AWS EC2, DigitalOcean, 카페24 호스팅 등 고정 IP(Elastic IP) 를 직접 할당받은 서버를 운영할 때
- 집이나 사무실에 구축한 개인 NAS 서버에 도메인을 연결할 때
- 서버 인프라를 직접 관리하고 IP가 바뀔 일이 거의 없는 환경
💡 AAAA 레코드: A 레코드의 IPv6 버전입니다. IPv4가
123.45.67.89형태라면, IPv6는2001:0db8:85a3::8a2e:0370:7334형태입니다. 최근 IPv6 도입이 늘어나고 있어 함께 설정하는 경우도 많습니다.
3. CNAME 레코드 (Canonical Name) : 다른 도메인으로 연결
CNAME 레코드는 도메인을 숫자가 아닌 다른 도메인 이름(문자) 으로 연결하는 방식입니다. 일종의 '별명(Alias)' 을 지어주는 것과 같습니다.
| 항목 | 내용 |
|---|---|
| 연결 방식 | 내 도메인 → 다른 도메인 (예: host.tistory.io) |
| 응답 속도 | A 레코드보다 느림 (조회 단계 2회 이상) |
| IP 변경 시 | 목적지 도메인이 알아서 처리 → 내 레코드 수정 불필요 |
| 루트 도메인 사용 | 불가 (RFC 표준 제약, @에 설정 불가) |
설정 예시
타입 : CNAME
호스트 : www
값 : minseok.life. ← 끝의 점(.)은 절대 경로를 의미 (FQDN)
TTL : 3600
타입 : CNAME
호스트 : blog
값 : username.github.io.
TTL : 3600
주로 언제 사용할까?
- 외부 플랫폼 연결: 티스토리, GitHub Pages, Vercel, Netlify, Notion 등에 내 개인 도메인을 연결할 때
- 이런 플랫폼들은 서버 부하 분산, 장애 대응 등으로 인해 IP가 수시로 바뀔 수 있음
- CNAME을 쓰면 IP가 바뀌어도 플랫폼 측에서 알아서 처리하므로 내 설정은 건드릴 필요 없음
- 서브 도메인 별칭 처리:
www.minseok.life→minseok.life로 리다이렉트 처리할 때 - 다중 서브 도메인 관리:
shop,blog,api등 여러 서브 도메인을 하나의 도메인으로 모을 때
⚠️ CNAME의 핵심 제약: 루트 도메인에 설정 불가
RFC 1912 표준에 따라, CNAME은 루트 도메인(@, minseok.life 자체)에는 사용할 수 없습니다.
❌ 불가
타입 : CNAME
호스트 : @ ← 루트 도메인에 CNAME 설정 시 오류 또는 동작 이상
값 : username.github.io.
이 제약을 해결하기 위해 AWS Route53의 ALIAS 레코드, Cloudflare의 CNAME Flattening 같은 독자적 확장 기능이 존재합니다.
4. TXT 레코드 (Text) : 소유권 확인 및 텍스트 정보 저장
TXT 레코드는 어딘가로 연결(라우팅)하는 레코드가 아닙니다. 도메인에 특정 텍스트 정보를 기록해 두는 용도이며, 외부 시스템이 이 값을 읽어 소유권 확인이나 보안 정책을 검증하는 데 씁니다.
| 항목 | 내용 |
|---|---|
| 연결 방식 | 도메인 → 텍스트 문자열 |
| 트래픽 라우팅 | 없음 (사이트 접속과 무관) |
| 주요 용도 | 소유권 인증, 이메일 보안, API 키 배포 등 |
| 복수 설정 | 가능 (같은 도메인에 TXT 여러 개 공존 가능) |
주요 사용 사례
① 도메인 소유권 확인
Google Search Console, 네이버 웹마스터 도구 등은 "정말 이 도메인의 주인이 맞느냐"를 확인하기 위해 무작위 난수 코드를 TXT 레코드에 등록하라고 요구합니다.
타입 : TXT
호스트 : @
값 : google-site-verification=abc123XYZrandomcode
TTL : 3600
외부 기관의 서버가 DNS를 조회해 해당 값이 있으면 → 소유자 인증 완료.
② 이메일 발신자 인증 (SPF / DKIM / DMARC)
admin@minseok.life처럼 커스텀 도메인으로 이메일을 발송할 때 스팸 메일로 분류되지 않도록 발신자를 증명하는 보안 설정입니다.
| 설정 | 역할 | TXT 레코드 예시 |
|---|---|---|
| SPF | "이 도메인의 이메일은 이 서버에서만 발송됨"을 선언 | v=spf1 include:_spf.google.com ~all |
| DKIM | 이메일 본문에 디지털 서명을 붙여 위변조 방지 | v=DKIM1; k=rsa; p=MIGfMA0... |
| DMARC | SPF/DKIM 실패 시 어떻게 처리할지 정책 선언 | v=DMARC1; p=quarantine; rua=mailto:admin@minseok.life |
이 세 가지를 모두 설정해야 Gmail, Outlook 등 주요 메일 서버의 스팸 필터를 통과할 수 있습니다.
5. 레코드 간 차이 심화: 언제 무엇을 써야 할까?
실무에서 헷갈리는 상황별 판단 기준을 정리합니다.
판단 플로우차트
내 서버에 고정 IP가 있는가?
├── YES → A 레코드
└── NO
├── 외부 플랫폼(Vercel, GitHub 등)에 연결하는가?
│ └── YES → CNAME (단, 서브 도메인에만)
├── 루트 도메인에 외부 플랫폼을 연결해야 하는가?
│ └── YES → Cloudflare CNAME Flattening 또는 AWS ALIAS
└── 소유권 확인 / 이메일 보안 설정인가?
└── YES → TXT 레코드
상황별 추천 레코드
| 상황 | 추천 레코드 | 이유 |
|---|---|---|
EC2에 minseok.life 연결 | A | 고정 IP 직접 매핑 |
GitHub Pages에 blog.minseok.life 연결 | CNAME | GitHub IP는 유동적 |
Vercel에 minseok.life (루트) 연결 | ALIAS / CNAME Flattening | 루트 도메인 CNAME 불가 제약 우회 |
| Google Search Console 인증 | TXT | 소유권 증명 텍스트 |
| 커스텀 도메인 이메일 발송 | TXT (SPF/DKIM/DMARC) | 스팸 방지 인증 |
6. DNS 전파 및 TTL 이해
레코드를 설정했는데 바로 적용이 안 되는 경험을 해봤을 겁니다. 이건 TTL(Time To Live) 과 DNS 전파(Propagation) 때문입니다.
TTL이란?
DNS 응답이 캐시에 저장되는 시간(초 단위) 입니다.
TTL = 3600 → 이 레코드는 1시간(3600초) 동안 캐시됨
TTL = 300 → 5분마다 DNS 서버가 최신 값을 새로 조회
TTL = 86400 → 24시간 캐시 (변경 반영이 최대 24시간 지연 가능)
TTL 설정 전략
| 상황 | 권장 TTL |
|---|---|
| 운영 안정 상태 (변경 없음) | 3600 ~ 86400 (캐시 부하 감소) |
| 마이그레이션 / 서버 이전 예정 | 300 (변경 후 빠른 전파) |
| 장애 대응 시 즉각 전환 필요 | 60 ~ 300 |
💡 실무 팁: 서버 이전이나 DNS 변경 계획이 있다면, 최소 24~48시간 전에 TTL을 300으로 낮춰두세요. 그래야 실제 변경 후 전파 지연을 최소화할 수 있습니다.
DNS 전파 확인 도구
- dig (Linux/Mac):
dig minseok.life A→ 현재 응답 레코드 확인 - nslookup (Windows):
nslookup minseok.life 8.8.8.8 - 온라인 도구: dnschecker.org → 전 세계 DNS 서버 기준 전파 현황 확인
7. 한눈에 보는 요약
| 레코드 타입 | 연결 대상 | 주요 용도 | 루트 도메인 | 조회 단계 | 비유 |
|---|---|---|---|---|---|
| A | IPv4 주소 (숫자) | 고정 IP 서버 직접 연결 | ✅ 가능 | 1단계 | 직통 전화번호 |
| AAAA | IPv6 주소 (숫자) | IPv6 서버 직접 연결 | ✅ 가능 | 1단계 | IPv6 직통번호 |
| CNAME | 다른 도메인 (문자) | 외부 플랫폼 연결, 서브도메인 별칭 | ❌ 불가 | 2단계 이상 | 착신 전환 |
| TXT | 텍스트 문자열 | 소유권 인증, 이메일 보안(SPF/DKIM/DMARC) | ✅ 가능 | - | 신분증명서 |
| MX | 메일 서버 도메인 | 이메일 수신 서버 지정 | ✅ 가능 | - | 우편함 주소 |
| NS | 네임서버 도메인 | 도메인의 DNS 권한 위임 | ✅ 가능 | - | 전화번호부 관리자 |
💡 참고: 가비아 설정 창의 '타입 전체' 는 설정값이 아니라, 등록된 모든 레코드를 한 번에 모아보기 위한 필터(분류) 버튼입니다.
마치며
DNS 레코드는 처음엔 낯설지만, 결국 "내 도메인을 어디로, 어떻게 안내할 것인가" 라는 하나의 질문에 대한 답입니다. 실제로 설정을 몇 번 해보면 금방 감이 잡히니, 직접 도메인 하나를 구입해 A 레코드와 CNAME을 모두 설정해보는 것을 추천합니다.
작성: minseok.life | DNS 설정 관련 궁금한 점은 kms13011@naver.com 연락바랍니다.