백엔드 개발자 - 젤리곰 2024. 5. 15. 12:22
728x90

1.캐시 기본 동작

캐시유무에 따른 동작
캐시 없을 때 vs 캐시 있을 때 HTTP 요청 흐름 비교

✔️HTTP 요청 흐름 비교

▪️ 캐시 없을 때

: 사용자가 서버에 직접 요청하고 서버에서 처리 후 사용자에게 다시 데이터를 보내는 과정을 나타낸다.

이 경우 모든 요청은 서버에서 처리되어야 한다.

 

▪️  캐시 있을 때

: 사용자가 데이터가 필요할 때 캐시를 먼저 확인하고, 데이터가 캐시에 있으면 서버를 거치지 않고 바로 캐시에서 데이터를 받아 사용하는 과정을 보여준다.

 

✅캐시가 없을 때 특징

  • 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운받아야한다.
  • 인터넷 네트워크는 매우 느리고 비싸다
  • 브라우저 로딩 속도가 느리다
  • 느린 사용자 경험

✅ 캐시가 있을 때 특징

HTTP/1.1 200 OK
Date: Wed, 15 May 2024 12:30:00 GMT
Content-Type: image/jpeg
Content-Length: 102400
ETag: "def456"
Cache-Control: max-age=3600
  • 서버는 클라이언트에 HTTP 응답을 보낼 때, Cache-Control 헤더로 캐시가 유효한 시간을 적용해서 보낸다.
  • 캐시 유효 시간동안 네트워크를 사용하지 않아도 된다.
  • 비싼 네트워크 사용량을 줄일 수 있다.
  • 브라우저 로딩 속도가 매우 빠르다.
  • 빠른 사용자 경험

2. 검증 헤더와 조건부 요청

1) 검증 헤더와 조건부 요청 - If-Modified-Since(브라우저) : Last-Modified(서버)

✔️캐시 시간이 만료된 후, 데이터가 변경되지 않았을 경우

검증헤더에 대한 설명자료(1)
캐시 시간이 만료된 후 서버에 요청을 보냈지만 데이터가 변경되지 않았을 경우

 

✅클라이언트 요청

클라이언트가 서버에 HTTP 요청을 보내면서 'If-Modified-Since' 또는 'If-None-Match' 검증 헤더를 포함시킨다.

GET /example.jpg HTTP/1.1
Host: www.example.com
If-Modified-Since: Sat, 29 Oct 2022 14:19:41 GMT

 

✅서버 응답

  • 서버는 제공된 검증 헤더(If-Modified-Since 또는 If-None-Match)를 확인하여 리소스가 마지막으로 요청받은 이후 변경되었는지 검사한다.
  • 변경되지 않았다면, 서버는 데이터를 포함하지 않고 '304 Not Modified' 상태 코드와 함께 응답을 전송한다.
HTTP/1.1 304 Not Modified
Date: Sun, 30 Oct 2022 16:20:00 GMT
Last-Modified: Sat, 29 Oct 2022 14:19:41 GMT
Cache-Control: max-age=3600, must-revalidate

 

✔️If-Modified-Since(브라우저) : Last-Modified(서버)의 특징

  • 1초 미만 단위로 캐시 조정이 불가능하다.
  • 날짜 기반의 로직 사용
  • 데이터를 수정해서 날짜가 다르지만, 데이터 결과가 같은 경우
  • 서버에서 별도의 캐시 로직을 관리하고 싶은 경우(스페이스나 주석처럼 큰 영향이 없는 변경에서 캐시 유지하고 싶을 때)

 

2) 검증 헤더와 조건부 요청 - If-None-Match(브라우저) : ETag(서버)

✔️캐시 데이터와 서버 데이터가 같은지 검증

검증헤더에 대한 설명자료(2)

 

 

⭐데이터가 변경되지 않았다면, 서버는 클라이언트에게 '304 Not Modified' 응답을 보낸다.

이 응답은 실제 데이터를 전송하지 않고, 헤더만을 포함하여 클라이언트에게 리소스가 변경되지 않았다는 것을 알린다.

이를 통해 클라이언트는 캐시에 저장된 데이터를 계속 사용할 수 있다.

 

⭐데이터가 변경됐다면, 서버는 클라이언트에게 '200 OK' 응답을 보낸다.

 

✅클라이언트 요청

GET /example.png HTTP/1.1
Host: www.example.com
If-None-Match: "a1b2c3d4"

 

✅서버 응답 (304 Not Modified)

HTTP/1.1 304 Not Modified
ETag: "a1b2c3d4"
Cache-Control: max-age=3600, must-revalidate

 

✅서버 응답 (200 OK)

HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 2100
ETag: "e5f6g7h8"
Cache-Control: max-age=3600, must-revalidate

[리소스 데이터]

 

✔️If-None-Match(브라우저) : ETag(서버) 의 특징

  • ETag만 서버에 보내서 같으면 유지, 다르면 다시 받는다
  • 캐시 제어 로직을 서버에서 완전히 관리한다
  • 클라이언트는 이 값을 서버에 제공한다.
  • ex) 서버는 배타 오픈 기간인 3일 동안 파일이 변경되어도 ETag를 동일하게 유지한다. 그리고 배포 주기에 맞춰서 ETag를 모두 갱신한다.

 

3) 검증 헤더의 중요성

  • 대역폭 절약 : 데이터를 재전송하지 않기 때문에 네트워크 대역폭을 절약할 수 있다.
  • 빠른 응답 시간 : 캐시된 데이터를 재활용하여 데이터 로딩 시간이 크게 단축된다.
  • 서버 부하 감소 : 데이터를 전송하지 않아 서버 부하가 줄어든다.
728x90