๋ฐ˜์‘ํ˜•

TL;DR


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

 

 

์ •์ ์ธ ๋ฆฌ์†Œ์Šค


์ž˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ •์ ์ธ ๋ฆฌ์†Œ์Šค๋Š” ์žฅ๊ธฐ๊ฐ„ ์บ์‹œ
Cache-Control: public, max-age=31536000, immutable

 

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

 

 

๋™์ ์ธ ๋ฆฌ์†Œ์Šค


๋™์ ์ธ ๋ฆฌ์†Œ์Šค๋Š” ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งค๋ฒˆ ์„œ๋ฒ„์— ์žฌ๊ฒ€์ฆ
Cache-Control: no-cache, must-revalidate

 

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

 

 

๊ธฐํƒ€ Cache-Control ์ง€์‹œ์–ด


๐Ÿ’ก fresh๋Š” ์บ์‹œ ๋œ ์‘๋‹ต์ด ์•„์ง ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•„ ์œ ํšจํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , stale์€ ์บ์‹œ ๋œ ์‘๋‹ต์ด ๋งŒ๋ฃŒ๋˜์–ด ์ตœ์‹  ์ƒํƒœ๊ฐ€ ์•„๋‹˜์„ ๋‚˜ํƒ€๋ƒ„. stale-while-revalidate ์ง€์‹œ์–ด ์‚ฌ์šฉ ์‹œ stale ์บ์‹œ๊ฐ€ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ.

 

  • private: ์‘๋‹ต์„ ์‚ฌ์šฉ์ž(๋ธŒ๋ผ์šฐ์ € ๋“ฑ) ์บ์‹œ์—๋งŒ ์ €์žฅํ•˜๊ณ , ์ค‘๊ฐ„ ์„œ๋ฒ„(CDN ๋“ฑ)์—๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œ
  • no-store: ๋ธŒ๋ผ์šฐ์ €์™€ ์ค‘๊ฐ„ ์„œ๋ฒ„ ๋ชจ๋‘ ์‘๋‹ต์„ ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œ(๋ฏผ๊ฐํ•œ ์ •๋ณด ์ฒ˜๋ฆฌ์— ์ ํ•ฉ)
  • stale-while-revalidate: ๋งŒ๋ฃŒ๋œ ์บ์‹œ๋ฅผ ์ž„์‹œ๋กœ ์ œ๊ณตํ•˜๊ณ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์žฌ๊ฒ€์ฆ/์บ์‹œ ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰
  • max-stale: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งŒ๋ฃŒ๋œ ์‘๋‹ต์„ ํ—ˆ์šฉํ•˜๋Š” ์‹œ๊ฐ„. ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ max-stale=60 ์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ์บ์‹œ ๋œ ์‘๋‹ต์ด ๋งŒ๋ฃŒ๋œ ํ›„ ์ตœ๋Œ€ 60์ดˆ๊นŒ์ง€๋Š” ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„. ๊ฐ’ ์—†์ด max-stale๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋งŒ๋ฃŒ๋œ ์‘๋‹ต๋„ ์‹œ๊ฐ„์ œํ•œ ์—†์ด ๋ฐ›์•„๋“ค์ธ๋‹ค๋Š” ์˜๋ฏธ
  • min-fresh: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›๋Š” ์‘๋‹ต์ด ์ง€์ • ์‹œ๊ฐ„ ๋™์•ˆ fresh ํ•˜๋„๋ก ์š”๊ตฌ. ์˜ˆ๋ฅผ ๋“ค์–ด min-fresh=30 ์œผ๋กœ ์š”์ฒญํ•˜๋ฉด ์ตœ์†Œ 30์ดˆ ๋™์•ˆ fresh ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์‘๋‹ต๋งŒ ๋ฐ›๊ฒ ๋‹ค๋Š” ์˜๋ฏธ

 

 

์žฌ๊ฒ€์ฆ ์š”์ฒญ ํ—ค๋”


  • If-None-Match: ์ œ๊ณตํ•œ ETag์™€ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค์˜ ETag ๊ฐ’์ด ๋‹ค๋ฅผ ๋•Œ๋งŒ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • If-Modified-Since: ์ง€์ •ํ•œ ๋‚ ์งœ ์ดํ›„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์„ ๋•Œ๋งŒ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • If-Match: ETag๊ฐ€ ์ผ์น˜ํ•  ๋•Œ๋งŒ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • If-Unmodified-Since: ์ง€์ •ํ•œ ๋‚ ์งœ ์ดํ›„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์„ ๋•Œ๋งŒ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • If-Range: ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ๋ถ€๋ถ„ ์ „์†ก, ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋ฉด ์ „์ฒด ์ „์†ก

 

 

๋ ˆํผ๋Ÿฐ์Šค


 

Cache-Control - HTTP | MDN

Cache-Control ์ผ๋ฐ˜ ํ—ค๋” ํ•„๋“œ๋Š” ์š”์ฒญ๊ณผ ์‘๋‹ต ๋‚ด์˜ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์œ„ํ•œ ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์บ์‹ฑ ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” ๋‹จ๋ฐฉํ–ฅ์„ฑ์ด๋ฉฐ, ์ด๋Š” ์š”์ฒญ ๋‚ด์— ์ฃผ์–ด์ง„ ๋””๋ ‰ํ‹ฐ๋ธŒ๊ฐ€ ์‘๋‹ต ๋‚ด์— ์ฃผ์–ด์ง„

developer.mozilla.org

 

๋ฐ˜์‘ํ˜•