IT

πŸ–₯️ HTTP ν†΅μ‹ μ˜ μˆ¨μ€ μ‘°λ ₯자: λ§ˆμ΄λ„ˆ 헀더 3총사 νŒŒν—€μΉ˜κΈ° πŸ”‘

(ETag, Vary, Accept-Language μ™„λ²½ 뢄석)

μ›Ή λΈŒλΌμš°μ €μ™€ μ„œλ²„κ°€ 데이터λ₯Ό 주고받을 λ•Œ, μš°λ¦¬λŠ” λˆˆμ— 보이지 μ•ŠλŠ” HTTP 헀더λ₯Ό 톡해 μˆ˜λ§Žμ€ 정보λ₯Ό κ΅ν™˜ν•©λ‹ˆλ‹€. Content-Type, Authorization 같은 메이저 헀더 외에도, μ›Ή μ„±λŠ₯κ³Ό 캐싱, μ½˜ν…μΈ  ν˜‘μƒμ— μ€‘μš”ν•œ 역할을 ν•˜λŠ” β€˜λ§ˆμ΄λ„ˆβ€™ν•˜μ§€λ§Œ κ°•λ ₯ν•œ 헀더듀이 μžˆμŠ΅λ‹ˆλ‹€.


1️⃣ ETag (μ—”ν„°ν‹° νƒœκ·Έ): 파일의 μ§€λ¬Έ μΈμ‹ν‘œ 🏷️

ETagλŠ” μΊμ‹œ(Cache) νš¨μœ¨μ„ κ·ΉλŒ€ν™”ν•˜μ—¬ μ›Ήμ‚¬μ΄νŠΈμ˜ 속도λ₯Ό λΉ„μ•½μ μœΌλ‘œ λ†’μ΄λŠ” 데 μ‚¬μš©λ˜λŠ” ν—€λ”μž…λ‹ˆλ‹€. μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)둜 λ¦¬μ†ŒμŠ€λ₯Ό 보낼 λ•Œ ν•¨κ»˜ μ „λ‹¬λ©λ‹ˆλ‹€.

🏠 ETagλŠ” λ¬΄μ—‡μΈκ°€μš”?

  • μ •μ˜: μ„œλ²„κ°€ νŠΉμ • λ¦¬μ†ŒμŠ€(파일, 이미지 λ“±)에 λΆ€μ—¬ν•˜λŠ” κ³ μœ ν•œ μ‹λ³„μž λ˜λŠ” 버전 λ²ˆν˜Έμž…λ‹ˆλ‹€. λ¦¬μ†ŒμŠ€μ˜ λ‚΄μš©μ΄ 단 1λ°”μ΄νŠΈλΌλ„ λ³€κ²½λ˜λ©΄, ETag 값은 μ™„μ „νžˆ λ‹¬λΌμ§‘λ‹ˆλ‹€.
  • μ—­ν• : ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μŒμ— 같은 λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•  λ•Œ, μ„œλ²„μ— β€œλ‚΄κ°€ κ°€μ§„ 이 λ¦¬μ†ŒμŠ€λŠ” ETag 값이 A인데, μ„œλ²„μ— μžˆλŠ” κ°’κ³Ό 같은지 확인해 μ€˜β€λΌκ³  λ¬Όμ–΄λ³Ό 수 있게 ν•©λ‹ˆλ‹€.

