개발 지식/HTTP 지식

🌐 μ›Ή λΈŒλΌμš°μ €μ˜ Cache μ „λž΅ & 헀더 닀루기

인파_ 2022. 12. 27. 09:04

http-cache-header

μ›ΉλΈŒλΌμš°μ €μ˜ μΊμ‹œ(Cache) 원리

컴퓨터 μš΄μ˜μ²΄μ œμ—μ„œμ˜ μΊμ‹œ(Cache)λŠ” μ£ΌκΈ°μ–΅μž₯μΉ˜μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨κ³Ό 데이터λ₯Ό ν•˜λ“œλ””μŠ€ν¬λ‘œλΆ€ν„° κ°€μ Έμ˜€λŠ”λ° μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λ‹ˆ μΊμ‹œ μ €μž₯μ†Œμ— μž„μ‹œλ‘œ μ μž¬ν•΄λ‘κ³  λΉ λ₯΄κ²Œ μ ‘κ·Όν•˜κΈ° μœ„ν•œ κΈ°μˆ μ΄λ‹€.

http-cache-header

μΊμ‹œλŠ” 비단 컴퓨터 OSμ—λ§Œ κ΅­ν•œλœ 기술이 μ•„λ‹ˆλ‹€. μž„μ‹œ μ €μž₯μ†Œμ— μ μž¬ν•΄λ†“κ³  λΉ λ₯΄κ²Œ μ—‘μ„ΈμŠ€ν•¨μœΌλ‘œμ¨ 처리 μ„±λŠ₯을 λ†’μΈλ‹€λŠ” κ°œλ… μžμ²΄λŠ” 어디에든 적용이 κ°€λŠ₯ν•˜λ‹€. μ΄λŠ” 인터넷(Internet)μ—μ„œλ„ μ μš©λœλ‹€.

 

μ›ΉλΈŒλΌμš°μ €λŠ” μ„œλ²„μ™€ HTTP ν”„λ‘œν† μ½œμ„ 톡해 λ¦¬μ†ŒμŠ€λ₯Ό μ„œλ²„μ—κ²Œ μš”μ²­μ„ ν•˜μ—¬ κ°€μ Έμ˜€κ³  이λ₯Ό μ‚¬μš©μžμ—κ²Œ λ¦¬μ†ŒμŠ€λ₯Ό ν™”λ©΄μœΌλ‘œ λ³΄μ—¬μ£Όκ±°λ‚˜ μ œκ³΅ν•œλ‹€. μ΄λŸ¬ν•œ 톡신 과정을 κ±°μΉ˜λ©΄μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ„€νŠΈμ›Œν¬λ₯Ό κ±°μΉ˜λŠ” μ‹œκ°„μ΄ μ†ŒλΉ„λ˜λ©°, μ„œλ²„λŠ” μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ”λ° μ‹œκ°„μ΄ μ†ŒλΉ„λœλ‹€.

λ§Œμ•½ ν΄λΌμ΄μ–ΈνŠΈκ°€ 이전에 받은 데이터와 λ˜‘κ°™μ€ 데이터λ₯Ό μ„œλ²„μ— μž¬μš”μ²­μ„ ν• λ•Œ λ˜‘κ°™μ€ 톡신 과정을 거치게 λœλ‹€λ©΄ 이 과정은 낭비라고 ν•  수 μžˆλ‹€. λ”°λΌμ„œ μ΄λŸ¬ν•œ λ‚­λΉ„λ₯Ό 쀄이기 μœ„ν•œ ν•΄κ²°μ±…μœΌλ‘œ μΊμ‹œμ˜ κ°œλ…μ„ μ›ΉλΈŒλΌμš°μ €μ— κ·ΈλŒ€λ‘œ μ μš©ν•œ, HTTPμ—μ„œ μ œκ³΅ν•˜λŠ” 헀더(Headers)인 Cache-Control 이닀.

http-cache-header

λΈŒλΌμš°μ €λŠ” 이 Cache-Control ν—€λ”λ₯Ό μ μ ˆν•˜κ²Œ μ‚¬μš©ν•¨μœΌλ‘œμ¨, 상황에 따라 μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό μ€„μΌμˆ˜μžˆμœΌλ©° ν΄λΌμ΄μ–ΈνŠΈλŠ” λ„€νŠΈμ›Œν¬ 톡신 κΈ°κ°„μ΄λ‚˜ νŠΈλž˜ν”½ λŸ‰μ„ 쀄일 수 있게 λ˜μ—ˆλ‹€. ν•˜μ§€λ§Œ μΊμ‹œ(Cache)λŠ” 닀루기 κΉŒλ‹€λ‘œμš΄ 녀석이닀. 잘λͺ» μΊμ‹±ν•˜κ²Œ 되면 λΆˆμΌμΉ˜ν•œ λ¦¬μ†ŒμŠ€λ₯Ό λ°›κ²Œ λ˜κ±°λ‚˜ μ„œλΉ„μŠ€ μ˜λ„μ™€λŠ” λ‹€λ₯Έ λ™μž‘μ„ ν•  수 있게 λœλ‹€. λ”°λΌμ„œ μΊμ‹œλ₯Ό λ‹€λ£¨λŠ” κΈ°μˆ μ„ μ›Ήκ°œλ°œμžλΌλ©΄ λ°˜λ“œμ‹œ μˆ™μ§€ν•΄μ•Ό ν•  기술일 것이닀.


HTTP μΊμ‹œ μ œμ–΄

 

μΊμ‹œ μ œμ–΄ 헀더 μ’…λ₯˜

 

Cache-Control 헀더

Cache-Control
Cache-Control

  • μΊμ‹œμ˜ 유효 μ‹œκ°„(생λͺ… μ£ΌκΈ°)을 λͺ…μ‹œν•˜λŠ” 응닡(Resonse) 헀더
  • 헀더 κ°’ νŒŒλΌλ―Έν„° μ’…λ₯˜
    • max-age : μΊμ‹œ μœ νš¨ μ‹œκ°„, 초 λ‹¨μœ„
    • no-cache : λ°μ΄ν„°λŠ” μΊμ‹œν•΄λ„ λ˜μ§€λ§Œ, ν•­μƒ Origin Server 에 검증후 μ‚¬μš©
    • no-store : 데이터에 λ―Όκ°ν•œ 정보가 ν¬ν•¨λ˜μ–΄ μžˆμ–΄ μ €μž₯ λΆˆκ°€ ν˜Ήμ€ μ΅œλŒ€ν•œ λΉ¨λ¦¬ μ‚­μ œ
    • public : public μΊμ‹œ(ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„)에 μ €μž₯ κ°€λŠ₯
    • private : public μΊμ‹œμ— μ €μž₯ λΆˆκ°€
    • s-maxage : ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„μ— μ μš©λ˜λŠ” max-age
    • Age : Origin Server 의 응닡이 ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„μ— λ¨Έλ¬Έ μ‹œκ°„(sec)
    • must-revalidate : μΊμ‹œ λ§Œλ£Œν›„ 졜초 μ‘°νšŒμ‹œ Origin Server 에 검증
  • 콀마둜 μ—¬λŸ¬ νŒŒλΌλ―Έν„°λ₯Ό μ—΄κ±° κ°€λŠ₯
