코드 저장소

공부에는 끝이 없다!

HTTP

HTTP - 캐시와 조건부 요청(1)

VarcharC2K 2024. 5. 1. 22:23

캐시란?

1MB 정도의 크기를 하진 이미지 파일을 요청한다고 생각해보자.

캐시가 없다면 HTTP 헤더라 0.1MB 바디가 1.0MB로 총 1.1MB의 응답이 전송되었다.

그런데 같은 요청을 똑같이 반복해서 보낼때 또다시 1.1MB의 응답 메시지를 만들어 서버가 전송하게 될 것이다.

이런 경우 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.

인터넷 네트워크는 매우 느리고 비싸고 브라우저 로딩 속도가 느리기 때문에 사용자가 느린 환경에서 작업을 하게 될 것이다.

 

그럼 캐시를 적용하면 어떻게 될까?

브라우저가 서버로 이미지를 요청하면 cache-control 헤더를 통해 캐시를 제어할 수 있다.

max-age옵션을 이용하면 해당 캐시의 라이프 사이클을 제어 할 수 있는데, 예를들어 

cache-control: max-age=60으로 하게되면 60초동안 해당 캐시가 유효하게 된다.

이렇게 캐시가 적용되면 해당 응답메시지의 결과를 브라우저 캐시에 저장하게 된다.

그러면 같은 요청을 다시 보내는 경우 캐시 유효 시간을 검증하고 캐시가 살아있으면 캐시에서 바로 조회가 가능하게 된다.

즉, 네트워크를 사용하지 않으므로 빠른 사용자 경험을 가지게 된다.

우리가 웹 브라우저에서 한번 들어갔던 페이지를 다시 들어가는 경우 로딩이 빠르다고 느끼는 것은 바로 이런 캐시 기능 덕분이다.

 

그럼 캐시 시간이 초과된 경우는 어떻게 될까?

캐시 유효 시간이 넘어서면 당연히 브라우저는 서버로 다시 요청을 하게 된다.

물론 서버에서 받은 응답 결과를 다시 캐시에 저장해두고 캐시 유효 시간동안 사용하게 된다.

그런데 생각해보면 해당 이미지는 크게 변하지 않을 텐데 캐시 유효시간에 따라 또 다운로드 하게 되면 불필요하게 네트워크를 사용한다는 불편함이 존재한다.

위를 해결하기 위하여 나온것이 검증 헤더와 조건부 요청이라는 것이다.


검증 헤더와 조건부 요청

앞서 말한것 처럼 캐시 유효 시간 초과로 서버에 요청을 하게 되면 다음과 같은 2가지 상황이 나타난다.

  1. 서버에서 기존 데이터를 변경함
  2. 서버에서 기존 데이터를 변경하지 않음

1번 상황인 경우 실제로 데이터가 변경된 경우이므로 새로 응답을 받아서 갱신하는 것이 당연할 것이다.

하지만 실제로는 2번의 경우처럼 기존 데이터가 변경되지 않은 경우가 더 많을 것이다.

그럼 이것을 처음부터 모두 다운로드 받을 필요성이 있을까?라는 것에서 부터 시작하게 된 것이 검증헤더와 조건부 요청이다.

그렇다면 캐시 만료후에 서버에서 데이터를 변경하지 않은 경우 어떤 방법을 사용할 수 있을까?

생각해 보면 데이터를 전송하는 대신 저장해 두었던 캐시를 재사용한다면 서버에서 다운로드 받을 필요가 없어질 것이다.

단, 이렇게 하려면 클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 수 있는 방법이 필요하다.

이때 사용되는 것이 바로 검증 헤더와 조건부 요청이다.

어떻게 사용되는가?

검증헤더는 Last-Modified라는 헤더를 추가하여 사용할 수 있다.

해당 헤더는 마지막으로 데이터가 수정된 최종 수정일을 말한다.

이 헤더가 추가된 경우 브라우저는 응답 결과를 캐시에 저장하면서 데이터의 최종 수정일을 함께 기록한다.

그 후에 캐시 시간 초과로 다시 서버에 요청을 보내는 경우 if-modified-since라는 요청헤더를 데이터 최종 수정일과 함께 보낸다.

그러면 서버는 요청받은 헤더를 확인하여 서버의 데이터 수정일과 같은 경우 데이터가 아직 수정되지 않았다는 것을 검증할 수 있게 되는 것이다.

 

수정이 안된 경우 서버는 Http 응답을 만들면서 304 Not Modified를 보내면서 Http Body가 없는 응답 메시지를 보낸다.

그렇다면 앞서 설명했듯 헤더가 0.1MB, 바디가 1MB인 경우 원래 1.1MB의 응답 메시지를 0.1MB만 사용해서 보낼 수 있게 되는 것이다.

당연히 용량이 줄어들었으므로 네트워크 부하도 줄고 전송 속도도 빨라지게 된다.

 

정리해 보자면 검증 헤더는 Last-Modified, 조건부 요청은 if- modified-since 헤더를 말한다.

이렇게 헤더 2개를 통하여 캐시 유효 시간이 초과해도 304 Not Modified와 헤더 메타 정보만 응답하여 클라이언트가 캐시에 저장되어 있는 데이터를 재활용 하게 만들어 네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드 받게 하여 네트워크 부하를 줄이고 속도를 높이는 메커니즘을 가지게 되는 것이다.

 

'HTTP' 카테고리의 다른 글

HTTP - HTTP 일반헤더와 쿠키  (0) 2024.04.30
HTTP - HTTP 일반 헤더(3)  (1) 2024.01.23
HTTP - HTTP 일반 헤더(2)  (0) 2024.01.23
HTTP - HTTP 일반 헤더(1)  (0) 2024.01.19
HTTP - HTTP 상태코드 (2)  (0) 2024.01.17