πŸ–₯️ ETagκ°€ μž‘λ™ν•˜λŠ” 원리 (쑰건뢀 μš”μ²­)

  1. 졜초 μš”μ²­: ν΄λΌμ΄μ–ΈνŠΈκ°€ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜λ©΄, μ„œλ²„λŠ” λ¦¬μ†ŒμŠ€μ™€ ν•¨κ»˜ ETag: "v1.2a4" 같은 값을 응닡 헀더에 λ‹΄μ•„ λ³΄λƒ…λ‹ˆλ‹€.
  2. μž¬μš”μ²­ (쑰건뢀 μš”μ²­): ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‚˜μ€‘μ— 같은 λ¦¬μ†ŒμŠ€λ₯Ό λ‹€μ‹œ μš”μ²­ν•  λ•Œ, λΈŒλΌμš°μ €λŠ” 이전에 받은 ETag 값을 If-None-MatchλΌλŠ” μš”μ²­ 헀더에 λ‹΄μ•„ λ³΄λƒ…λ‹ˆλ‹€.
    • μš”μ²­ 헀더: If-None-Match: "v1.2a4"
  3. μ„œλ²„ 검증 및 응닡:
    • βœ… λ‚΄μš©μ΄ λ³€ν•˜μ§€ μ•Šμ€ 경우: μ„œλ²„λŠ” μš”μ²­λ°›μ€ ETag("v1.2a4")κ°€ ν˜„μž¬ μ„œλ²„μ— μžˆλŠ” λ¦¬μ†ŒμŠ€μ˜ ETag와 κ°™λ‹€λŠ” 것을 ν™•μΈν•©λ‹ˆλ‹€. μ„œλ²„λŠ” 304 Not Modified 응닡을 λ³΄λƒ…λ‹ˆλ‹€.
      • κ²°κ³Ό: μ‹€μ œ λ¦¬μ†ŒμŠ€ λ°μ΄ν„°λŠ” μ „μ†‘λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” 둜컬 μΊμ‹œ(Local Cache)에 μ €μž₯된 λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½μ„ μ•„λ‚λ‹ˆλ‹€.
    • ❌ λ‚΄μš©μ΄ λ³€ν•œ 경우: μ„œλ²„λŠ” ETagκ°€ λ‹€λ₯΄λ‹€λŠ” 것을 ν™•μΈν•©λ‹ˆλ‹€. μ„œλ²„λŠ” 200 OK와 ν•¨κ»˜ λ³€κ²½λœ μƒˆ λ¦¬μ†ŒμŠ€μ™€ μƒˆλ‘œμš΄ ETag 값을 μ „μ†‘ν•©λ‹ˆλ‹€.
μ’…λ₯˜ν—€λ” μ—­ν• μ˜ˆμ‹œ κ°’
응닡 ν—€λ”λ¦¬μ†ŒμŠ€μ˜ ν˜„μž¬ 버전을 μ•Œλ¦ΌETag: "6868976a1c1a"
μš”μ²­ 헀더이 값이 아닐 λ•Œλ§Œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­If-None-Match: "6868976a1c1a"

2️⃣ Vary: μΊμ‹±μ˜ 정확성을 λ†’μ΄λŠ” κΈ°μ€€ βš–οΈ

Vary ν—€λ”λŠ” ν”„λ‘μ‹œ μ„œλ²„λ‚˜ CDN(Content Delivery Network) 같은 쀑간 μΊμ‹œμ—κ²Œ β€œμ΄ 응닡을 μΊμ‹œν•  λ•Œ, 이 헀더 값듀도 κ³ λ €ν•΄μ„œ μΊμ‹œλ₯Ό ꡬ뢄해야 해”라고 μ•Œλ €μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

🏠 VaryλŠ” μ™œ ν•„μš”ν•œκ°€μš”?

  • 문제 상황: 예λ₯Ό λ“€μ–΄, example.com/index.html νŽ˜μ΄μ§€κ°€ μžˆλŠ”λ°, μ‚¬μš©μžμ˜ λΈŒλΌμš°μ € μ’…λ₯˜(λͺ¨λ°”일 vs. λ°μŠ€ν¬ν†±)에 따라 μ„œλ²„κ°€ λ‹€λ₯Έ HTML λ‚΄μš©μ„ μ‘λ‹΅ν•œλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€.
  • Varyκ°€ μ—†λ‹€λ©΄: 쀑간 μΊμ‹œ μ„œλ²„λŠ” 첫 번째 μš”μ²­(예: λͺ¨λ°”일 μš”μ²­)에 λŒ€ν•œ μ‘λ‹΅λ§Œ μ €μž₯ν•©λ‹ˆλ‹€. 이후 λ°μŠ€ν¬ν†± μ‚¬μš©μžκ°€ μš”μ²­ν•΄λ„ μΊμ‹œ μ„œλ²„λŠ” λͺ¨λ°”μΌμš© 응닡을 잘λͺ» μ œκ³΅ν•˜κ²Œ λ©λ‹ˆλ‹€. ❌
  • Varyκ°€ μžˆλ‹€λ©΄: μ„œλ²„λŠ” 응닡 헀더에 Vary: User-Agentλ₯Ό ν¬ν•¨ν•˜μ—¬ μ‘λ‹΅ν•©λ‹ˆλ‹€.