Cache-Control κ°’ μ˜ˆμ‹œ μ„€λͺ…
max-age=86400 응닡은 μ΅œλŒ€ 1일(60초 x 60λΆ„ x 24μ‹œκ°„) λ™μ•ˆ λΈŒλΌμš°μ € 및 쀑간 μΊμ‹œκ°€ 캐싱할 수 μžˆλ‹€.
private, max-age=600 응닡은 μ΅œλŒ€ 10λΆ„(60초 x 10λΆ„) λ™μ•ˆ (쀑간 μΊμ‹œκ°€ μ•„λ‹Œ) λΈŒλΌμš°μ €κ°€ 캐싱할 수 μžˆλ‹€.
public, max-age=31536000 응닡은 1λ…„ λ™μ•ˆ λͺ¨λ“  μΊμ‹œκ°€ μ €μž₯ν•  수 μžˆλ‹€.

 

Pragma 헀더

Pragma

  • HTTP/1.0 ν•˜μœ„ ν˜Έν™˜μ„ μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μΊμ‹œ μ œμ–΄ 헀더
  • Cache-Control κ³Ό λ™μΌν•œ 역할을 μˆ˜ν–‰ν•˜μ§€λ§Œ ꢌμž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

 

Expires 헀더

Expires

  • μΊμ‹œμ˜ λ§Œλ£ŒμΌμ„ λͺ…μ‹œν•˜λŠ” ν—€λ”λ‘œ, μ •ν™•ν•œ λ‚ μ§œλ₯Ό μ§€μ •ν•˜μ—¬μ•Ό ν•œλ‹€.
    Cache-Control 헀더에도 max-age둜 유효 μ‹œκ°„μ„ λͺ…μ‹œν•˜λŠ” 것이 더 μΆ”μ²œλ˜κΈ° λ•Œλ¬Έμ—, ν˜„μž¬λŠ” μ‚¬μš©μ΄ ꢌμž₯ λ˜μ§€ μ•Šκ³  ν•˜μœ„ ν˜Έν™˜μ„ μœ„ν•΄ μ‚¬μš©λœλ‹€.
  • 만일 max-age와 λ™μ‹œμ— μ‚¬μš©λ˜λ©΄ ExpiresλŠ” λ¬΄μ‹œλœλ‹€.

μ›ΉλΈŒλΌμš°μ €μ˜ μΊμ‹œ κΈ°λ³Έ λ™μž‘

 

μΊμ‹œκ°€ 없을 경우 ❌

만일 μΊμ‹œκ°€ 없을 경우 λ˜‘κ°™μ€ 이미지λ₯Ό μš”μ²­ν•œλ‹€λ©΄, μ„œλ²„μ—μ„œλŠ” λ™μΌν•œ 이미지λ₯Ό 맀번 1.1M μš©λŸ‰μ˜ λ°μ΄ν„°λ‘œ 응닡해야 ν•œλ‹€. μš©λŸ‰μ΄ μž‘μ€ λ¦¬μ†ŒμŠ€μΌ 경우 큰 λ¬Έμ œκ°€ λ˜μ§€λŠ” μ•Šκ² μ§€λ§Œ μš©λŸ‰μ΄ 크면 클 수둝 톡신 λΉ„μš©μ΄ μ»€μ§€κ²Œ 되고 λ‘œλ”©μ†λ„κ°€ λŠλ €μ§€κ²Œ λœλ‹€.

http-cache-header

  1. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ star.jpg μ΄λ―Έμ§€λ₯Ό μš”μ²­ν•œλ‹€. 
  2. μ„œλ²„μ—μ„œλŠ” ν•΄λ‹Ή μ΄λ―Έμ§€κ°€ μžˆμœΌλ©΄ μ‘닡을 μ€˜μ•Όν•˜λŠ”데, μ΄λ―Έμ§€μ˜ HTTP ν—€λ”+λ°”λ””λ₯Ό ν•©μ³ λŒ€λž΅ 1.1M정도 μš©λŸ‰μ˜ λ°μ΄ν„°λ₯Ό μ‘λ‹΅ν•œλ‹€. 
  3. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” ν•΄λ‹Ή μ΄λ―Έμ§€λ₯Ό μ‘λ‹΅ λ°›μ•„ μ‚¬μš©ν•œλ‹€.
  4. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” star.jpg μ΄λ―Έμ§€λ₯Ό λ‹€μ‹œ ν•œ λ²ˆ μš”μ²­ν•œλ‹€. 
  5. μ„œλ²„μ—μ„œλŠ” λ™μΌν•œ μ΄λ―Έμ§€λ₯Ό λ‹€μ‹œ 1.1M정도 μš©λŸ‰μ˜ λ°μ΄ν„°λ₯Ό μ‘λ‹΅ν•΄μ€€λ‹€. 
  6. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” ν•΄λ‹Ή μ΄λ―Έμ§€λ₯Ό μ‘λ‹΅ λ°›μ•„ μ‚¬μš©ν•œλ‹€. 
  7. λ™μΌν•œ 이미지λ₯Ό μš”μ²­ν•˜λŠ”λ° λ„€νŠΈμ›Œν¬λ₯Ό 톡해 같은 데이터λ₯Ό 또 λ‹€μš΄λ°›μ•„μ•Ό ν•œλ‹€.

 

μΊμ‹œλ₯Ό μ΄μš©ν•œ μš”μ²­ β­•

그러면 μ›ΉλΈŒλΌμš°μ €μ— μΊμ‹œλ₯Ό μ μš©ν•˜λ©΄ μ–Όλ§ˆλ‚˜ 이점이 μžˆλŠ”μ§€ μ•Œμ•„λ³΄μž.

 

1. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ star.jpg 이미지λ₯Ό μš”μ²­ν•œλ‹€. 

2. μ„œλ²„μ—μ„œλŠ” ν•΄λ‹Ή 이미지λ₯Ό 응닡해쀀닀. μ΄λ•Œ HTTP 메세지에 cache-control 헀더λ₯Ό λ„£μ–΄μ£Όμ–΄ μΊμ‹œκ°€ μœ νš¨ν•œ μ‹œκ°„μ„ μ„€μ •ν•œλ‹€. (κ·Έλ¦Όμ—μ„œλŠ” 60초둜 μ„€μ •ν•΄ 60초 λ™μ•ˆμ€ ν•΄λ‹Ή μΊμ‹œκ°€ μœ νš¨ν•˜λ‹€λŠ” μ˜λ―Έλ‹€)

http-cache-header

 

3. μ„œλ²„λ‘œλΆ€ν„° 응닡을 λ°›κ²Œλ˜λ©΄, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” cache-control ν—€λ”λ₯Ό μ΄ν•΄ν•˜κ³  μ›ΉλΈŒλΌμš°μ € μΊμ‹œμ— 응닡 κ²°κ³Όλ₯Ό 60초 λ™μ•ˆ μ €μž₯ν•˜κ²Œ λœλ‹€.

