π μΉ λΈλΌμ°μ μ Cache μ λ΅ & ν€λ λ€λ£¨κΈ°
μΉλΈλΌμ°μ μ μΊμ(Cache) μ리
μ»΄ν¨ν° μ΄μ체μ μμμ μΊμ(Cache)λ μ£ΌκΈ°μ΅μ₯μΉμμ μμ£Ό μ¬μ©νλ νλ‘κ·Έλ¨κ³Ό λ°μ΄ν°λ₯Ό νλλμ€ν¬λ‘λΆν° κ°μ Έμ€λλ° μκ°μ΄ λ§μ΄ 걸리λ μΊμ μ μ₯μμ μμλ‘ μ μ¬ν΄λκ³ λΉ λ₯΄κ² μ κ·ΌνκΈ° μν κΈ°μ μ΄λ€.
μΊμλ λΉλ¨ μ»΄ν¨ν° OSμλ§ κ΅νλ κΈ°μ μ΄ μλλ€. μμ μ μ₯μμ μ μ¬ν΄λκ³ λΉ λ₯΄κ² μμΈμ€ν¨μΌλ‘μ¨ μ²λ¦¬ μ±λ₯μ λμΈλ€λ κ°λ μ체λ μ΄λμλ μ μ©μ΄ κ°λ₯νλ€. μ΄λ μΈν°λ·(Internet)μμλ μ μ©λλ€.
μΉλΈλΌμ°μ λ μλ²μ HTTP νλ‘ν μ½μ ν΅ν΄ 리μμ€λ₯Ό μλ²μκ² μμ²μ νμ¬ κ°μ Έμ€κ³ μ΄λ₯Ό μ¬μ©μμκ² λ¦¬μμ€λ₯Ό νλ©΄μΌλ‘ 보μ¬μ£Όκ±°λ μ 곡νλ€. μ΄λ¬ν ν΅μ κ³Όμ μ κ±°μΉλ©΄μ ν΄λΌμ΄μΈνΈλ λ€νΈμν¬λ₯Ό κ±°μΉλ μκ°μ΄ μλΉλλ©°, μλ²λ μμ²μ μ²λ¦¬νλλ° μκ°μ΄ μλΉλλ€.
λ§μ½ ν΄λΌμ΄μΈνΈκ° μ΄μ μ λ°μ λ°μ΄ν°μ λκ°μ λ°μ΄ν°λ₯Ό μλ²μ μ¬μμ²μ ν λ λκ°μ ν΅μ κ³Όμ μ κ±°μΉκ² λλ€λ©΄ μ΄ κ³Όμ μ λλΉλΌκ³ ν μ μλ€. λ°λΌμ μ΄λ¬ν λλΉλ₯Ό μ€μ΄κΈ° μν ν΄κ²°μ±
μΌλ‘ μΊμμ κ°λ
μ μΉλΈλΌμ°μ μ κ·Έλλ‘ μ μ©ν, HTTPμμ μ 곡νλ ν€λ(Headers)μΈ Cache-Control μ΄λ€.
λΈλΌμ°μ λ μ΄ Cache-Control ν€λλ₯Ό μ μ νκ² μ¬μ©ν¨μΌλ‘μ¨, μν©μ λ°λΌ μλ²μ λΆνλ₯Ό μ€μΌμμμΌλ©° ν΄λΌμ΄μΈνΈλ λ€νΈμν¬ ν΅μ κΈ°κ°μ΄λ νΈλν½ λμ μ€μΌ μ μκ² λμλ€. νμ§λ§ μΊμ(Cache)λ λ€λ£¨κΈ° κΉλ€λ‘μ΄ λ
μμ΄λ€. μλͺ» μΊμ±νκ² λλ©΄ λΆμΌμΉν 리μμ€λ₯Ό λ°κ² λκ±°λ μλΉμ€ μλμλ λ€λ₯Έ λμμ ν μ μκ² λλ€. λ°λΌμ μΊμλ₯Ό λ€λ£¨λ κΈ°μ μ μΉκ°λ°μλΌλ©΄ λ°λμ μμ§ν΄μΌ ν κΈ°μ μΌ κ²μ΄λ€.
HTTP μΊμ μ μ΄
μΊμ μ μ΄ ν€λ μ’ λ₯
Cache-Control ν€λ
- μΊμμ μ ν¨ μκ°(μλͺ μ£ΌκΈ°)μ λͺ μνλ μλ΅(Resonse) ν€λ
- ν€λ κ° νλΌλ―Έν° μ’
λ₯
max-age: μΊμ μ ν¨ μκ°, μ΄ λ¨μno-cache: λ°μ΄ν°λ μΊμν΄λ λμ§λ§, νμ Origin Server μ κ²μ¦ν μ¬μ©no-store: λ°μ΄ν°μ λ―Όκ°ν μ λ³΄κ° ν¬ν¨λμ΄ μμ΄ μ μ₯ λΆκ° νΉμ μ΅λν 빨리 μμ public: public μΊμ(νλ‘μ μΊμ μλ²)μ μ μ₯ κ°λ₯private: public μΊμμ μ μ₯ λΆκ°s-maxage: νλ‘μ μΊμ μλ²μ μ μ©λλ max-ageAge: Origin Server μ μλ΅μ΄ νλ‘μ μΊμ μλ²μ λ¨Έλ¬Έ μκ°(sec)must-revalidate: μΊμ λ§λ£ν μ΅μ΄ μ‘°νμ Origin Server μ κ²μ¦
- μ½€λ§λ‘ μ¬λ¬ νλΌλ―Έν°λ₯Ό μ΄κ±° κ°λ₯
Cache-Control κ° μμ | μ€λͺ |
μλ΅μ μ΅λ 1μΌ(60μ΄ x 60λΆ x 24μκ°) λμ λΈλΌμ°μ λ° μ€κ° μΊμκ° μΊμ±ν μ μλ€. | |
μλ΅μ μ΅λ 10λΆ(60μ΄ x 10λΆ) λμ (μ€κ° μΊμκ° μλ) λΈλΌμ°μ κ° μΊμ±ν μ μλ€. | |
μλ΅μ 1λ λμ λͺ¨λ μΊμκ° μ μ₯ν μ μλ€. |
Pragma ν€λ
- HTTP/1.0 νμ νΈνμ μν΄ μ¬μ©νλ μΊμ μ μ΄ ν€λ
- Cache-Control κ³Ό λμΌν μν μ μννμ§λ§ κΆμ₯λμ§ μλλ€.
Expires ν€λ
- μΊμμ λ§λ£μΌμ λͺ
μνλ ν€λλ‘, μ νν λ μ§λ₯Ό μ§μ νμ¬μΌ νλ€.
Cache-Control ν€λμλ max-ageλ‘ μ ν¨ μκ°μ λͺ μνλ κ²μ΄ λ μΆμ²λκΈ° λλ¬Έμ, νμ¬λ μ¬μ©μ΄ κΆμ₯ λμ§ μκ³ νμ νΈνμ μν΄ μ¬μ©λλ€. - λ§μΌ max-ageμ λμμ μ¬μ©λλ©΄ Expiresλ 무μλλ€.
μΉλΈλΌμ°μ μ μΊμ κΈ°λ³Έ λμ
μΊμκ° μμ κ²½μ° β
λ§μΌ μΊμκ° μμ κ²½μ° λκ°μ μ΄λ―Έμ§λ₯Ό μμ²νλ€λ©΄, μλ²μμλ λμΌν μ΄λ―Έμ§λ₯Ό λ§€λ² 1.1M μ©λμ λ°μ΄ν°λ‘ μλ΅ν΄μΌ νλ€. μ©λμ΄ μμ 리μμ€μΌ κ²½μ° ν° λ¬Έμ κ° λμ§λ μκ² μ§λ§ μ©λμ΄ ν¬λ©΄ ν΄ μλ‘ ν΅μ λΉμ©μ΄ 컀μ§κ² λκ³ λ‘λ©μλκ° λλ €μ§κ² λλ€.
- ν΄λΌμ΄μΈνΈμμ star.jpg μ΄λ―Έμ§λ₯Ό μμ²νλ€.
- μλ²μμλ ν΄λΉ μ΄λ―Έμ§κ° μμΌλ©΄ μλ΅μ μ€μΌνλλ°, μ΄λ―Έμ§μ HTTP ν€λ+λ°λλ₯Ό ν©μ³ λλ΅ 1.1Mμ λ μ©λμ λ°μ΄ν°λ₯Ό μλ΅νλ€.
- ν΄λΌμ΄μΈνΈμμλ ν΄λΉ μ΄λ―Έμ§λ₯Ό μλ΅ λ°μ μ¬μ©νλ€.
- ν΄λΌμ΄μΈνΈμμλ star.jpg μ΄λ―Έμ§λ₯Ό λ€μ ν λ² μμ²νλ€.
- μλ²μμλ λμΌν μ΄λ―Έμ§λ₯Ό λ€μ 1.1Mμ λ μ©λμ λ°μ΄ν°λ₯Ό μλ΅ν΄μ€λ€.
- ν΄λΌμ΄μΈνΈμμλ ν΄λΉ μ΄λ―Έμ§λ₯Ό μλ΅ λ°μ μ¬μ©νλ€.
- λμΌν μ΄λ―Έμ§λ₯Ό μμ²νλλ° λ€νΈμν¬λ₯Ό ν΅ν΄ κ°μ λ°μ΄ν°λ₯Ό λ λ€μ΄λ°μμΌ νλ€.
μΊμλ₯Ό μ΄μ©ν μμ² β
κ·Έλ¬λ©΄ μΉλΈλΌμ°μ μ μΊμλ₯Ό μ μ©νλ©΄ μΌλ§λ μ΄μ μ΄ μλμ§ μμ보μ.
1. ν΄λΌμ΄μΈνΈμμ star.jpg μ΄λ―Έμ§λ₯Ό μμ²νλ€.
2. μλ²μμλ ν΄λΉ μ΄λ―Έμ§λ₯Ό μλ΅ν΄μ€λ€. μ΄λ HTTP λ©μΈμ§μ cache-control ν€λλ₯Ό λ£μ΄μ£Όμ΄ μΊμκ° μ ν¨ν μκ°μ μ€μ νλ€. (κ·Έλ¦Όμμλ 60μ΄λ‘ μ€μ ν΄ 60μ΄ λμμ ν΄λΉ μΊμκ° μ ν¨νλ€λ μλ―Έλ€)
3. μλ²λ‘λΆν° μλ΅μ λ°κ²λλ©΄, ν΄λΌμ΄μΈνΈμμλ cache-control ν€λλ₯Ό μ΄ν΄νκ³ μΉλΈλΌμ°μ μΊμμ μλ΅ κ²°κ³Όλ₯Ό 60μ΄ λμ μ μ₯νκ² λλ€.
4. ν΄λΌμ΄μΈνΈκ° star.jpg μ΄λ―Έμ§λ₯Ό μ¬μ°¨ μμ²νλ€. μ΄λ μλ²μκ² κ°λ κ²μ΄ μλ μ°μ μΊμ μ μ₯μλ₯Ό μ‘°ννκ² λλ€.
5. λ§μΌ μΊμ λμ΄μκ³ 60μ΄ μ΄λ΄μ μμ²ν μνλΌλ©΄, μΊμμμ μλ£λ₯Ό κ°μ Έμ€κ² λλ€.
κ·Έλ¦ΌμΌλ‘ 보λ―μ΄ μΊμλ₯Ό μ¬μ©νκ² λλ©΄, ν λ² μλ΅λ°μλ λ°μ΄ν°λ λΈλΌμ°μ μ μΊμ μ μ₯μμ λ¨μ μΌμ μκ° λ΄μ κ³μν΄μ μ°Έμ‘°ν μ μκΈ° λλ¬Έμ, μλ²λ‘λΆν° λΆνμν λ€νΈμν¬ λ€μ΄λ‘λλ₯Ό ν¨κ³Όμ μΌλ‘ μ€μΌ μ μλ€. μ¬μ©μλ λΉ λ₯Έ μλΉμ€ κ²½νμ μ΄μ©ν μ μκ² λλ©΄, μλ²λ λ€νΈμν¬ μ¬μ©λμ μ€μ¬ λΉμ©μ μλμ μκ² λλ€.
μΊμ μ ν¨ μκ°μ΄ μ§λ κ²½μ° π©
κ·Έλ°λ° λ§μΌ 60μ΄ κ° μ§λ μΊμ μ ν¨ κΈ°κ°μ΄ λ§λ£λ νμ ν΄λΌμ΄μΈνΈκ° κ·Έ μλ£λ₯Ό μμ²ν κ²½μ° μ΄λ»κ² λ κΉ?
6. ν΄λΌμ΄μΈνΈκ° star.jpg μ΄λ―Έμ§λ₯Ό μ¬μ°¨ μμ²νλ€. κ·Έλ°λ° μΊμ 60μ΄ μ ν¨μκ°μ΄ μ΄κ³Όλμ΄ λ²λ € λμ΄μ κ°μ Έμ¬μ μκ² λμλ€.
7. κ·Έλ¬λ©΄ ν΄λΌμ΄μΈνΈλ λ€μ μλ²μκ² μ²μκ³Ό κ°μ΄ μμ²νκ² λλ€. (λ€μ λ€νΈμν¬ λ€μ΄λ‘λκ° λ°μ)
8. μλ²λ λκ°μ΄ cache-control ν€λλ₯Ό μλ΅νκ² λκ³ , λΈλΌμ°μ λ λ€μ μλ£λ₯Ό μΊμμ μ μ₯νκ² λλ€.
μ΄μ²λΌ 6λ² μν©μ 보λ―μ΄ μΊμ μ ν¨κΈ°κ°μ΄ μ§λ κ²½μ° μ²μκ³Ό κ°μ΄ μ© μμ²μ 보λ΄μΌνλ€.
κ·Έλ¬λ©΄ μΊμ μ ν¨ κΈ°κ°μ κΈΈκ² λ리면 λμ§ μλ μΆμλ° μ΄λ μ’μ§ μμ λ°©λ²μ΄λ€. μλνλ©΄ μ€λ κΈ°κ° λ³κ²½λμ§ μμλ λλ λ°μ΄ν°κ° μλ λ°λ©΄, 짧μ λ³κ²½ μ£ΌκΈ°λ₯Ό κ°μ§λ λ°μ΄ν°λ μκΈ° λλ¬Έμ΄λ€. μ¦, λ§λ£κΈ°κ°μ΄ κΈ΄ κ²½μ° μΊμ λ°μ΄ν°κ° μ€λλ λ°μ΄ν°μΌ κ°λ₯μ±μ΄ λμμ§κ² λλ€.
λ°λΌμ λΉλ‘ μΊμ μ ν¨ μκ°μ΄ μ§λ¬λλΌλ μ€λ κΈ°κ° λ³κ²½λμ§ μμλ λλ λ°μ΄ν°μΌ κ²½μ° μ²μλΆν° μμ²μ νλ 건 λλΉλ₯Ό μ΄λνλ μμ²μ΄ λλ€λ μ리μ΄λ€. κ·Έλμ λμ± λ ν¨μ¨μ μΈ μΊμ μ λ΅μ μν΄ μΉ λΈλΌμ°μ μλ λ³λμ μΊμ κ²μ¦ λ‘μ§μ μννκ² λλ€.
μ¬μ€ ‘μΊμλ₯Ό μΌλ§λ μ€λ μ μ§ν΄μΌ νλκ°?‘μ λ¬Έμ λ λ΅μ΄ μλ€. κ΅³μ΄ λ§νμλ©΄ λ°μ΄ν°μ μ±κ²©κ³Ό μν©μ λ°λΌ μλ§κ² μ€μ ν΄μΌ νλ€.
HTTP μΊμ κ²μ¦ & μ‘°κ±΄λΆ μμ²
μΊμ κ²μ¦ ν€λ μ’ λ₯
μλ²κ° ν΄λΌμ΄μΈνΈμκ² μλ΅(Response) ν λ HTTP λ©μΈμ§ ν€λμ λ£λ μΊμ κ΄λ ¨ ν€λ μ 보λ€μ΄λ€.
Last-Modified ν€λ
- λ°μ΄ν°μ μ΅μ’ μμ μκ°μ λͺ μνλ€. (μλμ° νμΌμ 보면 μ΅μ’ μμ μκ° κ°μ κ°λ μ΄λ€)
If-Modified-Sinceμμ²(Request) ν€λμ ν¨κ» μ¬μ©λλ€- ν΄λΌμ΄μΈνΈκ° μΊμ μ ν¨ κΈ°κ°μ΄ μ΄κ³Όλ λ°μ΄ν°λ₯Ό μλ²μ μμ²νλ κ²½μ°, μ΄λ₯Ό κΈ°μ€μΌλ‘ λ°μ΄ν°κ° μμ λμλμ§ κ²μ¦νλ€. μλ₯Όλ€μ΄ μλ²μ λ°μ΄ν° μ΅μ’ μμ μκ°μ΄ Last-Modified λ³΄λ€ μ΄νλΌλ©΄, λ°μ΄ν°κ° μμ λ κ²μΌλ‘ κ°μ£Όνκ³ , μλ²μ λ°μ΄ν° μ΅μ’ μμ μκ°μ΄ Last-Modified μ κ°λ€λ©΄ λ°μ΄ν°κ° μμ λμ§ μμ κ²μΌλ‘ κ°μ£Όνλ€.
- ex) last-modified: Tue, 15 Mar 2022 06:48:06 GMT . . .
ETag ν€λ
- νΉμ λ²μ μ 리μμ€λ₯Ό μλ³νλ κ³ μ μλ³μ (λ°μ΄ν°μ λ²μ μ΄λ¦ νΉμ ν΄μκ°)
- μλ²λ νμΌμ΄ λ³κ²½λ λλ§λ€ μ ETag κ°μ μμ±νκ³ μ΄μ ETag κ°μ μ μ§νλ€.
If-None-Matchμμ²(Request) ν€λμ ν¨κ» μ¬μ©λλ€Last-Modifiedν€λμ νκ³λ₯Ό 극볡νκΈ° μν 리μμ€ κ²μ¦ ν€λ- ex) ETag: "a2jiodwjekjl3" , ETag: "v1.0" . . .
μ‘°κ±΄λΆ μμ² ν€λ μ’ λ₯
ν΄λΌμ΄μΈνΈκ° μλ²μ μμ²(Request) ν λ HTTP λ©μΈμ§ ν€λμ λ£λ μΊμ κ΄λ ¨ ν€λ μ 보λ€μ΄λ€.
If-Modified-Since ν€λ
- ν΄λΌμ΄μΈνΈμ μμ²(Request) μ μ¬μ©λλ©°, μΊμ λ°μ΄ν°μ
Last-Modifiedκ°μ΄ λ€μ΄κ°λ€. - μλ²μ λ°μ΄ν° μ΅μ’
μμ μκ°κ³Ό μΊμ λ°μ΄ν°μ μ΅μ’
μμ μκ°μ λΉκ΅νμ¬ λ°μ΄ν° μμ μ¬λΆλ₯Ό νμΈνκΈ° μν΄ μ¬μ©νλ€.
- μΊμμ μλ 리μμ€ μμ μκ°κ³Ό μλ²μ μλ 리μμ€ μμ μμμ΄ κ°μΌλ©΄, 304 Not Modified μλ΅ → μΊμ μ¬μ¬μ©
- μΊμμ μλ 리μμ€ μμ μκ°κ³Ό μλ²μ μλ 리μμ€ μμ μμμ΄ λ€λ₯΄λ©΄, 200 OK μλ΅ → μλ‘ λ°μ΄ν° μ μ‘ (λ€νΈμν¬ λ€μ΄λ‘λ)
If-None-Match ν€λ
- ν΄λΌμ΄μΈνΈμ μμ²(Request) μ μ¬μ©λλ©°, μΊμ λ°μ΄ν°μ
ETagκ°μ΄ λ€μ΄κ°λ€. - μλ²μ λ°μ΄ν°
ETagμ μΊμ λ°μ΄ν°μETagλ₯Ό λΉκ΅νμ¬ λ°μ΄ν° μμ μ¬λΆλ₯Ό νμΈνκΈ° μν΄ μ¬μ©νλ€.- μΊμμ μλ
ETagμ μλ²μ μλETagκ° κ°μΌλ©΄, 304 Not Modified μλ΅ → μΊμ μ¬μ¬μ© - μΊμμ μλ
ETagμ μλ²μ μλETagκ° λ€λ₯΄λ©΄, 200 OK μλ΅ → μλ‘ λ°μ΄ν° μ μ‘ (λ€νΈμν¬ λ€μ΄λ‘λ)
- μΊμμ μλ
If-Unmodified-Since / If-Match ν€λ
- κ°κ°
μIf-None-MatchIf-Modified-Sinceλ°λ μν μνμ νλ€λ 보면 λλ€. - μ΄ ν€λλ€μ 412 Precondition failed μν μ½λλ₯Ό λ°ννλλ° μ¬μ©λλ€.
μΉλΈλΌμ°μ μ μ‘°κ±΄λΆ μμ² & κ²μ¦ λμ
μΊμ λ§λ£νμλ μλ²μμ ν΄λΉ 리μμ€λ₯Ό μμ νκ±°λ μ λ°μ΄νΈνμ§ μμ κ²½μ°λΌλ©΄, μλ²μμ λμΌν λ°μ΄ν°λ₯Ό μμ²ν΄μ μλ΅λ°λ κ²μ μ¬λ¬λͺ¨λ‘ λΉμ©λλΉκ° λκ² λλ€. μ΄λ΄λλ λ°μμ μ νμΌλ‘ μ μ¬ν΄ λ μΊμλ₯Ό μ¬μ¬μ© ν μ μμΌλ©΄ μ’μλ°, μ΄λ¬ν μ λ΅μ μ΄μ©νκΈ° μν΄μ μ΄λ»κ² ν΄λΌμ΄μΈνΈμ λ°μ΄ν°μ μλ²μ λ°μ΄ν°κ° λμΌνλ€λ κ²μ μ μμλμ§μ λν΄ μμμΌ νλ€. κ·Έλμ HTTPμμλ μΆκ°μ μΈ κ²μ¦ ν€λλ₯Ό μ΄μ©νμ¬ μ²λ¦¬νλ€.
λ¬Έμ μμ μκ° λ°©μ (Last-Modified & if-modified-since)
κ°μ₯ μ¬νν λ°©λ²μ 리μμ€ μμ μκ°μ μ΄μ©ν΄μ 리μμ€ λ³κ²½ μ¬νμ νμΈνλ κ²μ΄λ€.
μλ₯Όλ€μ΄ μΊμμ μ μ₯λ 리μμ€μ μμ μκ°κ³Ό μλ²μ μ μ₯λ 리μμ€μ μμ μκ°μ΄ κ°μΌλ©΄ λ³κ²½ μ¬νμ΄ μκΈ° λλ¬Έμ μΊμμ μλ κ²μ μ¬νμ©νλ©΄ λκ³ , μμ μκ°μ΄ λ€λ₯΄λ©΄ μ΅μ 리μμ€λ₯Ό κ°±μ ν΄μΌ νκΈ° λλ¬Έμ μλ‘ μλ²μμ 보λ΄μ£Όλ κ²μ΄λ€.
1. ν΄λΌμ΄μΈνΈμμ star.jpg μ΄λ―Έμ§λ₯Ό μμ²νλ€.
2. μλ²λ cache-control ν€λλ₯Ό μ΄μ©νμ¬ μΊμ μ ν¨ κΈ°κ°μ 60μ΄λ‘ μ€μ νκ³ μΆκ°μ μΌλ‘ Last-Modified ν€λλ₯Ό ν΅ν΄ 리μμ€μ λ§μ§λ§μΌλ‘ μμ λ μκ° μ 보λ₯Ό λ£μ΄ μλ΅ν΄μ¨λ€.
3. ν΄λΌμ΄μΈνΈλ μλ΅ κ²°κ³Όλ₯Ό μΊμμ μ μ₯ν λ λ°μ΄ν° μ΅μ’ μμ μΌλ μ μ₯νλ€.
4. 100μ΄κ° μ§λν μΊμ μ ν¨ μκ° μ΄κ³Όλ μνμμ, ν΄λΌμ΄μΈνΈμμ star.jpg μ΄λ―Έμ§λ₯Ό μ¬μ°¨ μμ²νλ€.
5. μ΄λ μΊμμ μ΅μ’
μμ μΌ μ 보(Last-Modified)κ° μλ€λ©΄, ν΄λΌμ΄μΈνΈλ μμ² λ©μΈμ§μ if-modified-since ν€λμ ν΄λΉ λ μ§λ₯Ό λ΄μμ μλ²μ 보λΈλ€.
6. μλ²μμ λ§μΌ ν΄λΌμ΄μΈνΈκ° μμ²ν ν€λμ μλ£ μ΅μ’ μμ μΌκ³Ό μλ²μ μλ μλ£μ μμ μΌμ λΉκ΅ν΄μ λ°μ΄ν°κ° μμ μ΄ μλμμ κ²½μ°, 304 Not Modified μν μ½λλ‘ μλ΅νκ² λλ€. (μ΄λ 리μμ€λ λ΄μ§ μλλ€. κ·Έλμ μ μ‘ λ°μ΄ν°κ° μκΈ° λλ¬Έμ 0.1M λ§ μ μ‘λλ€)
7. 304 μλ΅μ λ°μ ν΄λΌμ΄μΈνΈλ 리μμ€ μμ μ΄ μμ΄ μ΅μ μνμμ μΈμ§νκ² λκ³ , μμ νκ² μΊμμμ λ€μ 리μμ€λ₯Ό κ°μ Έμ€κ³ λ€μ μΊμ μ ν¨ κΈ°κ°μ κ°±μ ν΄μ€λ€.
μ 리νμλ©΄, λ³ΈλλΌλ©΄ 1.1M μλ΅ λ°μ΄ν°λ₯Ό λ°μμ€κ² λμ΄μμ§λ§, μ‘°κ±΄λΆ μμ²μ ν΅ν΄ λΉλ‘ μΊμ μ ν¨ κΈ°κ°μ΄ μ§λ¬λλΌλ 리μμ€κ° λ³κ²½μ΄ μλ€λ©΄ μΊμμμ μ¬νμ©ν΄λ λλ€λ μ·¨μ§λ‘, μλ²λ κ·Έλ₯ ν€λ λ©μΈμ§λ§ μλ΅νκ² λλ 1λ©κ°λ°μ΄νΈλ₯Ό μ μ½νκ² λ κ²μ΄λ€. κ²°κ³Όμ μΌλ‘ λ€νΈμν¬ λ€μ΄λ‘λκ° λ°μλμ§λ§ 0.1Mλ§ λ°κ² λλ μ¬μ©μλ λΉ λ₯΄κ² μλΉμ€λ₯Ό μ΄μ©ν μ μκ² λλ€.
μ€μ κ°λ°μ λꡬμμ λ€νΈμν¬ μλ΅μ 보면 λ νμ°ν μ΄ν΄κ° λ κ²μ΄λ€.
Cache-Control ν€λμ max-age κ°μ 5μ΄λ‘ μ§μ νκ³ κ³μ λμΌν μμ²μ ν κ²½μ°, μ΄κ° μ§λλ©΄ μΊμ μ ν¨ κΈ°κ°μ΄ λ§λ£λμ΄ λ€μ μλ²μ μμ²μ νκ² λμ§λ§ μλ³Έ μ©λ(994KB) λ³΄λ€ ν¨μ¬ λ μ μ 192Bλ₯Ό λ°λκ±Έ λ³Ό μ μλ€. μ¦, μ΄λ―Έμ§λ λ°μ§μκ³ HTTP λ©μΈμ§λ§ λ°κ³ μΊμ μ μ₯μμμ λ€μ κ°μ Έμ€λ λμμ 5μ΄λ§λ€ ννκ³ μλ κ²μ΄λ€.
Last-Modified & if-modified-since λ°©μμ νκ³μ
νμ§λ§ λ¨μν 리μμ€μ μμ μκ°μΌλ‘ μΊμ μ΄μ© μ λ΅μ μΈμ°λλ°λ λ€μκ³Ό κ°μ νκ³κ° μ‘΄μ¬νλ€.
- 1μ΄ λ―Έλ§(0.xμ΄)λ¨μλ‘ μΊμ μ‘°μ μ΄ λΆκ°λ₯νλ€.
- λ μ§ κΈ°λ°μ λ‘μ§μ μ¬μ©νμ¬ νκ³κ° μλ€. μλ₯Ό λ€μ΄ test.txt νμΌμ λ΄μ©μ A → Bλ‘ μμ νμ§λ§, λ€μ B → Aλ‘ λ‘€λ°±ν κ²½μ° λ΄μ©μ μΊμμ μλ κ²κ³Ό κ°μ§λ§ λ μ§ λ³κ²½μ΄ λμ λ€μ λ°μμΌ νλ€.
- μλ²μμ λ³λμ μΊμ λ‘μ§μ κ΄λ¦¬νκ³ μΆμ κ²½μ° νκ³κ° μλ€ (μ€νμ΄μ€λ μ£Όμμ²λΌ ν¬κ² μν₯μ΄ μλ λ³κ²½μμ μΊμλ₯Ό μ μ§νκ³ μΆμ κ²½μ°)
Etag λΉκ΅ λ°©μ (Etag & If-None-Match)
λ°λΌμ μλ²μμ μμ ν μΊμλ₯Ό 컨νΈλ‘€ νκ³ μΆλ€λ©΄ ETag λ₯Ό μ¬μ©νμ¬ μμμ ν΄μκ°μ νμ©ν΄ 컨ν
μΈ λ₯Ό μ’λ λ©΄λ°νκ² κ΄λ¦¬κ° κ°λ₯νλ€. λ§μΌ λ°μ΄ν°κ° λ³κ²½λλ©΄ ETag κ° λ³κ²½λκΈ° λλ¬Έμ, λ¨μν ETag κ° κ°μΌλ©΄ λ°μ΄ν°κ° μμ λμ§ μμ κ²μ΄κ³ , ETag κ° λ€λ₯΄λ©΄ λ°μ΄ν°κ° μμ λ κ²μΌλ‘ κ°μ£Όνκ² λλ€.
1. ν΄λΌμ΄μΈνΈμμ star.jpg μ΄λ―Έμ§λ₯Ό μμ²νλ€.
2. μλ²μμ ν€λμ ETag λ₯Ό μμ±ν΄μ μ΄λ―Έμ§μ ν¨κ» μλ΅ν΄μ€λ€.
3. ν΄λΌμ΄μΈνΈλ ETag κ°μ μΊμμ μ μ₯νλ€.
4. 100μ΄κ° μ§λν μΊμ μ ν¨ μκ° μ΄κ³Όλ μνμμ, ν΄λΌμ΄μΈνΈμμ star.jpg μ΄λ―Έμ§λ₯Ό μ¬μ°¨ μμ²νλ€.
5. μ΄λ μΊμμ Etag κ°μ΄ λ€μ΄μλ€λ©΄, ν΄λΌμ΄μΈνΈλ μμ² λ©μΈμ§μ if-None-Match ν€λμ ν΄λΉκ°μ λ΄μμ μλ²μ 보λΈλ€.
6. μλ²μμ λ°μ΄ν°κ° λ³κ²½λμ§ μμμ κ²½μ° ETagλ λμΌνλ€. κ·Έλμ If-None-Match λ‘μ§μ μ€ν¨κ° λμ΄ 304 Not Modifiedλ₯Ό μλ΅νλ€. (μ΄λ μμ 리μμ€λ λ΄κ²¨μμ§ μλλ€ → 0.1M μ μ‘)
7. 304 μλ΅μ λ°μ ν΄λΌμ΄μΈνΈλ 리μμ€ μμ μ΄ μμ΄ μ΅μ μνμμ μΈμ§νκ² λκ³ , μμ νκ² μΊμμμ λ€μ 리μμ€λ₯Ό κ°μ Έμ€κ³ λ€μ μΊμ μ ν¨ κΈ°κ°μ κ°±μ ν΄μ€λ€.
μ 리νμλ©΄, ETagλ§ μλ²μ λ³΄λ΄ λμΌνλ©΄ μ μ§νκ³ λ€λ₯΄λ©΄ λ€μ λ°λλ€. μ¦, μΊμ μ μ΄ λ‘μ§μ νμΌ μμ μκ° λΉκ΅κ° μλ μλ²μμ κ΄λ¦¬νλ κ²μ΄λ€. μλ₯Όλ€μ΄ μλ²λ λ² ν μ€ν κΈ°κ° 3μΌκ° νμΌμ΄ λ³κ²½λμ΄λ ETagλ₯Ό λμΌνκ² μ μ§ μ ν리μΌμ΄μ λ°°ν¬ μ£ΌκΈ°μ λ§μΆ°μ ETagλ₯Ό λͺ¨λ κ°±μ νλ μμΌλ‘ μ체 κ΄λ¦¬ν¨μΌλ‘μ¨, κ·Έλμ ν΄λΌμ΄μΈνΈλ λ¨μνκ² μ΄ κ°μ μλ²μ μ κ³΅λ§ νλ©΄ λκ³ , λ³λλ‘ μΊμ 맀컀λμ¦μ μ νμκ° μκ² λλ€.
νλ‘μ(Proxy) μΊμ
νλ‘μλ ν΄λΌμ΄μΈνΈμ λ³Έμλ²λ₯Ό μ€κ³νλ μ€κ°μ μμΉν μλ² λ리μλ‘μ, ν΄λΌμ΄μΈνΈμ μμ²μ λμ λ°κ³ λ³Έμλ²μ μ ν΄μ£Όλ μν μ νλ€. μ΄ νλ‘μλ₯Ό μΊμ μλ²λ‘μ μ΄μ©ν μ μλλ°, μλ₯Όλ€μ΄ νκ΅μ μλ ν΄λΌμ΄μΈνΈμμ μ΄λ―Έμ§κ° νμνμν©μΈλ°, ν΄λΉ μ΄λ―Έμ§μ μμλ²κ° λ―Έκ΅μ μλ€κ³ κ°μ ν΄λ³΄μ. νκ΅ μλ²μμ λ―Έκ΅ μλ²κΉμ§ μ§μ μ κ·Όνμ¬ μ΄λ―Έμ§λ₯Ό κ°μ Έμ€λλ° 0.5μ΄κ°λ κ±Έλ¦°λ€κ³ νλ©΄, νκ΅μ μμΉν μ»΄ν¨ν°λ€μ λͺ¨λ 0.5μ΄ κ°λμ κΈ°λ€λ €μΌ ν΄λΉ μ΄λ―Έμ§λ₯Ό λ°μ μ μκ² λλ€.
κ·Έλμ μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ νλ‘μ μΊμλ₯Ό λμ νμ¬ μ¬μ©νλ€κ³ 보면 λλ€.
νκ΅μ νλ‘μ μΊμ μλ²λ₯Ό λ°λ‘ λκ³ , μ΅μ΄μ μμ²μλ§ λ―Έκ΅ μλ²κΉμ§ κ°μ μ΄λ―Έμ§ 리μμ€λ₯Ό λ°μμ€κ³ νλ‘μ μΊμ μλ²μ μ μ₯νλ€. κ·Έλ¬λ©΄ νκ΅μ ν΄λΌμ΄μΈνΈλ 리μμ€λ₯Ό κ°μ Έμ¬λ νλ‘μ μΊμ μλ²λ‘ λΆν° μλ£λ₯Ό κ°μ Έμ€λ©΄ λλ€. νΉν μ¬λ¬ μ¬λλ€μ΄ μ°Ύλ μλ£μΌμλ‘ μ΄λ―Έ μΊμμ λ±λ‘λμ΄μκΈ°μ ν¨κ³Όμ μΌλ‘ λΉ λ₯Έ μλλ‘ μλ£λ₯Ό κ°μ Έμ¬ μ μλ€. μ°λ¦¬κ° μ νλΈμμ κ³ μ©λμ μμλ 빨리 λ³Ό μ μλ μ΄μ λ μ΄μ ν΄λΉνλ€.
μ¦, κ°μ κ΅λ΄μ μκΈ°μ μμλ²μ μ κ·Όνλκ²λ³΄λ€ ν¨μ¬ λΉ λ₯Έ μλμ μλ£λ₯Ό κ°μ Έμ¬ μ μλ€λ κ²μ΄λ€.
μ°Έκ³ λ‘ ν΄λΌμ΄μΈνΈμμ μ¬μ©λκ³ μ μ₯λλ μΊμλ₯Ό private μΊμλΌ νκ³ νλ‘μ μΊμ μλ²μ μΊμλ₯Ό public μΊμλΌ νλ€.
μΉλΈλΌμ°μ μΊμμ νλ‘μ μλ² μΊμκ° λΆλ¦¬λμ΄ μ΄μ©λλ λ§νΌ, μμμ λ°°μ΄ Cache-Control HTTP ν€λλ νλ‘μ μ μ© μΊμ μ€μ μ ν΄μΌ νλ€.
νλ‘μ μΊμ ν€λ
Cache-Control: private→ μλ΅μ΄ ν΄λΉ μ¬μ©μλ§μ μν κ²μΌλ‘ private μΊμμ μ μ₯ν΄μΌ νλ€ (default)Cache-Control: public→ μλ΅μ΄ public μΊμμ μ μ₯λμ΄λ λλ€.Cache-Control: s-maxage→ νλ‘μ μΊμμλ§ μ μ©λλ max-ageAge: 60(HTTP ν€λ) → μ€λ¦¬μ§ μλ²μμ μλ΅ νλ‘μ μΊμ λ΄μ λ¨Έλ¬Έ μκ°(μ΄)
HTTP μΊμ 무ν¨ν
μΊμ 무ν¨ν(Cache Busting)λ λ§κ·Έλλ‘ μΉλΈλΌμ°μ μ μΊμλ₯Ό μμ μ κ±°ν΄λ²λ¦¬λ κ²μ λ§νλ€.
μ΄λ¬ν κΈ°μ μ΄ νμν μ΄μ λ, μΉ λΈλΌμ°μ λ€μ΄ GET μμ²μ λ°μ κ²½μ° λ³λμ μΊμ ν€λ μμ΄λ μκΈ° λ§μλλ‘ μ΅μ ννλ΅μκ³ μμλ‘ μΊμ±μ ν΄λ²λ¦¬κΈ° λλ¬Έμ΄λ€. λν 무ν±λκ³ λ¦¬μμ€μ μΊμ μ ν¨ κΈ°κ°μ κΈΈκ² μ€μ νμ¬μ 리μμ€μ μ λ°μ΄νΈκ° νμν κ²½μ° μΊμ μ μ₯μμ 볡μ¬λ³Έμ κ°±μ ν΄μ£Όμ΄μΌ νλλ°, κΈ°λ³Έμ μΌλ‘ λΈλΌμ°μ λ μΊμ μ ν¨ κΈ°κ°μ΄ λλμΌ μΊμ μ ν¨μ± κ²μ¦μ μλ²μκ² μμ²νκΈ° λλ¬Έμ μ΄μ°ν λ°©λκ° μλ€. μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μνμ¬ μΊμ 무ν¨ν μ λ΅μ μ¬μ©νλ€κ³ 보면 λλ€.
μΊμ 무ν¨ν ν€λ
λ§μ½ μΊμλ₯Ό μ¬μ©ν΄μ μλλ νμ΄μ§κ° μ‘΄μ¬νλ€λ©΄, λ€μκ³Ό κ°μ΄ Cache-Control ν€λμ νλΌλ―Έν°λ€μ Setup νμ¬μΌ νλ€.
Cache-Control: no-cache- λ°μ΄ν°λ μΊμν΄λ λμ§λ§ νμ μ μλ²μ κ²μ¦νκ³ μ¬μ©ν΄μΌ νλ€. (
max-age=0κ³Ό λμΌν λ») - μ¦, μλ²λ‘λΆν° 304 μλ΅μ λ°μμΌ μΊμμμ κ°μ Έμ¨λ€λ λ§μ΄λ€. λΉλ‘ λ€νΈμν¬ νΈλν½μ΄ λ°μνμ§λ§ ν€λ λ©μΈμ§λ§ μλ΅ λ°κΈ° λλ¬Έμ λ€νΈμν¬ λ€μ΄λ‘λλμ μ λ€.
- no cache λΌλ μ΄λ¦λλ¬Έμ μΊμλ₯Ό μ¬μ©μνλ€κ³ μκ°ν μ μλλ°, μ΄ λ¨μ΄μ μλ―Έλ λ³Έλ μΊμ μ ν¨ κΈ°κ°μ΄ λ¨μμμΌλ©΄ 무쑰건 μΊμ μ μ₯μλ₯Ό μ‘°ννμ§λ§ 그리νμ§λ§κ³ 무쑰건 μλ²μ κ²μ¦ λ°μΌλΌλ λ§μ΄λ€.
- λ°μ΄ν°λ μΊμν΄λ λμ§λ§ νμ μ μλ²μ κ²μ¦νκ³ μ¬μ©ν΄μΌ νλ€. (
Cache-Control: no-store- λ°μ΄ν°μ λ―Όκ°ν μ λ³΄κ° μκΈ°μ μ μ₯νλ©΄ μλλ€λ μλ―Έ
- λ©λͺ¨λ¦¬μμ μ¬μ©νκ³ μ΅λν 빨리 μμ νλ€.
Cache-Control: must-revalidate- μΊμ λ§λ£ν μ΅μ΄ μ‘°νμ μ μλ²μ κ²μ¦ν΄μΌ ν λ μ€μ
- μ μλ²μ μ κ·Ό μ€ν¨μ λ°λμ 504(Gateway Timeout) μ€λ₯κ° λ°μν΄μΌ νλλ‘ νλ€.
- λ§μΌ μΊμ μ ν¨ μκ° λ΄μ μλ€λ©΄ μΊμλ₯Ό μ¬μ©νλ€.
Pragma: no-cache- HTTP 1.0 νμ νΈνμ©
κ°νΉ λͺλͺ μΉνμ΄μ§μμλ μΊμ 무ν¨ν μ°ν λ‘μ§μΌλ‘ Cache-Control ν€λμ max-age=0 μΌλ‘ μ€μ ν΄λλλ€. μΊμ μ ν¨ μκ°μ 0μΌλ‘ μ€μ ν΄ λμΌλ©΄, λ§€λ² λ¦¬μμ€λ₯Ό μμ²ν λλ§λ€ μλ²μ μ¬κ²μ¦ μμ²μ 보λ΄κ² λλ€.
νμ§λ§ λͺλͺ μΌλΆ λͺ¨λ°μΌ λΈλΌμ°μ μ κ²½μ° λ€νΈμν¬ μμ²μ μλΌκ³ μ¬μ©μμκ² λΉ λ₯Έ μΉ κ²½νμ μ 곡νκΈ° μν΄ μΉ λΈλΌμ°μ λ₯Ό κ»λ€ μΌκΈ° μ κΉμ§ 리μμ€κ° λ§λ£λμ§ μλλ‘ νλ κ²½μ°κ° μ‘΄μ¬νλ€. λ°λΌμ max-age=0 보λ€λ μ’λ λͺ νν no-store νλΌλ―Έν° μ¬μ©μ κΆνλ λ°λ€.
no-cache vs must-revalidate λΉκ΅
μΊμ 무ν¨ν ν€λλ₯Ό μ€μ ν λ λ³΄ν΅ no-cache μ must-revalidate λ₯Ό κ°μ΄ μ€μ νλ νΈμ΄λ€.
must-revalidate κ° μ¬μ©λλ μ΄μ λ no-cache μ μν΄ μ μλ²(Origin Server) μ κ²μ¦ μμ²μ 보λ΄λ λμ€ μ μλ² μ νλ‘μ μΊμ μλ²(Proxy Cache Server) μ μ°κ²°μ΄ λμ΄μ Έ κ²μ¦μ΄ λΆκ°λ₯ν κ²½μ°, 504 Gateway Timeout μ€λ₯λ₯Ό λ°μμν€κΈ° μν΄μμ΄λ€. μλνλ©΄ λͺλͺ νλ‘μ μΊμ μλ²μμλ μ μλ²μ μ κ·Όμ΄ λΆκ°λ₯ν΄μ§ κ²½μ°μ κ²μ¦μ κ±°μΉμ§ μκ³ μ΄μ μ μΊμ λ°μ΄ν°λ₯Ό λ°ννκΈ° λλ¬Έμ΄λ€.
μλ₯Όλ€μ΄ ν΅μ₯ μκ³ μ κ°μ μ€μ λ°μ΄ν°μ κ²½μ°, Origin Server μμ μ°κ²°μ΄ λΆκ°λ₯νλ€κ³ ν΄μ λ³κ²½ μ μ λ°μ΄ν°λ₯Ό λ°ννλ©΄ ν°μΌλλ―λ‘, must-revalidate λ₯Ό νμ©ν΄ μΌλΆλ‘ 5XX μ€λ₯λ₯Ό λ°μμν€λ μ λ΅μ μΈμ΄λ€κ³ 보면 λλ€.
no-cache κΈ°λ³Έ λμ
- ν΄λΌμ΄μΈνΈλ E-Tagμ no-cache μ€μ μ νκ³ μλ²μκ² μμ²νλ€.
- μ€κ°μ νλ‘μ μΊμ μλ²κ° λ°κ² λκ³ , no-cache μ€μ μ΄ λμ΄μκΈ° λλ¬Έμ λ€μ μ μλ²μ μμ²νλ€
- μ μλ²μμ E-Tagλ‘ κ²μ¦νκ³
- νλ‘μμκ² 304 μλ΅μ μ€λ€
- νλ‘μλ λ€μ ν΄λΌμ΄μΈνΈμκ² κ·Έλλ‘ μλ΅νλ€.
- ν΄λΌμ΄μΈνΈλ μΊμλ₯Ό μ¬μ¬μ©νλ€.
μ μλ²μ λ¬Έμ κ° μκΈΈ κ²½μ° no-cache λμ
- ν΄λΌμ΄μΈνΈλ E-Tagμ no-cache μ€μ μ νκ³ μλ²μκ² μμ²νλ€.
- μ€κ°μ νλ‘μ μΊμ μλ²μμ λ€μ μ μλ²μ μμ²νλλ°, μ΄λ ν μ΄μ λ‘ λ€νΈμν¬κ° λ¨μ λμ΄ μ κ·Όμ΄ μλλ€.
- κ·Έλ¬λ©΄ no-cacheμμλ μλ΅μΌλ‘ μ€λ₯κ° μλ μ€λλ λ°μ΄ν°λΌλ 보μ¬μ£ΌμλΌλ κ°λ μΌλ‘ 200 OKμΌλ‘ μλ΅μ νλ€.
- μ μλ²μ μ²λ¦¬ μνλ λͺ¨λ₯Έμ± ν΄λΌμ΄μΈνΈλ μ€λλ λ°μ΄ν°λ₯Ό μλΉμμκ² λ³΄μ¬μ£Όκ² λκ³ , μλΉμ€μ μ°¨μ§μ΄ μκΈ°κ² λλ€.
must-revalidate λμ
λ°λΌμ μμ κ°μ λ¬Έμ μ λλ¬Έμ must-revalidate λ₯Ό λͺ μνμ¬ Proxy Cache Server κ° μ체μ μΌλ‘ μΊμ λ°μ΄ν°λ₯Ό λ°ννλ μΌμ΄μ€λ₯Ό μ¬μ μ μ°¨λ¨νμ¬μΌ νλ€.
- ν΄λΌμ΄μΈνΈλ E-Tagμ must-revalidate μ€μ μ νκ³ μλ²μκ² μμ²νλ€.
- μ€κ°μ νλ‘μ μΊμ μλ²μμ λ€μ μ μλ²μ μμ²νλλ°, μ΄λ ν μ΄μ λ‘ λ€νΈμν¬κ° λ¨μ λμ΄ μ κ·Όμ΄ μλλ€.
- κ·Έλ¬λ©΄ must-revalidateμμλ μΌλ¨ 무쑰건 504 Gateway Timeout μ€λ₯λ₯Ό μλ΅νλ€.
- ν΄λΌμ΄μΈνΈλ μ μλ²μ λ¬Έμ κ° μμμ κ°μ§νκ³ λ³λμ μ¬μμ λ‘μ§μ κ±°μΉκ² νλ€.
λ€λ§, must-revalidateλ μΊμ μ ν¨μ± κΈ°κ°μ΄ λ¨μμμΌλ©΄ μ°μ μ μΌλ‘ μΊμ μ μ₯μλ₯Ό μ‘°ννκ² λμ΄μλ€. λ°λΌμ μ μλ² λ€νΈμν¬ λ¬Έμ ν΄κ²°κ³Ό νμ μ μλ²μ μΊμ κ²μ¦μ ν¨κ» μ¬μ©νκ³ μΆμ κ²½μ° no-cacheμ ν¨κ» μ€μ ν΄μ£Όλ©΄ λλ€.
# μ°Έκ³ μλ£
λͺ¨λ κ°λ°μλ₯Ό μν HTTP μΉ κΈ°λ³Έ μ§μ - κΉμν
http://www.ines-panker.com/2021/12/29/lets-talk-about-http-headers.html
https://www.section.io/engineering-education/understanding-browser-caching/
https://web.dev/http-cache/