πŸ–₯️ Vary μž‘λ™ 원리

  • 응닡 헀더: Vary: User-Agent
  • 의미: 쀑간 μΊμ‹œλŠ” 이제 /index.htmlμ΄λΌλŠ” URL ν•˜λ‚˜μ— λŒ€ν•΄ μΊμ‹œλ₯Ό μ €μž₯ν•  λ•Œ, User-Agent (μ‚¬μš©μž ν™˜κ²½ 정보)κ°€ λ‹€λ₯΄λ©΄ λ³„κ°œμ˜ μΊμ‹œ ν•­λͺ©μœΌλ‘œ μ·¨κΈ‰ν•˜μ—¬ μ €μž₯ν•©λ‹ˆλ‹€.
  • κ²°κ³Ό:
    • User-Agent: Mobile β†’ λͺ¨λ°”μΌμš© μΊμ‹œ μ €μž₯
    • User-Agent: Desktop β†’ λ°μŠ€ν¬ν†±μš© μΊμ‹œ μ €μž₯
  • λͺ©μ : ν•˜λ‚˜μ˜ URL이 상황(헀더 κ°’)에 따라 μ—¬λŸ¬ λ‹€λ₯Έ 응닡을 κ°€μ§ˆ λ•Œ, 잘λͺ»λœ μΊμ‹œλ₯Ό μ œκ³΅ν•˜λŠ” 것을 λ°©μ§€ν•˜μ—¬ μ •ν™•ν•œ μ½˜ν…μΈ λ₯Ό 보μž₯ν•©λ‹ˆλ‹€.

3️⃣ Accept-Language: μ‚¬μš©μžμ—κ²Œ 맞좀 μ–Έμ–΄ 제곡 πŸ—£οΈ

Accept-LanguageλŠ” ν΄λΌμ΄μ–ΈνŠΈ(λΈŒλΌμš°μ €)κ°€ μ„œλ²„μ—κ²Œ β€œλ‚˜, 이 μ–Έμ–΄λ“€ 읽을 수 μžˆμ–΄μš”β€λΌκ³  μžμ‹ μ˜ μ„ ν˜Έ μ–Έμ–΄ λͺ©λ‘μ„ μ•Œλ €μ£ΌλŠ” μš”μ²­ ν—€λ”μž…λ‹ˆλ‹€.

🏠 Accept-Language의 ꡬ쑰

  • 이 ν—€λ”λŠ” μ—¬λŸ¬ μ–Έμ–΄λ₯Ό μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ „λ‹¬ν•˜λ©°, 각 μ–Έμ–΄ 뒀에 β€˜q’ (Quality factor) 값을 μ‚¬μš©ν•˜μ—¬ μ„ ν˜Έλ„λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. q 값은 0μ—μ„œ 1 μ‚¬μ΄μ˜ 숫자둜, λ†’μ„μˆ˜λ‘ μ„ ν˜Έλ„κ°€ λ†’μŠ΅λ‹ˆλ‹€. (기본값은 1)

πŸ–₯️ Accept-Language μž‘λ™ 원리 (μ½˜ν…μΈ  ν˜‘μƒ)

헀더 μ’…λ₯˜μ˜ˆμ‹œμ˜λ―Έ
μš”μ²­ 헀더Accept-Language: ko-KR, en-US;q=0.9, en;q=0.81. ν•œκ΅­μ–΄ (ko-KR) μ΅œμš°μ„  μ„ ν˜Έ
2. λ―Έκ΅­ μ˜μ–΄ (en-US)λŠ” 0.9 μ„ ν˜Έλ„
3. 일반 μ˜μ–΄ (en)λŠ” 0.8 μ„ ν˜Έλ„
응닡 헀더Content-Language: ko-KRμ„œλ²„κ°€ μ΅œμ’…μ μœΌλ‘œ ν•œκ΅­μ–΄ μ½˜ν…μΈ λ₯Ό λ³΄λƒˆμŒμ„ λͺ…μ‹œ
  • μ„œλ²„μ˜ μ—­ν• : μ„œλ²„λŠ” 이 Accept-Language μš”μ²­ 헀더λ₯Ό λΆ„μ„ν•˜μ—¬, ν•΄λ‹Ή μ–Έμ–΄λ‘œ λ²ˆμ—­λœ λ¦¬μ†ŒμŠ€(HTML, ν…μŠ€νŠΈ)κ°€ μžˆλ‹€λ©΄ κ°€μž₯ μ„ ν˜Έλ„κ°€ 높은 μ–Έμ–΄λ‘œ νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•˜μ—¬ μ‘λ‹΅ν•©λ‹ˆλ‹€.
  • νŽΈμ˜μ„± μ¦λŒ€: μ‚¬μš©μžκ°€ λ³„λ„μ˜ μ–Έμ–΄ μ„€μ • 없이도 μ›Ήμ‚¬μ΄νŠΈμ— μ ‘μ†ν•˜λŠ” μ¦‰μ‹œ κ°€μž₯ μ΅μˆ™ν•œ μ–Έμ–΄μ˜ μ½˜ν…μΈ λ₯Ό λ³Ό 수 있게 ν•΄μ£ΌλŠ” 핡심적인 κΈ°λŠ₯μž…λ‹ˆλ‹€.