http-cache-header

 

4. ν΄λΌμ΄μ–ΈνŠΈκ°€ star.jpg 이미지λ₯Ό 재차 μš”μ²­ν•œλ‹€. μ΄λ•Œ μ„œλ²„μ—κ²Œ κ°€λŠ” 것이 μ•„λ‹Œ μš°μ„  μΊμ‹œ μ €μž₯μ†Œλ₯Ό μ‘°νšŒν•˜κ²Œ λœλ‹€.

http-cache-header

 

5. 만일 μΊμ‹œ λ˜μ–΄μžˆκ³  60초 이내에 μš”μ²­ν•œ μƒνƒœλΌλ©΄, μΊμ‹œμ—μ„œ 자료λ₯Ό κ°€μ Έμ˜€κ²Œ λœλ‹€.

http-cache-header

그림으둜 보듯이 μΊμ‹œλ₯Ό μ‚¬μš©ν•˜κ²Œ 되면, ν•œ 번 μ‘λ‹΅λ°›μ•˜λ˜ λ°μ΄ν„°λŠ” λΈŒλΌμš°μ €μ˜ μΊμ‹œ μ €μž₯μ†Œμ— 남아 일정 μ‹œκ°„ 내에 κ³„μ†ν•΄μ„œ μ°Έμ‘°ν•  수 있기 λ•Œλ¬Έμ—, μ„œλ²„λ‘œλΆ€ν„° λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ λ‹€μš΄λ‘œλ“œλ₯Ό 효과적으둜 쀄일 수 μžˆλ‹€. μ‚¬μš©μžλŠ” λΉ λ₯Έ μ„œλΉ„μŠ€ κ²½ν—˜μ„ μ΄μš©ν• μˆ˜ 있게 되면, μ„œλ²„λŠ” λ„€νŠΈμ›Œν¬ μ‚¬μš©λŸ‰μ„ 쀄여 λΉ„μš©μ„ μ•„λ‚„μˆ˜ 있게 λœλ‹€.

http-cache-header
http-cache-header

 

μΊμ‹œ 유효 μ‹œκ°„μ΄ 지날 경우 🚩

그런데 만일 60초 κ°€ μ§€λ‚˜ μΊμ‹œ 유효 기간이 만료된 후에 ν΄λΌμ΄μ–ΈνŠΈκ°€ κ·Έ 자료λ₯Ό μš”μ²­ν•  경우 μ–΄λ–»κ²Œ 될까?

 

6. ν΄λΌμ΄μ–ΈνŠΈκ°€ star.jpg 이미지λ₯Ό 재차 μš”μ²­ν•œλ‹€. 그런데 μΊμ‹œ 60초 μœ νš¨μ‹œκ°„μ΄ μ΄ˆκ³Όλ˜μ–΄ 버렀 더이상 κ°€μ Έμ˜¬μˆ˜ μ—†κ²Œ λ˜μ—ˆλ‹€.

http-cache-header

 

7. 그러면 ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‹€μ‹œ μ„œλ²„μ—κ²Œ 처음과 같이 μš”μ²­ν•˜κ²Œ λœλ‹€. (λ‹€μ‹œ λ„€νŠΈμ›Œν¬ λ‹€μš΄λ‘œλ“œκ°€ λ°œμƒ)

http-cache-header

 

8. μ„œλ²„λŠ” λ˜‘κ°™μ΄ cache-control ν—€λ”λ₯Ό μ‘λ‹΅ν•˜κ²Œ 되고, λΈŒλΌμš°μ €λŠ” λ‹€μ‹œ 자료λ₯Ό μΊμ‹œμ— μ €μž₯ν•˜κ²Œ λœλ‹€.

http-cache-header

 

이처럼 6번 상황을 보듯이 μΊμ‹œ μœ νš¨κΈ°κ°„μ΄ μ§€λ‚ κ²½μš° 처음과 같이 쌩 μš”μ²­μ„ λ³΄λ‚΄μ•Όν•œλ‹€.

그러면 μΊμ‹œ 유효 기간을 길게 늘리면 λ˜μ§€ μ•Šλƒ 싢은데 μ΄λŠ” 쒋지 μ•Šμ€ 방법이닀. μ™œλƒν•˜λ©΄ 였랜 κΈ°κ°„ λ³€κ²½λ˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 데이터가 μžˆλŠ” 반면, 짧은 λ³€κ²½ μ£ΌκΈ°λ₯Ό κ°€μ§€λŠ” 데이터도 있기 λ•Œλ¬Έμ΄λ‹€. 즉, λ§Œλ£ŒκΈ°κ°„μ΄ κΈ΄ 경우 μΊμ‹œ 데이터가 였래된 데이터일 κ°€λŠ₯성이 λ†’μ•„μ§€κ²Œ λœλ‹€.

λ”°λΌμ„œ 비둝 μΊμ‹œ 유효 μ‹œκ°„μ΄ 지났더라도 였랜 κΈ°κ°„ λ³€κ²½λ˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 데이터일 경우 μ²˜μŒλΆ€ν„° μš”μ²­μ„ ν•˜λŠ” 건 λ‚­λΉ„λ₯Ό μ΄ˆλž˜ν•˜λŠ” μš”μ²­μ΄ λœλ‹€λŠ” μ†Œλ¦¬μ΄λ‹€. κ·Έλž˜μ„œ λ”μš± λ” 효율적인 μΊμ‹œ μ „λž΅μ„ μœ„ν•΄ μ›Ή λΈŒλΌμš°μ €μ—λŠ” λ³„λ„μ˜ μΊμ‹œ 검증 λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ²Œ λœλ‹€.

사싀 ‘μΊμ‹œλ₯Ό μ–Όλ§ˆλ‚˜ 였래 μœ μ§€ν•΄μ•Ό ν•˜λŠ”κ°€?‘의 λ¬Έμ œλŠ” 닡이 μ—†λ‹€. ꡳ이 λ§ν•˜μžλ©΄ λ°μ΄ν„°μ˜ 성격과 상황에 따라 μ•Œλ§žκ²Œ μ„€μ •ν•΄μ•Ό ν•œλ‹€.

HTTP μΊμ‹œ 검증 & 쑰건뢀 μš”μ²­

 

μΊμ‹œ 검증 헀더 μ’…λ₯˜

μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡(Response) ν• λ•Œ HTTP 메세지 헀더에 λ„£λŠ” μΊμ‹œ κ΄€λ ¨ 헀더 정보듀이닀.

 

Last-Modified 헀더

