๋ฐ˜์‘ํ˜•

TL;DR


ETag(์—”ํ‹ฐํ‹ฐ ํƒœ๊ทธ; Entity Tag)๋Š” HTTP ์‘๋‹ต ํ—ค๋” ์ค‘ ํ•˜๋‚˜๋กœ, ์›น ๋ฆฌ์†Œ์Šค์˜ ํŠน์ • ๋ฒ„์ „์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ETag๋ฅผ ์ด์šฉํ•ด ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ์„œ๋ฒ„์— ๊ฒ€์ฆํ•˜๊ณ , ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์บ์‹œ ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•˜๊ณ  ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ž‘๋™ ๋ฐฉ์‹


  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒ˜์Œ ์š”์ฒญํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์‘๋‹ต ํ—ค๋”์— ETag ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์™€ ํ•จ๊ป˜ ์ „๋‹ฌ
  2. ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ETag ๊ฐ’ ์ €์žฅ
  3. ์ดํ›„ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค ์žฌ์š”์ฒญ ์‹œ If-None-Match ์š”์ฒญ ํ—ค๋”์— ETag ๊ฐ’์„ ๋‹ด์•„์„œ ์„œ๋ฒ„๋กœ ์ „์†ก
  4. ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋ฐ›์€ ETag ๊ฐ’๊ณผ ํ˜„์žฌ ๋ฆฌ์†Œ์Šค์˜ ETag ๊ฐ’ ๋น„๊ต
    • ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฉด ๋ณธ๋ฌธ(body)์€ ์ƒ๋žตํ•˜๊ณ  304 Not Modified ๋ฐ˜ํ™˜
    • ๊ฐ’์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ตœ์‹  ๋ฆฌ์†Œ์Šค์™€ ์ƒˆ๋กœ์šด ETag ๊ฐ’์„ ๋‹ด์•„์„œ 200 OK ๋ฐ˜ํ™˜

 

 

ETag ์ข…๋ฅ˜


ETag๋Š” ๊ฒ€์ฆ ๊ฐ•๋„์— ๋”ฐ๋ผ Strong ETag์™€ Weak ETag ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋‰œ๋‹ค.

 

  1. Strong ETag
    • ๋ฆฌ์†Œ์Šค ๋‚ด์šฉ์ด ๋ฐ”์ดํŠธ ๋‹จ์œ„๊นŒ์ง€ ์™„์ „ํžˆ ์ผ์น˜ํ•ด์•ผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ
    • ๋ฆฌ์†Œ์Šค๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋ฉด ETag ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ
    • ํ‘œ๊ธฐ ์˜ˆ์‹œ: "abcdefg" (์ ‘๋‘์‚ฌ ์—†์Œ)
  2. Weak ETag
    • ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜๋ฏธ์ƒ ๋™์ผํ•˜๋‹ค๋ฉด ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ฐจ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ
    • ๊ด‘๊ณ  ๋ฐฐ๋„ˆ, ๋™์  ํƒ€์ž„์Šคํƒฌํ”„ ๋“ฑ ์˜๋ฏธ ์—†๋Š” ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
    • ํ‘œ๊ธฐ ์˜ˆ์‹œ: W/"abcdefg" (W/ ์ ‘๋‘์‚ฌ ์ถ”๊ฐ€)

 

Weak ETag๋Š” ์˜๋ฏธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ถ€๋ถ„(๋™์  ํƒ€์ž„์Šคํƒฌํ”„, ๊ด‘๊ณ  ๋ฐฐ๋„ˆ ๋“ฑ)์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ •๊ทœํ™”ํ•œ ๋’ค, ๋‚จ์€ ์ฝ˜ํ…์ธ ๋ฅผ ํ•ด์‹œ(hash)ํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค. ์ •๊ทœํ™”๋ž€ ์›๋ณธ ๋ฐ์ดํ„ฐ์—์„œ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์˜๋ฏธ ์—†๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ , ์ผ์ •ํ•œ ํ˜•ํƒœ๋กœ ํ†ต์ผํ•˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, HTML ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๊ทœํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