이 μ„Έ ν—€λ”λŠ” λˆˆμ— 잘 띄지 μ•Šμ„ 수 μžˆμ§€λ§Œ, μ›Ήμ˜ 속도 (ETag), μ •ν™•μ„± (Vary), 그리고 μ‚¬μš©μž μΉœν™”μ μΈ κ²½ν—˜ (Accept-Language)을 λ’·λ°›μΉ¨ν•˜λŠ” 맀우 μ€‘μš”ν•œ μš”μ†Œλ“€μž…λ‹ˆλ‹€. 이듀을 잘 μ΄ν•΄ν•˜κ³  ν™œμš©ν•˜λŠ” 것이 효율적인 μ›Ή 개발의 κΈ°λ³Έμž…λ‹ˆλ‹€.

infodori1234

Recent Posts

πŸ–₯ NetBIOS over TCP IP NBT μ™„μ „ κ°€μ΄λ“œ

둜컬 λ„€νŠΈμ›Œν¬ ν™˜κ²½μ„ μ‘°κΈˆμ΄λΌλ„ 닀뀄본 μ‚¬λžŒμ΄λΌλ©΄ ν•œ λ²ˆμ―€μ€ λ§ˆμ£ΌμΉ˜λŠ” μ΅μˆ™ν•œ 단어가 μžˆμŠ΅λ‹ˆλ‹€. λ°”λ‘œ NetBIOS와 NBTμž…λ‹ˆλ‹€.…

2κ°œμ›” ago

🏠 JSON Schema: 데이터 μœ νš¨μ„± κ²€μ¦μ˜ ν‘œμ€€ 섀계도 πŸ–₯

μ•ˆλ…•ν•˜μ„Έμš”! ν˜„λŒ€ μ›Ή κ°œλ°œμ—μ„œ 데이터 κ΅ν™˜μ˜ 핡심인 JSON(JavaScript Object Notation)을 λ”μš± κ°•λ ₯ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ λ§Œλ“€μ–΄μ£ΌλŠ” 도ꡬ,…

2κ°œμ›” ago

🏠 ECMAScript 3 ν˜Έν™˜μ„± μ™„μ „ 정리 κ°€μ΄λ“œ

❌ ECMAScript 3(E3)λž€ λ¬΄μ—‡μΌκΉŒ ECMAScript 3λŠ” 1999년에 κ³΅μ‹ν™”λœ μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œμ€€μ΄λ‹€. μ§€κΈˆ 보면 였래된 기술 κ°™μ§€λ§Œ,…

2κ°œμ›” ago

πŸ–₯ CoffeeScript μ™„μ „ κ°€μ΄λ“œ

CoffeeScriptλŠ” ν•œλ•Œ ν”„λ‘ νŠΈμ—”λ“œ 개발 μƒνƒœκ³„μ—μ„œ 맀우 인기 μžˆμ—ˆλ˜ μ–Έμ–΄μ˜€κ³ , μ§€κΈˆλ„ νŠΉμ • ν”„λ‘œμ νŠΈλ‚˜ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œ, κ°„κ²°ν•œ…

2κ°œμ›” ago

🏠 λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak) μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°: πŸ–₯ λ‚­λΉ„λ˜λŠ” μ»΄ν“¨ν„°μ˜ κΈ°μ–΅λ ₯ ❌

ν˜„λŒ€μ μΈ ν”„λ‘œκ·Έλž˜λ° ν™˜κ²½μ—μ„œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak)λŠ” μ—¬μ „νžˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ €ν•˜μ™€ μΆ©λŒμ„ μΌμœΌν‚€λŠ” μ£Όμš” 원인 쀑…

2κ°œμ›” ago

πŸ–₯️ λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ • (CRP) : μ›ΉνŽ˜μ΄μ§€κ°€ λˆˆμ•žμ— λ‚˜νƒ€λ‚˜κΈ°κΉŒμ§€μ˜ λ§ˆλ²•

(Critical Rendering Path, 핡심 λ Œλ”λ§ 경둜 μ™„λ²½ 이해) μ›Ή λΈŒλΌμš°μ €μ— μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜κ³  μ—”ν„°λ₯Ό λˆ„λ₯΄λŠ” μˆœκ°„,…

3κ°œμ›” ago