Last-Modified

  • λ°μ΄ν„°μ˜ μ΅œμ’… μˆ˜μ • μ‹œκ°μ„ λͺ…μ‹œν•œλ‹€. (μœˆλ„μš° νŒŒμΌμ„ 보면 μ΅œμ’… μˆ˜μ • μ‹œκ° 같은 κ°œλ…μ΄λ‹€)
  • If-Modified-Since μš”μ²­(Request) 헀더와 ν•¨κ»˜ μ‚¬μš©λœλ‹€
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μΊμ‹œ 유효 기간이 초과된 데이터λ₯Ό μ„œλ²„μ— μš”μ²­ν•˜λŠ” 경우, 이λ₯Ό κΈ°μ€€μœΌλ‘œ 데이터가 μˆ˜μ •λ˜μ—ˆλŠ”μ§€ κ²€μ¦ν•œλ‹€. 예λ₯Όλ“€μ–΄ μ„œλ²„μ˜ 데이터 μ΅œμ’… μˆ˜μ • μ‹œκ°μ΄ Last-Modified 보닀 이후라면, 데이터가 μˆ˜μ •λœ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜κ³ , μ„œλ²„μ˜ 데이터 μ΅œμ’… μˆ˜μ • μ‹œκ°μ΄ Last-Modified 와 κ°™λ‹€λ©΄ 데이터가 μˆ˜μ •λ˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€.
  • ex) last-modified: Tue, 15 Mar 2022 06:48:06 GMT . . .

 

ETag 헀더

ETag

  • νŠΉμ • λ²„μ „μ˜ λ¦¬μ†ŒμŠ€λ₯Ό μ‹λ³„ν•˜λŠ” 고유 μ‹λ³„μž (λ°μ΄ν„°μ˜ 버전 이름 ν˜Ήμ€ ν•΄μ‹œκ°’)
  • μ„œλ²„λŠ” 파일이 변경될 λ•Œλ§ˆλ‹€ μƒˆ ETag 값을 μƒμ„±ν•˜κ³  이전 ETag 값을 μœ μ§€ν•œλ‹€.
  • If-None-Match μš”μ²­(Request) 헀더와 ν•¨κ»˜ μ‚¬μš©λœλ‹€
  • Last-Modified ν—€λ”μ˜ ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•œ λ¦¬μ†ŒμŠ€ 검증 헀더
  • ex) ETag: "a2jiodwjekjl3" , ETag: "v1.0" . . .

쑰건뢀 μš”μ²­ 헀더 μ’…λ₯˜

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— μš”μ²­(Request) ν• λ•Œ HTTP 메세지 헀더에 λ„£λŠ” μΊμ‹œ κ΄€λ ¨ 헀더 정보듀이닀.

 

If-Modified-Since 헀더

If-Modified-Since

  • ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­(Request) μ‹œ μ‚¬μš©λ˜λ©°, μΊμ‹œ λ°μ΄ν„°μ˜ Last-Modified 값이 λ“€μ–΄κ°„λ‹€.
  • μ„œλ²„μ˜ 데이터 μ΅œμ’… μˆ˜μ • μ‹œκ°κ³Ό μΊμ‹œ λ°μ΄ν„°μ˜ μ΅œμ’… μˆ˜μ • μ‹œκ°μ„ λΉ„κ΅ν•˜μ—¬ 데이터 μˆ˜μ • μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
    • μΊμ‹œμ— μžˆλŠ” λ¦¬μ†ŒμŠ€ μˆ˜μ • μ‹œκ°κ³Ό μ„œλ²„μ— μžˆλŠ” λ¦¬μ†ŒμŠ€ μˆ˜μ • μ‹œμž‘μ΄ κ°™μœΌλ©΄, 304 Not Modified 응닡 → μΊμ‹œ μž¬μ‚¬μš©
    • μΊμ‹œμ— μžˆλŠ” λ¦¬μ†ŒμŠ€ μˆ˜μ • μ‹œκ°κ³Ό μ„œλ²„μ— μžˆλŠ” λ¦¬μ†ŒμŠ€ μˆ˜μ • μ‹œμž‘μ΄ λ‹€λ₯΄λ©΄, 200 OK μ‘λ‹΅ → μƒˆλ‘œ 데이터 전솑 (λ„€νŠΈμ›Œν¬ λ‹€μš΄λ‘œλ“œ)

 

If-None-Match 헀더

If-None-Match

  • ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­(Request) μ‹œ μ‚¬μš©λ˜λ©°, μΊμ‹œ λ°μ΄ν„°μ˜ ETag 값이 λ“€μ–΄κ°„λ‹€.
  • μ„œλ²„μ˜ 데이터 ETag μ™€ μΊμ‹œ λ°μ΄ν„°μ˜ ETag λ₯Ό λΉ„κ΅ν•˜μ—¬ 데이터 μˆ˜μ • μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.
    • μΊμ‹œμ— μžˆλŠ” ETag 와 μ„œλ²„μ— μžˆλŠ” ETag κ°€ κ°™μœΌλ©΄, 304 Not Modified 응닡 → μΊμ‹œ μž¬μ‚¬μš©
    • μΊμ‹œμ— μžˆλŠ” ETag 와 μ„œλ²„μ— μžˆλŠ” ETag κ°€ λ‹€λ₯΄λ©΄, 200 OK μ‘λ‹΅ → μƒˆλ‘œ 데이터 전솑 (λ„€νŠΈμ›Œν¬ λ‹€μš΄λ‘œλ“œ)

 

If-Unmodified-Since / If-Match 헀더

If-Unmodified-Since
If-Match

  • 각각 If-None-Match μ™€ If-Modified-Since λ°˜λŒ€ μ—­ν•  μˆ˜ν–‰μ„ ν•œλ‹€λ„ 보면 λœλ‹€.
  • 이 헀더듀은 412 Precondition failed μƒνƒœ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

μ›ΉλΈŒλΌμš°μ €μ˜ 쑰건뢀 μš”μ²­ & 검증 λ™μž‘

μΊμ‹œ λ§Œλ£Œν›„μ—λ„ μ„œλ²„μ—μ„œ ν•΄λ‹Ή λ¦¬μ†ŒμŠ€λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•˜μ§€ μ•Šμ€ 경우라면, μ„œλ²„μ—μ„œ λ™μΌν•œ 데이터λ₯Ό μš”μ²­ν•΄μ„œ μ‘λ‹΅λ°›λŠ” 것은 μ—¬λŸ¬λͺ¨λ‘œ λΉ„μš©λ‚­λΉ„κ°€ 되게 λœλ‹€. μ΄λŸ΄λ•ŒλŠ” λ°œμƒμ˜ μ „ν™˜μœΌλ‘œ μ μž¬ν•΄ λ‘” μΊμ‹œλ₯Ό μž¬μ‚¬μš© ν•  수 있으면 쒋은데, μ΄λŸ¬ν•œ μ „λž΅μ„ μ΄μš©ν•˜κΈ° μœ„ν•΄μ„  μ–΄λ–»κ²Œ ν΄λΌμ΄μ–ΈνŠΈμ˜ 데이터와 μ„œλ²„μ˜ 데이터가 λ™μΌν•˜λ‹€λŠ” 것을 μ•Œ μˆ˜μžˆλŠ”μ§€μ— λŒ€ν•΄ μ•Œμ•„μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ HTTPμ—μ„œλŠ” 좔가적인 검증 헀더λ₯Ό μ΄μš©ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€.

 