<!-- ์ •๊ทœํ™” ์ „ -->
<div class="updated">2025-05-04 12:34</div>
<!-- ์ •๊ทœํ™” ํ›„ -->
<div class="updated"></div>

 

 

ETag ๊ฐ’


ETag ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ, ๋ณ„๋„์˜ ํ‘œ์ค€ ํฌ๋งท์€ ์—†์ง€๋งŒ ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

 

  • ์ฝ˜ํ…์ธ  ๋‚ด์šฉ์˜ ํ•ด์‹œ ๊ฐ’ (MD5, SHA1 ๋“ฑ)
  • ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์‹œ๊ฐ„์˜ ํ•ด์‹œ ๊ฐ’
  • ๋‹จ์ˆœํ•œ ๋ฆฌ๋น„์ „ ๋ฒˆํ˜ธ ๋˜๋Š” ๋ฒ„์ „ ๋ฒˆํ˜ธ

 

 

์—…๋ฐ์ดํŠธ ์†์‹ค


์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฑฐ์˜ ๋™์‹œ์— ์ฝ๊ณ  ๊ฐ๊ฐ ์ˆ˜์ •์„ ์‹œ๋„ํ•˜๋ฉด, ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ๋œ ๋ณ€๊ฒฝ์ด ์•ž์„  ๋ณ€๊ฒฝ์„ ๋ฎ์–ด์“ฐ๋Š” ์—…๋ฐ์ดํŠธ ์†์‹ค(Lost Update) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด If-Match ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด์œ ํ•œ ETag์™€ ์„œ๋ฒ„์˜ ETag๊ฐ€ ์ผ์น˜ํ•  ๋•Œ๋งŒ ๋ณ€๊ฒฝ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์กฐ๊ฑด๋ถ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

  1. ํด๋ผ์ด์–ธํŠธ A, B๊ฐ€ ๋™์‹œ์— ๋ฆฌ์†Œ์Šค ์กฐํšŒ
    • A์™€ B๊ฐ€ ๊ฐ๊ฐ GET ์š”์ฒญ
    • ์„œ๋ฒ„๋Š” ETag: "v1" ์‘๋‹ต
  2. A๊ฐ€ ๋จผ์ € ๋ณ€๊ฒฝ ์š”์ฒญ
    • A๋Š” If-Match: "v1" ํ—ค๋”์™€ ํ•จ๊ป˜ PUT ์š”์ฒญ
    • ์„œ๋ฒ„๋Š” ETag ์ผ์น˜ ํ™•์ธ ํ›„ ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰ → ETag๋ฅผ "v2"๋กœ ๊ฐฑ์‹ ํ•˜๊ณ  200 OK ๋ฐ˜ํ™˜
  3. B๊ฐ€ ๋’ค์ด์–ด ๋ณ€๊ฒฝ ์š”์ฒญ
    • B๋Š” ์—ฌ์ „ํžˆ ETag: "v1"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PUT ์š”์ฒญ
    • ์„œ๋ฒ„์˜ ETag๋Š” ์ด๋ฏธ "v2"์ด๋ฏ€๋กœ B์˜ ETag์™€ ๋ถˆ์ผ์น˜ → 412 Precondition Failed ๋ฐ˜ํ™˜

 

๋งŒ์•ฝ 3๋ฒˆ์—์„œ ์กฐ๊ฑด ์—†์ด B์˜ ๋‚ด์šฉ์œผ๋กœ ๋ฎ์–ด์“ด๋‹ค๋ฉด A์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. If-Match ์กฐ๊ฑด์ด ์‹คํŒจํ–ˆ์„ ๋• ์ผ๋ฐ˜์ ์œผ๋กœ 412 Precondition Failed๋กœ ์‘๋‹ตํ•œ๋‹ค. ์š”์ฒญ์ด ๊ฑฐ๋ถ€๋œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ตœ์‹  ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค์‹œ GET ํ•ด์•ผ ํ•œ๋‹ค.

 

 

ETag์™€ Cache-Control


