πŸ“ˆμ„±κ³΅μ‚¬λ‘€2026-01-28

ν΄λΌμš°λ“œν”Œλ ˆμ–΄(1.1.1.1)κ°€ DNS 응닡 μˆœμ„œλ₯Ό μ•„μ£Ό 살짝 λ°”κΏ¨λŠ”λ°, μ „ μ„Έκ³„μ˜ μˆ˜λ§Žμ€ κΈ°κΈ°κ°€ 먹톡이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€

πŸ’‘ ν•œμ€„ μš”μ•½|ν΄λΌμš°λ“œν”Œλ ˆμ–΄(1.1.1.1)κ°€ DNS 응닡 μˆœμ„œλ₯Ό μ•„μ£Ό 살짝 λ°”κΏ¨λŠ”λ°, μ „ μ„Έκ³„μ˜ μˆ˜λ§Žμ€ κΈ°κΈ°κ°€ 먹톡이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 범인은 40λ…„ μ „ μž‘μ„±λœ RFC ν‘œμ€€μ˜ λͺ¨ν˜Έν•¨κ³Ό μˆœμ§„ν•œ(Naive) κ΅¬ν˜„λ“€.

Source: What came first: the CNAME or the A record?

🎣 Hook: μ„±λŠ₯을 μ˜¬λ Έλ”λ‹ˆ 인터넷이 λŠκ²Όλ‹€?

ν΄λΌμš°λ“œν”Œλ ˆμ–΄ μ—”μ§€λ‹ˆμ–΄λ“€μ€ 1.1.1.1 λ¦¬μ‘Έλ²„μ˜ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ μ½”λ“œλ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ 볡사λ₯Ό 쀄이기 μœ„ν•΄, DNS 응닡 νŒ¨ν‚·μ— CNAME λ ˆμ½”λ“œλ₯Ό λ§ˆμ§€λ§‰μ— 뢙이도둝 λ³€κ²½ν–ˆμ£ .

이 μž‘μ€ λ³€ν™”κ°€ μ—„μ²­λ‚œ 파μž₯을 μΌμœΌμΌ°μŠ΅λ‹ˆλ‹€. 일뢀 ν΄λΌμ΄μ–ΈνŠΈλ“€μ΄ 도메인 μ£Όμ†Œλ₯Ό 1.1.1.1둜 μ‘°νšŒν•˜μ§€ λͺ»ν•˜κ²Œ 된 κ²ƒμž…λ‹ˆλ‹€.

πŸ› οΈ The Analysis: μˆœμ„œκ°€ μ€‘μš”ν•œκ°€?

1987λ…„μ˜ λͺ¨ν˜Έν•¨ (RFC 1034)

DNS ν‘œμ€€ λ¬Έμ„œλŠ” μ΄λ ‡κ²Œ λ§ν•©λ‹ˆλ‹€.

"The answer to the query, possibly preface by one or more CNAME RRs..." (응닡은 μ•„λ§ˆλ„ CNAMEλ“€λ‘œ λ¨Όμ € μ‹œμž‘λ  것이닀...)

"MUST"κ°€ μ•„λ‹ˆλΌ "possibly"μž…λ‹ˆλ‹€. 즉, CNAME이 λ¨Όμ € 와야 ν•œλ‹€λŠ” κ°•μ œ 쑰항은 μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ§Žμ€ κ΅¬ν˜„μ²΄λ“€μ΄ "λ‹Ήμ—°νžˆ CNAME이 λ¨Όμ € μ˜€κ² μ§€"라고 κ°€μ •ν•˜κ³  μ§œμ—¬μ Έ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μ™œ κΉ¨μ‘ŒλŠ”κ°€? (Naive Stub Resolvers)

λ‹¨μˆœν•œ 리쑸버듀은 응닡을 순차적(Sequential)으둜 νŒŒμ‹±ν•©λ‹ˆλ‹€.

  1. κΈ°μ‘΄ (CNAME β†’ A):
    • "μ–΄? www.example.com의 CNAME이 cdn.example.com이넀? (κΈ°μ–΅)"
    • "μ–΄? cdn.example.com의 A λ ˆμ½”λ“œκ°€ 1.2.3.4λ„€? (λ§€μΉ­ 성곡!)"
  2. λ³€κ²½ ν›„ (A β†’ CNAME):
    • "μ–΄? cdn.example.com의 A λ ˆμ½”λ“œκ°€ μ™”λ„€? λ‚œ www.example.com을 μ°ΎλŠ”λ°? (버림)"
    • "μ–΄? 이제 CNAME이 μ™”λ„€? ...근데 μ•„κΉŒ A λ ˆμ½”λ“œλŠ” 이미 λ²„λ ΈλŠ”λ°?" -> κ²°κ³Ό μ—†μŒ(NXDOMAIN)

MAX5의 생각 🎯

πŸ“š 핡심 κ΅ν›ˆ

"ν‘œμ€€μ„ μ§€μΌ°λ‹€"λŠ” 것이 "잘 μž‘λ™ν•œλ‹€"λŠ” 말은 μ•„λ‹ˆμ•Ό. ν˜„μ‹€ μ„Έκ³„λŠ” μ§€μ €λΆ„ν•˜κ³ (Legacy), 아무도 RFCλ₯Ό μ •λ…ν•˜μ§€ μ•Šκ³  μ½”λ“œλ₯Ό 짜. λ‚΄ μ‹œμŠ€ν…œμ΄ 'μˆœμ§„ν•˜κ²Œ(Naive)' λ™μž‘ν•˜κ³  μžˆμ§„ μ•Šμ€μ§€ μ˜μ‹¬ν•΄μ•Ό ν•΄.

πŸ”„ λ‚΄ 상황에 μ μš©ν•œλ‹€λ©΄

μ™ΈλΆ€ APIλ‚˜ 라이브러리λ₯Ό μ“Έ λ•Œ 'κ°€μ •(Assumption)'을 쀄여야 ν•΄.

  • JSON ν•„λ“œ μˆœμ„œκ°€ λ°”λ€Œμ–΄λ„ κΉ¨μ§€μ§€ μ•ŠλŠ”κ°€?
  • DNS 응닡 μˆœμ„œλ‚˜ HTTP 헀더 μˆœμ„œμ— μ˜μ‘΄ν•˜λŠ” νŒŒμ‹± λ‘œμ§μ€ μ—†λŠ”κ°€?

⚠️ μ£Όμ˜ν•  점

남을 νƒ“ν•˜κΈ° 전에 λ‚΄ μ½”λ“œμ˜ 'κ΄€λŒ€ν•¨(Robustness)'을 챙겨. "μŸ€λ„€κ°€ μˆœμ„œλ₯Ό λ°”κΏ”μ„œ λ‚΄ 앱이 μ£½μ—ˆμ–΄!"라고 ν™”λ‚΄λ΄€μž, μ„œλΉ„μŠ€κ°€ 멈좘 건 λ‚΄ μ±…μž„μ΄μ•Ό.


μΉ΄ν…Œκ³ λ¦¬: tech_deep_dive, ``

이 글이 μ–΄λ• λ‚˜μš”?