λ¬Έμ„œ μˆ˜μ • μ‹œκ°„ 방식 (Last-Modified & if-modified-since)

κ°€μž₯ μ‹¬ν”Œν•œ 방법은 λ¦¬μ†ŒμŠ€ μˆ˜μ • μ‹œκ°μ„ μ΄μš©ν•΄μ„œ λ¦¬μ†ŒμŠ€ λ³€κ²½ 사항을 ν™•μΈν•˜λŠ” 것이닀.

예λ₯Όλ“€μ–΄ μΊμ‹œμ— μ €μž₯된 λ¦¬μ†ŒμŠ€μ˜ μˆ˜μ • μ‹œκ°κ³Ό μ„œλ²„μ— μ €μž₯된 λ¦¬μ†ŒμŠ€μ˜ μˆ˜μ • μ‹œκ°μ΄ κ°™μœΌλ©΄ λ³€κ²½ 사항이 μ—†κΈ° λ•Œλ¬Έμ— μΊμ‹œμ— μžˆλŠ” 것을 μž¬ν™œμš©ν•˜λ©΄ 되고, μˆ˜μ • μ‹œκ°μ΄ λ‹€λ₯΄λ©΄ μ΅œμ‹  λ¦¬μ†ŒμŠ€λ₯Ό κ°±μ‹ ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μƒˆλ‘œ μ„œλ²„μ—μ„œ λ³΄λ‚΄μ£ΌλŠ” 것이닀.

Last-Modified

 

1. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ star.jpg 이미지λ₯Ό μš”μ²­ν•œλ‹€. 

2. μ„œλ²„λŠ” cache-control 헀더λ₯Ό μ΄μš©ν•˜μ—¬ μΊμ‹œ 유효 기간을 60초둜 μ„€μ •ν•˜κ³  μΆ”κ°€μ μœΌλ‘œ Last-Modified 헀더λ₯Ό 톡해 λ¦¬μ†ŒμŠ€μ˜ λ§ˆμ§€λ§‰μœΌλ‘œ μˆ˜μ •λœ μ‹œκ°„ 정보λ₯Ό λ„£μ–΄ μ‘λ‹΅ν•΄μ˜¨λ‹€.

if-modified-since

 

3. ν΄λΌμ΄μ–ΈνŠΈλŠ” 응닡 κ²°κ³Όλ₯Ό μΊμ‹œμ— μ €μž₯ν•  λ•Œ 데이터 μ΅œμ’… μˆ˜μ •μΌλ„ μ €μž₯ν•œλ‹€.

if-modified-since

 

4. 100μ΄ˆκ°€ μ§€λ‚œν›„ μΊμ‹œ 유효 μ‹œκ°„ 초과된 μƒνƒœμ—μ„œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ star.jpg 이미지λ₯Ό 재차 μš”μ²­ν•œλ‹€.

if-modified-since

 

5. μ΄λ•Œ μΊμ‹œμ— μ΅œμ’… μˆ˜μ •μΌ 정보(Last-Modified)κ°€ μžˆλ‹€λ©΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ 메세지에 if-modified-since 헀더에 ν•΄λ‹Ή λ‚ μ§œλ₯Ό λ‹΄μ•„μ„œ μ„œλ²„μ— 보낸닀.

if-modified-since

 

6. μ„œλ²„μ—μ„œ 만일 ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ ν—€λ”μ˜ 자료 μ΅œμ’… μˆ˜μ •μΌκ³Ό μ„œλ²„μ— μžˆλŠ” 자료의 μˆ˜μ •μΌμ„ λΉ„κ΅ν•΄μ„œ 데이터가 μˆ˜μ •μ΄ μ•ˆλ˜μ—ˆμ„ 경우, 304 Not Modified μƒνƒœ μ½”λ“œλ‘œ μ‘λ‹΅ν•˜κ²Œ λœλ‹€. (μ΄λ•Œ λ¦¬μ†ŒμŠ€λŠ” 담지 μ•ŠλŠ”λ‹€. κ·Έλž˜μ„œ 전솑 데이터가 μ—†κΈ° λ•Œλ¬Έμ— 0.1M 만 μ „μ†‘λœλ‹€)

if-modified-since

 

7. 304 응닡을 받은 ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ†ŒμŠ€ μˆ˜μ •μ΄ μ—†μ–΄ μ΅œμ‹  μƒνƒœμž„μ„ μΈμ§€ν•˜κ²Œ 되고, μ•ˆμ „ν•˜κ²Œ μΊμ‹œμ—μ„œ λ‹€μ‹œ λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜€κ³  λ‹€μ‹œ μΊμ‹œ 유효 기간을 κ°±μ‹ ν•΄μ€€λ‹€.

Last-Modified

 

μ •λ¦¬ν•˜μžλ©΄, 본래라면 1.1M 응닡 데이터λ₯Ό λ°›μ•„μ˜€κ²Œ λ˜μ–΄μžˆμ§€λ§Œ, 쑰건뢀 μš”μ²­μ„ 톡해 비둝 μΊμ‹œ 유효 기간이 지났더라도 λ¦¬μ†ŒμŠ€κ°€ 변경이 μ—†λ‹€λ©΄ μΊμ‹œμ—μ„œ μž¬ν™œμš©ν•΄λ„ λœλ‹€λŠ” μ·¨μ§€λ‘œ, μ„œλ²„λŠ” κ·Έλƒ₯ 헀더 λ©”μ„Έμ§€λ§Œ μ‘λ‹΅ν•˜κ²Œ λ˜λ‹ˆ 1λ©”κ°€λ°”μ΄νŠΈλ₯Ό μ ˆμ•½ν•˜κ²Œ 된 것이닀. 결과적으둜 λ„€νŠΈμ›Œν¬ λ‹€μš΄λ‘œλ“œκ°€ λ°œμƒλ˜μ§€λ§Œ 0.1M만 λ°›κ²Œ λ˜λ‹ˆ μ‚¬μš©μžλŠ” λΉ λ₯΄κ²Œ μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν• μˆ˜ 있게 λœλ‹€.

 

μ‹€μ œ 개발자 λ„κ΅¬μ—μ„œ λ„€νŠΈμ›Œν¬ 응닡을 보면 더 ν™•μ—°νžˆ 이해가 될것이닀.

