์น ์ฑ๋ฅ ๊ฐ์ ์ ์ํ HTTP Cache
์น ํ์ด์ง ๋ก๋ฉ ์๊ฐ์ ๋จ์ถํ๋ ๊ฒ์ ์น ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ด๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก HTTP Cache.
์น์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ๊ฒ์ด๋ค. ์ด ๋ ์น ๋ธ๋ผ์ฐ์ ๋ ๋งค๋ฒ ์น ์๋ฒ์๊ฒ ์์ฒญํด์ ์๋ต์ ๋ฐ์์ผํ๊ณ ์น ์๋ฒ๋ ๋งค๋ฒ ์น ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ๋ํ ์๋ต์ ๋ง๋ค๊ณ ๋ฐํํด์ผํ๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ์๋ฒ์ ๋ถํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด๋ ๊ธฐ์ HTTP Cache๋ฅผ ํ์ฉํ๋ฉด ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ถํ๋ฅผ ๋ชจ๋ ์ค์ด๊ณ ์น ํ์ด์ง ์๋๋ฅผ ๊ฐ์ ํ ์์๋ค. ์ค๋์ HTTP Cache์ ๋ํด ํฌ์คํ ํ๊ณ ์ ํ๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ ๋งค๋ฒ ์น ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ฒ๋ ๊ทธ ์์ฒญ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ์ฌ ๋ฐํํ๋ค. ์ด ๊ณผ์ ์ ์๊ฐ๊ณผ ๋ฆฌ์์ค๊ฐ ๋ง์ด ์๋ชจ๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ : ๋งค๋ฒ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์๋ฒ์ ์์ฒญํ ํ์๊ฐ ์์๊น? ์ด์ ์ ๋ฐ์์จ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด ์ด๋จ๊น? → Private Cache ์ ๊ฐ๋
- ์น ์๋ฒ: ๋งค๋ฒ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ํ์๊ฐ ์์๊น? ์ด์ ์ ์์ฑํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด ์ด๋จ๊น? → Public Cache ๋๋ Shared Cache(Foward/Reverse Proxy or CDN)์ ๊ฐ๋
์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ์ธก๋ฉด์์์ HTTP Cache ๋น์ฉ ์ ๊ฐ
1. ์น ๋ธ๋ผ์ฐ์ ์ธก๋ฉด: ๊ฒฐ๊ณผ "๋ฐํ" ๋น์ฉ(์๊ฐ, ๋คํธ์ํฌ) ์ ๊ฐ
์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋, ์๋ฒ๋ ์์ฒญ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ณ ๋ฐํํ๋ ๋ฐ ์๊ฐ์ด ์์๋๋ค. ์๋ฅผ ๋ค์ด, ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ค ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ฉด, ์๋ฒ๋ ๊ทธ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๋ฐ 3์ด, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฐํํ๋ ๋ฐ 3์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด ์ด 6์ด๊ฐ ์์.
- ์บ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์บ์์ ์ ์ฅ๋ ๋ฆฌ์์ค๋ฅผ ์ฆ์ ์ฌ์ฉ (0์ด)
- ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด์ง ์์ผ๋ฏ๋ก ๋คํธ์ํฌ ๋ฐ ์๋ฒ ์์ ์์ ์์
- ์ด ์์ ์๊ฐ: 0์ด
2. ์น ์๋ฒ ์ธก๋ฉด: ๊ฒฐ๊ณผ "์์ฑ" ๋น์ฉ(๋ ธ๋, ์์) ์ ๊ฐ
์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ฒ๋ ๊ทธ ์์ฒญ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด์ผ ํ๋ค. ๊ทธ๋ฌ๋, ์๋ฒ๊ฐ ์ด์ ์ ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ์ฌ ์บ์์ ์ ์ฅํด ๋์๋ค๋ฉด, ์๋ฒ๋ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ํ์ ์์ด ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
- ์บ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
- ์๋ฒ๊ฐ ์ด์ ์ ์์ฑํ ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅ
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ ๋ ์๋ฒ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ์ง ์๊ณ ์บ์์์ ๋ฐ๋ก ๋ฐํ (3์ด)
- ์ด ์์ ์๊ฐ: 3์ด
์ด์ฒ๋ผ HTTP Cache๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋ถํ๋ฅผ ์ค์ผ ์ ์๊ณ ๋ก๋ ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋ ์ค์ํ ๊ธฐ์ ์ด๋ค.
HTTP Cache: ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ์ฌ์ด์ ์์ ์ค๊ฐ ์ ์ฅ์
์บ์๋ ์น ๋ธ๋ผ์ฐ์ , ํ๋ก์ ์๋ฒ, ์น ์๋ฒ์ ์์นํ ์ ์๋ค. ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ๋ ๋ฐ๋ณต๋๋ ์์ฒญ์ ๋ํ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด HTTP Cache๋ฅผ ๋์ ํ๋ฉฐ, ์ด ์บ์๋ ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ์ฌ์ด์์ HTTP Resource๋ฅผ ์ฌํ์ฉํ๊ธฐ ์ํ ์์ ์ค๊ฐ ์ ์ฅ์ ์ญํ ์ ํ๋ค.
- HTTP Cache ๋ฐ์ดํฐ๋ฅผ ์บ์ํ๋ ๊ณณ์ ํฌ๊ฒ ๋ ๊ณณ์ผ๋ก ๋๋ฐ๋ค.
- Private Cache: ํด๋ผ์ด์ธํธ ์ธก์์๋ง ์ฌ์ฉ๋๋ ์บ์๋ก, ํน์ ์น ๋ธ๋ผ์ฐ์ ์๋ง ์ ์ฅ๋๋ค
- Public Cache:์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ๊ณต์ ํ๋ ์บ์๋ก, ํ๋ก์ ์๋ฒ ๋๋ CDN๊ณผ ๊ฐ์ ์ค๊ฐ ์๋ฒ์ ์ ์ฅ๋๋ค. → Shared Cache
Private Cache: ์น ๋ธ๋ผ์ฐ์ ์ ์์น
์น ๋ธ๋ผ์ฐ์ ์บ์: ํด๋น ์น ๋ธ๋ผ์ฐ์ (ํน์ ํ๋ช )๋ง์ ์ํด ์บ์์ฌ์ฉ
- ๋ธ๋ผ์ฐ์ ์บ์: ์น ์๋ฒ๊ฐ HTTP Cache ํค๋(Cache-control)๋ฅผ ํตํ ์ ์ด(์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅํด๋ผ)
Shared: ์น ๋ธ๋ผ์ฐ์ ์ (์๋ณธ) ์น ์๋ฒ์ฌ์ด ํ๋ก์์ ์์น
ํ๋ก์ ์บ์: ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ (๋ชจ๋ ์ ์ )๋ฅผ ์ํด ์บ์๊ฐ ์ฌ์ฉ
- ํ๋ก์์บ์: ์น ์๋ฒ HTTP Cache(Cache-control)๋ฅผ ํตํ ์ ์ด
- ๊ด๋ฆฌํ์บ์: ์ฌ์ฉ์(๊ฐ๋ฐ์)๊ฐ ์ง์ ์ ์ด, ๋ฐฐํฌ, ์บ์ฑํ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ๋ก๋๋ก ๊ด๋ฆฌ
Cache-Control ํค๋๋ฅผ ํตํ ์ธ๋ถ ์ค์
์น ์๋ฒ๋ 'Cache-Control' ์ด๋ผ๋ HTTP ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ์บ์ ๋์์ ์ ์ดํ ์ ์๋ค.
์บ์ํ ๋ฐ์ดํฐ๋ ์น ์๋ฒ๊ฐ ๋ฐํํ๋ ๊ฐ์ด๊ณ , ๋ฐํ ๊ฐ์ ๋ํ ์์ ์ฃผ๋ ์น ์๋ฒ์ด๊ธฐ์ ์น ์๋ฒ๊ฐ ์บ์๋ฅผ ๋ชจ๋ ์ ์ดํ๋ค.
- ์บ์ ์ ์ฅ ์ฌ๋ถ
no-store: ๋ฆฌ์์ค์ ์บ์๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ์ฆ ์บ์๋ฅผ ์ํ๋ค.
no-cache: ๋ฆฌ์์ค์ ์บ์๋ฅผ ์ ์ฅํ๋, ๋งค๋ฒ ์๋ฒ์์ ์ฌ๊ฒ์ฆ์ํ๋ค → ์บ์๋ฅผ ์ํ๋ ๊ฒ์ด ์๋๋ค(ํท๊ฐ๋ฆด ์ ์์)
- ์ฌ๊ฒ์ฆ ์ฅ์
Public: Private(์น ๋ธ๋ผ์ฐ์ ) + Shared(ํ๋ก์) ๋ชจ๋์ ์ ์ฅ (๋ธ๋ผ์ฐ์ ์๋ ์ ์ฅํ๋ค๋ ๊ฒ ๊ธฐ์ต)
Private: Private(์น ๋ธ๋ผ์ฐ์ )์๋ง ์ ์ฅ
- ์บ์ ์ฌ๊ฒ์ฆ ์ฃผ๊ธฐ
max-age: ๋ฆฌ์์ค์ ์ ํจ์๊ฐ(Expires) ์ค์ (๊ธฐ์กด Expires๊ฐ ์๋ค๋ฉด ๋ฎ์ด์)
EX) max-age=0 → no-cache = ๋งค๋ฒ ์ฌ๊ฒ์ฆ
s-maxage: ๊ณต์ ์บ์(ํ๋ก์ ์๋ฒ)์๋ง ์ ์ฉ๋๋ ์ ํจ๊ธฐ๊ฐ
EX) s-maxage=31536000(1๋ ), max-age=0
// ์น ๋ธ๋ผ์ฐ์ ๋ ๊ณ์ CDN ์๊ฒ ์ฌ๊ฒ์ฆ์ ์ํ, CDN ์ 1๋ ์ ์ฃผ๊ธฐ๋ก ๋ณธ ์น ์๋ฒ์๊ฒ ์ฌ๊ฒ์ฆ
// ์น ๋ธ๋ผ์ฐ์ ๋ CDN ์ด ์์ฒด์ ์ผ๋ก Invalidation(๋ฌดํจํ)ํ์ง ์๋ํ 1๋ ๋์ ๊ฐ์ ๋ฐ์ดํฐ๋ง
max-age → WB์๋ง ์ ์ฉ
s-maxsage → Proxy์๋ง ์ ์ฉ
1๋ ์ด ๋์ผ๋ฉด Proxy๋ WS์๊ฒ revalidate→ WB๋ Proxy์๊ฒ revalidate
+@ ๋ฐฐํฌํ๋๋ฐ ์๋ฒ์ ์ด ์๋ณด์ธ๋ค → Invalidate
- ์ฌ๊ฒ์ฆ ๊ฐ์ : "์ฌ๊ฒ์ฆ์ด ๊ผญ ์๋ฒ๋ก๋ถํฐ ์ด๋ค์ง ๋ฐ์ดํฐ๋ง ๋ณด๊ฒ ์ต๋๋ค"
must-revalidate: ๊ผญ ์น์๋ฒ์ ์ง์ ์ฌ๊ฒ์ฆ์ด ์๋ฃ๋ ๋ค ์บ์๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ ์๋ฏธ
// ์๋ฒ์์ ์ ์ ๋ฌธ์ ๋ก ์ฌ๊ฒ์ฆ์ด ์คํจํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ํ๋์ ๊ทธ๋ฅ ๊ธฐ์กด ์บ์๋์ด์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ
// ํ์ง๋ง must-revalidate๊ฐ ํ์ฑํ ๋์ด์๋ค๋ฉด 504 Error - ์น์๋ฒ์ ์ฐ๋ฝ๋์
- SWR(stale-while-revalidate):"์บ์์ ์ฆ์์ฑ๊ณผ ์ต์ ์ฑ์ ํ๋ฒ์"
// ์บ์๋ ๋ฐ์ดํฐ๋ ์ฆ์ ์ฌ์ฉํ๊ณ , ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์บ์๋ฅผ ๊ฐฑ์
// ํ์ฌ์ ์บ์ฑ๋ ์ฝํ ์ธ ๋ฅผ ์ฆ์ ๋ก๋ํ๋ ์ฆ์์ฑ
// ๋ฏธ๋์ ์ ๋ฐ์ดํธ๊ฐ ๋ ์บ์ฑ ์ปจํ ์ธ ๊ฐ ์ฌ์ฉ ๋ ์ ์๋๋ก ๋ณด์ฅํ๋ ์ต์ ์ฑ
Cache-Control: max-age=1, stale-while-revalidate=60
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > HTTP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก์(Proxy) (0) | 2024.08.20 |
---|---|
HTTP Cache ๋์์๋ฆฌ + Hash (0) | 2024.08.20 |
๋ก๋๋ฐธ๋ฐ์ฑ ๊ฐ๋ ๋ฐ ๋ฐฐํฌ ๋ฐฉ์ (0) | 2024.08.19 |
๋ฐฑ์๋ ์น ๊ฐ๋ฐ: API = ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ๋ ๋ฐ์ดํฐ ๋ฐํ (0) | 2024.08.19 |
ํ๋ก ํธ ์น ๊ฐ๋ฐ์ ํ์ ๊ฐ๋ : ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ถํฐ SSR๊น์ง (0) | 2024.08.19 |