Cache-Control์€ ๋ธŒ๋ผ์šฐ์ €์™€ ์ค‘๊ฐ„ ์„œ๋ฒ„(Proxy, CDN ๋“ฑ)๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์‘๋‹ต์„ ์บ์‹ฑํ• ์ง€ ์ง€์ •ํ•˜๋Š” ํ—ค๋”๋กœ, ์บ์‹ฑ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(public, private, no-store), ์บ์‹œ ์œ ํšจ ๊ธฐ๊ฐ„(max-age), ์žฌ๊ฒ€์ฆ ๋ฐฉ์‹(no-cache, must-revalidate) ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Cache-Control๊ณผ ETag๋Š” ์›น ์บ์‹ฑ ์ „๋žต์—์„œ ์ƒํ˜ธ ๋ณด์™„์ ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ, ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋” ํšจ์œจ์ ์ธ ์บ์‹ฑ ์ •์ฑ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์ ์ธ ๋ฆฌ์†Œ์Šค๋Š” no-cache ์„ค์ •์„ ์ ์šฉํ•˜์—ฌ ๋งค๋ฒˆ ์„œ๋ฒ„์— ์žฌ๊ฒ€์ฆ์„ ์š”์ฒญํ•˜๊ฒŒ ํ•˜๊ณ , ETag๋ฅผ ํ†ตํ•ด ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๋• 304 Not Modified๋กœ ์‘๋‹ตํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

Cache-Control: no-cache
ETag: "v123"

 

  • no-cache: ์บ์‹œ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์ „ ๋งค๋ฒˆ ์›๋ณธ ์„œ๋ฒ„์— ์žฌ๊ฒ€์ฆ
  • must-revalidate: ๋งŒ๋ฃŒ๋œ ์บ์‹œ ๋ฐ์ดํ„ฐ๋Š” ์›๋ณธ ์„œ๋ฒ„ ์žฌ๊ฒ€์ฆ ์—†์ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€

 

๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ์ •์ ์ธ ๋ฆฌ์†Œ์Šค๋Š” max-age์™€ immutable์„ ํ•จ๊ป˜ ์„ค์ •ํ•˜์—ฌ ์œ ํšจ ๊ธฐ๊ฐ„ ๋™์•ˆ ์„œ๋ฒ„ ์žฌ๊ฒ€์ฆ ์š”์ฒญ ์—†์ด ์บ์‹œ ๋œ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค. max-age ๊ธฐ๊ฐ„ ๋™์•ˆ ETag๋ฅผ ์ด์šฉํ•œ ์žฌ๊ฒ€์ฆ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์ง€๋งŒ, ์บ์‹œ๊ฐ€ ๋งŒ๋ฃŒ๋˜๊ฑฐ๋‚˜ immutable์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ์˜ ์žฌ๊ฒ€์ฆ์„ ์œ„ํ•ด ETag๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

Cache-Control: max-age=31536000, immutable
ETag: "abc456"

 

  • public: ๋ธŒ๋ผ์šฐ์ €์™€ ์ค‘๊ฐ„ ์„œ๋ฒ„(ํ”„๋ก์‹œ, CDN ๋“ฑ) ๋ชจ๋‘ ์‘๋‹ต์„ ์บ์‹ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ
  • max-age=31536000: ์บ์‹œ ์ƒ์„ฑ ํ›„ 1๋…„(31,536,000์ดˆ) ๋™์•ˆ fresh ์ƒํƒœ ์œ ์ง€
  • immutable: ์œ ํšจ ๊ธฐ๊ฐ„ ๋‚ด ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์žฌ๊ฒ€์ฆ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ์ง€์‹œ

 

 

๋ ˆํผ๋Ÿฐ์Šค


 

ETag - HTTP | MDN

ETag HTTP ์‘๋‹ต ํ—ค๋”๋Š” ํŠน์ • ๋ฒ„์ „์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ์›น ์„œ๋ฒ„๊ฐ€ ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š์•˜์œผ๋ฉด, ์›น ์„œ๋ฒ„๋กœ full ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์บ์‰ฌ๊ฐ€ ๋” ํšจ์œจ์ ์ด๊ฒŒ ๋˜๊ณ , ๋Œ€์—ญํญ

developer.mozilla.org

 

๋ฐ˜์‘ํ˜•