Cache-Control ν—€λ”μ˜ max-age 값을 5초둜 μ§€μ •ν•˜κ³  계속 λ™μΌν•œ μš”μ²­μ„ ν• κ²½μš°, μ΄ˆκ°€ μ§€λ‚˜λ©΄ μΊμ‹œ 유효 기간이 λ§Œλ£Œλ˜μ–΄ λ‹€μ‹œ μ„œλ²„μ— μš”μ²­μ„ ν•˜κ²Œ λ˜μ§€λ§Œ 원본 μš©λŸ‰(994KB) 보닀 훨씬 더 적은 192Bλ₯Ό λ°›λŠ”κ±Έ λ³Ό 수 μžˆλ‹€. 즉, μ΄λ―Έμ§€λŠ” λ°›μ§€μ•Šκ³  HTTP λ©”μ„Έμ§€λ§Œ λ°›κ³  μΊμ‹œ μ €μž₯μ†Œμ—μ„œ λ‹€μ‹œ κ°€μ Έμ˜€λŠ” λ™μž‘μ„ 5μ΄ˆλ§ˆλ‹€ ν–‰ν•˜κ³  μžˆλŠ” 것이닀.

Last-Modified

 

Last-Modified & if-modified-since λ°©μ‹μ˜ ν•œκ³„μ 

ν•˜μ§€λ§Œ λ‹¨μˆœνžˆ λ¦¬μ†ŒμŠ€μ˜ μˆ˜μ • μ‹œκ°μœΌλ‘œ μΊμ‹œ 이용 μ „λž΅μ„ μ„Έμš°λŠ”λ°λŠ” λ‹€μŒκ³Ό 같은 ν•œκ³„κ°€ μ‘΄μž¬ν•œλ‹€.

  1. 1초 λ―Έλ§Œ(0.x초)λ‹¨μœ„λ‘œ μΊμ‹œ μ‘°μ •μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€. 
  2. λ‚ μ§œ 기반의 λ‘œμ§μ„ μ‚¬μš©ν•˜μ—¬ ν•œκ³„κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ test.txt 파일의 λ‚΄μš©μ„ A → B둜 μˆ˜μ •ν–ˆμ§€λ§Œ, λ‹€μ‹œ B →  A둜 λ‘€λ°±ν•œ 경우 λ‚΄μš©μ€ μΊμ‹œμ— μžˆλŠ” 것과 κ°™μ§€λ§Œ λ‚ μ§œ 변경이 λ˜μ„œ λ‹€μ‹œ λ°›μ•„μ•Ό ν•œλ‹€.
  3. μ„œλ²„μ—μ„œ λ³„λ„μ˜ μΊμ‹œ λ‘œμ§μ„ κ΄€λ¦¬ν•˜κ³  싢은 경우 ν•œκ³„κ°€ μžˆλ‹€ (μŠ€νŽ˜μ΄μŠ€λ‚˜ μ£Όμ„μ²˜λŸΌ 크게 영ν–₯이 μ—†λŠ” λ³€κ²½μ—μ„œ μΊμ‹œλ₯Ό μœ μ§€ν•˜κ³  싢은 경우)

Etag 비ꡐ 방식 (Etag & If-None-Match)

λ”°λΌμ„œ μ„œλ²„μ—μ„œ μ™„μ „νžˆ μΊμ‹œλ₯Ό 컨트둀 ν•˜κ³  μ‹Άλ‹€λ©΄ ETag λ₯Ό μ‚¬μš©ν•˜μ—¬ μž„μ˜μ˜ ν•΄μ‹œκ°’μ„ ν™œμš©ν•΄ 컨텐츠λ₯Ό 쒀더 λ©΄λ°€ν•˜κ²Œ 관리가 κ°€λŠ₯ν•˜λ‹€. 만일 데이터가 λ³€κ²½λ˜λ©΄ ETag κ°€ λ³€κ²½λ˜κΈ° λ•Œλ¬Έμ—, λ‹¨μˆœνžˆ ETag κ°€ κ°™μœΌλ©΄ 데이터가 μˆ˜μ •λ˜μ§€ μ•Šμ€ 것이고, ETag κ°€ λ‹€λ₯΄λ©΄ 데이터가 μˆ˜μ •λœ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜κ²Œ λœλ‹€.

Etag

 

1. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ star.jpg 이미지λ₯Ό μš”μ²­ν•œλ‹€. 

2. μ„œλ²„μ—μ„œ 헀더에 ETag λ₯Ό μž‘μ„±ν•΄μ„œ 이미지와 ν•¨κ»˜ 응닡해쀀닀.

Etag

 

3. ν΄λΌμ΄μ–ΈνŠΈλŠ” ETag 값을 μΊμ‹œμ— μ €μž₯ν•œλ‹€.

Etag

 

4. 100μ΄ˆκ°€ μ§€λ‚œν›„ μΊμ‹œ 유효 μ‹œκ°„ 초과된 μƒνƒœμ—μ„œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ star.jpg 이미지λ₯Ό 재차 μš”μ²­ν•œλ‹€.

etag-cache-miss

 

5. μ΄λ•Œ μΊμ‹œμ— Etag 값이 λ“€μ–΄μžˆλ‹€λ©΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ 메세지에 if-None-Match ν—€λ”에 해당값을 λ‹΄μ•„μ„œ μ„œλ²„μ— 보낸닀.

Etag-cache

 

6. μ„œλ²„μ—μ„œ 데이터가 λ³€κ²½λ˜μ§€ μ•Šμ•˜μ„ 경우 ETagλŠ” λ™μΌν•˜λ‹€. κ·Έλž˜μ„œ If-None-Match λ‘œμ§μ€ μ‹€νŒ¨κ°€ λ˜μ–΄ 304 Not Modifiedλ₯Ό μ‘λ‹΅ν•œλ‹€. (μ΄λ•Œ μ—­μ‹œ λ¦¬μ†ŒμŠ€λŠ” λ‹΄κ²¨μžˆμ§€ μ•ŠλŠ”λ‹€ → 0.1M 전솑)

Etag-cache

 

7. 304 응닡을 받은 ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ†ŒμŠ€ μˆ˜μ •μ΄ μ—†μ–΄ μ΅œμ‹  μƒνƒœμž„μ„ μΈμ§€ν•˜κ²Œ 되고, μ•ˆμ „ν•˜κ²Œ μΊμ‹œμ—μ„œ λ‹€μ‹œ λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜€κ³  λ‹€μ‹œ μΊμ‹œ 유효 기간을 κ°±μ‹ ν•΄μ€€λ‹€.

Etag-cache

 

μ •λ¦¬ν•˜μžλ©΄, ETag만 μ„œλ²„μ— 보내 λ™μΌν•˜λ©΄ μœ μ§€ν•˜κ³  λ‹€λ₯΄λ©΄ λ‹€μ‹œ λ°›λŠ”λ‹€. 즉, μΊμ‹œ μ œμ–΄ λ‘œμ§μ„ 파일 μˆ˜μ • μ‹œκ° 비ꡐ가 μ•„λ‹Œ μ„œλ²„μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 것이닀. μ˜ˆλ₯Όλ“€μ–΄ μ„œλ²„λŠ” 베타 μ˜€ν”ˆ κΈ°κ°„ 3일간 파일이 λ³€κ²½λ˜μ–΄λ„ ETagλ₯Ό λ™μΌν•˜κ²Œ μœ μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 주기에 λ§žμΆ°μ„œ ETagλ₯Ό λͺ¨λ‘ κ°±μ‹ ν•˜λŠ” μ‹μœΌλ‘œ 자체 κ΄€λ¦¬ν•¨μœΌλ‘œμ¨, κ·Έλž˜μ„œ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‹¨μˆœν•˜κ²Œ 이 값을 μ„œλ²„μ— 제곡만 ν•˜λ©΄ 되고, λ³„λ„λ‘œ μΊμ‹œ λ§€μ»€λ‹ˆμ¦˜μ„ μ•Œ ν•„μš”κ°€ μ—†κ²Œ λœλ‹€.


ν”„λ‘μ‹œ(Proxy) μΊμ‹œ

ν”„λ‘μ‹œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ λ³Έμ„œλ²„λ₯Ό μ€‘κ³„ν•˜λŠ” 쀑간에 μœ„μΉ˜ν•œ μ„œλ²„ λŒ€λ¦¬μžλ‘œμ„œ, ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λŒ€μ‹  λ°›κ³  λ³Έμ„œλ²„μ— μ „ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€. 이 ν”„λ‘μ‹œλ₯Ό μΊμ‹œ μ„œλ²„λ‘œμ„œ μ΄μš©ν• μˆ˜ μžˆλŠ”λ°, 예λ₯Όλ“€μ–΄ ν•œκ΅­μ— μžˆλŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 이미지가 ν•„μš”ν•œμƒν™©μΈλ°, ν•΄λ‹Ή μ΄λ―Έμ§€μ˜ μ›μ„œλ²„κ°€ 미ꡭ에 μžˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž. ν•œκ΅­ μ„œλ²„μ—μ„œ λ―Έκ΅­ μ„œλ²„κΉŒμ§€ 직접 μ ‘κ·Όν•˜μ—¬ 이미지λ₯Ό κ°€μ Έμ˜€λŠ”λ° 0.5μ΄ˆκ°€λŸ‰ κ±Έλ¦°λ‹€κ³ ν•˜λ©΄, ν•œκ΅­μ— μœ„μΉ˜ν•œ 컴퓨터듀은 λͺ¨λ‘ 0.5초 κ°€λŸ‰μ„ κΈ°λ‹€λ €μ•Ό ν•΄λ‹Ή 이미지λ₯Ό 받을 수 있게 λœλ‹€.

Proxy-cache

 

κ·Έλž˜μ„œ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ ν”„λ‘μ‹œ μΊμ‹œλ₯Ό λ„μž…ν•˜μ—¬ μ‚¬μš©ν•œλ‹€κ³  보면 λœλ‹€.

ν•œκ΅­μ— ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„λ₯Ό λ”°λ‘œ 두고, 졜초의 μš”μ²­μ—λ§Œ λ―Έκ΅­ μ„œλ²„κΉŒμ§€ κ°€μ„œ 이미지 λ¦¬μ†ŒμŠ€λ₯Ό λ°›μ•„μ˜€κ³  ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„μ— μ €μž₯ν•œλ‹€. 그러면 ν•œκ΅­μ˜ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ¦¬μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜¬λ•Œ ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„λ‘œ λΆ€ν„° 자료λ₯Ό κ°€μ Έμ˜€λ©΄ λœλ‹€. 특히 μ—¬λŸ¬ μ‚¬λžŒλ“€μ΄ μ°ΎλŠ” 자료일수둝 이미 μΊμ‹œμ— λ“±λ‘λ˜μ–΄μžˆκΈ°μ— 효과적으둜 λΉ λ₯Έ μ†λ„λ‘œ 자료λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€. μš°λ¦¬κ°€ μœ νŠœλΈŒμ—μ„œ κ³ μš©λŸ‰μ˜ μ˜μƒλ„ 빨리 λ³Ό 수 μžˆλŠ” μ΄μœ λ„ 이에 ν•΄λ‹Ήν•œλ‹€.

Proxy-cache

즉, 같은 ꡭ내에 μžˆκΈ°μ— μ›μ„œλ²„μ— μ ‘κ·Όν•˜λŠ”κ²ƒλ³΄λ‹€ 훨씬 λΉ λ₯Έ 속도에 자료λ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€λŠ” 것이닀.

 

참고둜 ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ‚¬μš©λ˜κ³  μ €μž₯λ˜λŠ” μΊμ‹œλ₯Ό private μΊμ‹œλΌ ν•˜κ³  ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„μ˜ μΊμ‹œλ₯Ό public μΊμ‹œλΌ ν•œλ‹€.

μ›ΉλΈŒλΌμš°μ € μΊμ‹œμ™€ ν”„λ‘μ‹œ μ„œλ²„ μΊμ‹œκ°€ λΆ„λ¦¬λ˜μ–΄ μš΄μš©λ˜λŠ” 만큼, μœ„μ—μ„œ 배운 Cache-Control HTTP 헀더도 ν”„λ‘μ‹œ μ „μš© μΊμ‹œ 섀정을 ν•΄μ•Ό ν•œλ‹€.

Proxy-cache


ν”„λ‘μ‹œ μΊμ‹œ 헀더

ν”„λ‘μ‹œ μΊμ‹œ 헀더
CDNμ—μ„œλŠ” 1λ…„λ™μ•ˆ μΊμ‹œλ˜μ§€λ§Œ λΈŒλΌμš°μ €μ—μ„œλŠ” 맀번 μž¬κ²€μ¦ μš”μ²­μ„ 보내도둝 μ„€μ •

  • Cache-Control: private → 응닡이 ν•΄λ‹Ή μ‚¬μš©μžλ§Œμ„ μœ„ν•œ κ²ƒμœΌλ‘œ private μΊμ‹œμ— μ €μž₯ν•΄μ•Ό ν•œλ‹€ (default) 
  • Cache-Control: public → 응닡이 public μΊμ‹œμ— μ €μž₯λ˜μ–΄λ„ λœλ‹€. 
  • Cache-Control: s-maxage → ν”„λ‘μ‹œ μΊμ‹œμ—λ§Œ μ μš©λ˜λŠ” max-age
  • Age: 60 (HTTP 헀더) → μ˜€λ¦¬μ§„ μ„œλ²„μ—μ„œ 응닡 ν”„λ‘μ‹œ μΊμ‹œ 내에 λ¨Έλ¬Έ μ‹œκ°„(초)

HTTP μΊμ‹œ λ¬΄νš¨ν™”

μΊμ‹œ λ¬΄νš¨ν™”(Cache Busting)λŠ” λ§κ·ΈλŒ€λ‘œ μ›ΉλΈŒλΌμš°μ €μ˜ μΊμ‹œλ₯Ό μ™„μ „ μ œκ±°ν•΄λ²„λ¦¬λŠ” 것을 λ§ν•œλ‹€.

μ΄λŸ¬ν•œ 기술이 ν•„μš”ν•œ μ΄μœ λŠ”, μ›Ή λΈŒλΌμš°μ €λ“€μ΄ GET μš”μ²­μ„ 받을 경우 λ³„λ„μ˜ μΊμ‹œ 헀더 없이도 자기 λ§ˆμŒλŒ€λ‘œ μ΅œμ ν™”ν•œλ‹΅μ‹œκ³  μž„μ˜λ‘œ 캐싱을 해버리기 λ•Œλ¬Έμ΄λ‹€. λ˜ν•œ λ¬΄ν„±λŒ€κ³  λ¦¬μ†ŒμŠ€μ˜ μΊμ‹œ 유효 기간을 길게 μ„€μ •ν•˜μ—¬μ„œ λ¦¬μ†ŒμŠ€μ˜ μ—…λ°μ΄νŠΈκ°€ ν•„μš”ν•  경우 μΊμ‹œ μ €μž₯μ†Œμ˜ 볡사본을 κ°±μ‹ ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ°, 기본적으둜 λΈŒλΌμš°μ €λŠ” μΊμ‹œ 유효 기간이 λλ‚˜μ•Ό μΊμ‹œ μœ νš¨μ„± 검증을 μ„œλ²„μ—κ²Œ μš”μ²­ν•˜κΈ° λ•Œλ¬Έμ— μ–΄μ°Œν•  방도가 μ—†λ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•˜μ—¬ μΊμ‹œ λ¬΄νš¨ν™” μ „λž΅μ„ μ‚¬μš©ν•œλ‹€κ³  보면 λœλ‹€.

Cache-Control 흐름도
Cache-Control 흐름도


μΊμ‹œ λ¬΄νš¨ν™” 헀더

λ§Œμ•½ μΊμ‹œλ₯Ό μ‚¬μš©ν•΄μ„  μ•ˆλ˜λŠ” νŽ˜μ΄μ§€κ°€ μ‘΄μž¬ν•œλ‹€λ©΄, λ‹€μŒκ³Ό 같이 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 κΈ°λ³Έ λ™μž‘

no-cache

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” E-Tag와 no-cache 섀정을 ν•˜κ³  μ„œλ²„μ—κ²Œ μš”μ²­ν•œλ‹€.
  2. 쀑간에 ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„κ°€ λ°›κ²Œ 되고, no-cache 섀정이 λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— λ‹€μ‹œ 원 μ„œλ²„μ— μš”μ²­ν•œλ‹€
  3. 원 μ„œλ²„μ—μ„œ E-Tag둜 κ²€μ¦ν•˜κ³ 
  4. ν”„λ‘μ‹œμ—κ²Œ 304 응닡을 μ€€λ‹€
  5. ν”„λ‘μ‹œλŠ” λ‹€μ‹œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ κ·ΈλŒ€λ‘œ μ‘λ‹΅ν•œλ‹€.
  6. ν΄λΌμ΄μ–ΈνŠΈλŠ” μΊμ‹œλ₯Ό μž¬μ‚¬μš©ν•œλ‹€.

 

원 μ„œλ²„μ— λ¬Έμ œκ°€ 생길 경우 no-cache λ™μž‘

no-cache

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” E-Tag와 no-cache 섀정을 ν•˜κ³  μ„œλ²„μ—κ²Œ μš”μ²­ν•œλ‹€.
  2. 쀑간에 ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„μ—μ„œ λ‹€μ‹œ 원 μ„œλ²„μ— μš”μ²­ν•˜λŠ”λ°, μ–΄λ– ν•œ 이유둜 λ„€νŠΈμ›Œν¬κ°€ λ‹¨μ ˆλ˜μ–΄ 접근이 μ•ˆλœλ‹€.
  3. 그러면 no-cacheμ—μ„œλŠ” μ‘λ‹΅μœΌλ‘œ 였λ₯˜κ°€ μ•„λ‹Œ 였래된 데이터라도 λ³΄μ—¬μ£ΌμžλΌλŠ” κ°œλ…μœΌλ‘œ 200 OK으둜 응닡을 ν•œλ‹€.
  4. 원 μ„œλ²„μ˜ 처리 μƒνƒœλ„ λͺ¨λ₯Έμ±„ ν΄λΌμ΄μ–ΈνŠΈλŠ” 였래된 데이터λ₯Ό μ†ŒλΉ„μžμ—κ²Œ λ³΄μ—¬μ£Όκ²Œ 되고, μ„œλΉ„μŠ€μ— 차질이 μƒκΈ°κ²Œ λœλ‹€.

 

must-revalidate λ™μž‘

λ”°λΌμ„œ μœ„μ™€ 같은 문제점 λ•Œλ¬Έμ— must-revalidate λ₯Ό λͺ…μ‹œν•˜μ—¬ Proxy Cache Server κ°€ 자체적으둜 μΊμ‹œ 데이터λ₯Ό λ°˜ν™˜ν•˜λŠ” μΌ€μ΄μŠ€λ₯Ό 사전에 μ°¨λ‹¨ν•˜μ—¬μ•Ό ν•œλ‹€.

must-revalidate

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” E-Tag와 must-revalidate 섀정을 ν•˜κ³  μ„œλ²„μ—κ²Œ μš”μ²­ν•œλ‹€.
  2. 쀑간에 ν”„λ‘μ‹œ μΊμ‹œ μ„œλ²„μ—μ„œ λ‹€μ‹œ 원 μ„œλ²„μ— μš”μ²­ν•˜λŠ”λ°, μ–΄λ– ν•œ 이유둜 λ„€νŠΈμ›Œν¬κ°€ λ‹¨μ ˆλ˜μ–΄ 접근이 μ•ˆλœλ‹€.
  3. 그러면 must-revalidateμ—μ„œλŠ” 일단 무쑰건 504 Gateway Timeout 였λ₯˜λ₯Ό μ‘λ‹΅ν•œλ‹€.
  4. ν΄λΌμ΄μ–ΈνŠΈλŠ” 원 μ„œλ²„μ— λ¬Έμ œκ°€ μžˆμŒμ„ κ°μ§€ν•˜κ³  λ³„λ„μ˜ μž¬μˆ˜μ • λ‘œμ§μ„ 거치게 ν•œλ‹€.
λ‹€λ§Œ, must-revalidateλŠ” μΊμ‹œ μœ νš¨μ„± 기간이 λ‚¨μ•„μžˆμœΌλ©΄ μš°μ„ μ μœΌλ‘œ μΊμ‹œ μ €μž₯μ†Œλ₯Ό μ‘°νšŒν•˜κ²Œ λ˜μ–΄μžˆλ‹€. λ”°λΌμ„œ 원 μ„œλ²„ λ„€νŠΈμ›Œν¬ 문제 ν•΄κ²°κ³Ό 항상 원 μ„œλ²„μ— μΊμ‹œ 검증을 ν•¨κ»˜ μ‚¬μš©ν•˜κ³  싢은 경우 no-cache와 ν•¨κ»˜ μ„€μ •ν•΄μ£Όλ©΄ λœλ‹€.
no-cache-must-revalidate

# 참고자료

λͺ¨λ“  개발자λ₯Ό μœ„ν•œ 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/