네트워크

HTTP 정리 - 캐시와 조건부 요청

Rudtjs 2022. 8. 19. 19:05

캐시(Cache)

 

개요

클라이언트가 서버에 자원을 요청할 때 자주 사용하는 데이터나 용량이 커서 서버의 비용 부담이 큰 경우 매 번 새로 다운로드하는 건 문제가 생길 수 있다. 

캐시는 이런 자원들을 복사해서 브라우저 캐시에 저장해 두고, 자원이 변경하지 않았다면 브라우저 캐시에서 다시 사용할 수 있는 임시 저장소이다.

 

캐시 지시어

  • Cache-Control: max-age 
    • 캐시 유효 시간동안 브라우저 캐시에 있는 자원을 이용한다. (초 단위)
  • Cache-Control: no-cache:
    • 데이터는 캐시해도 되지만, 항상 원(origin) 서버에 검증하고 사용해야 한다.
  • Cache-Control: must-revalidate
    • 캐시 만료후 최초 조회 시 Origin 서버에 검증해야 한다.
  • Pragma: no-cache 
    • HTTP 1.0에서 사용되는 하위 호환 방식의 필드

 

검증 헤더와 조건부 요청

캐시 유효 시간이 초과해도 서버의 데이터가 변경되지 않았다면, 데이터를 새로 반환하는 게 아닌 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신한다. 그러면 클라이언트는 캐시에 저장되어 있는 데이터를 재활용하게 된다.

 

1. Last-Modified / If-Modified-Since

해더에서 데이터가 마지막에 수정된 시간을 작성함으로써 두 정보를 비교해 캐시 활용 여부를 결정할 수 있다.

 

 

  1. 데이터 요청시 서버에서는 유효시간(60초)와 Last-Modified로 해당 데이터의 최종 수정일을 작성하여 보내준다.
  2. 클라이언트는 응답결과를 캐시에 저장하여 해당 데이터는 60초간은 서버에 요청하지 않고 브라우저 캐시에 저장된 데이터를 활용한다.
  3. 만약 유효시간이 만료됐다면 서버에 데이터를 요청하게 되는데 if-modified-since라는 검증 헤더에 서버로부터 받았던 Last-Modfied 날짜를 작성해서 전달한다.
  4. 서버에서 해당 데이터의 수정일과 클라이언트가 전송한 최종 수정일을 비교하여 변경이 되었을 경우 새로운 데이터를 다시 최종 수정일과 유효시간과 함께 전송하고, 변경되지 않았다면 304 Not Modified + 헤더 메타 정보만 반환하여 캐시에 저장되어 있는 데이터를 재활용한다.
Last-Modified, If-Modified-Since는 1초 미만 단위로 캐시 조정이 불가능하다.

 

2. If-None-Match / ETag

ETag(Entity Tag)라는 검증 헤더를 이용하여 서버에서 지정한 임의의 버전 이름을 달아 관리한다.

  1. 서버에서 해당 데이터의 ETag를 검증 헤더에 넣어서 반환한다. 
  2. 클라이언트는 응답 결과를 캐시에 저장한다.
  3. 해당 데이터의 유효시간(max-age)이 만료되어 다시 서버에 요청을 할 경우 저장해뒀던 ETag를 If-None-Match에 작성하여 보낸다.
  4. 서버에서는 해당 데이터의 ETag값과 전달받은 ETag값을 비교하여 같을 경우 304 Not Modified 상태 코드를 반환하고, 값이 다를 경우 ETag와 함께 200 Ok 상태 코드를 반환한다.

 

프록시 캐시

  • 클라이언트들과 서버의 거리가 너무 멀어서 응답 시간이 많이 소요될 경우 중간에 프록시 캐시 서버를 둠으로써 응답 시간을 줄이는 방식이다.
  • 클라이언트로부터 요청되는 자원에 대해 프록시 캐시 서버에서 캐시를 저장하여 제공함으로써 여러 사람이 찾는 자료일수록 이미 캐시에 등록되어 있기에 빠른 속도로 자원을 받을 수 있다.
  • 클라이언트에서 사용되는 캐시는 해당 클라이언트만 사용하기 때문에 private 캐시라 부르고 프록시 캐시 서버는 여러 클라이언트가 거쳐야 하기 때문에 public 캐시라 부른다.

 

캐시 무효화

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache

원 서버에 검증이 필요하거나 민감한 정보가 있어 저장하면 안될 경우 사용한다.

 

no-cache

  • no-cache는 항상 원 서버에 검증을 한다.
  • 원 서버에 접근할 수 없는 경우 캐시 서버 설정에 따라서 캐시 데이터를 반환할 수 있고 오류보다는 오래된 데이터라도 보여주자는 정책으로 200 OK를 응답한다.

 

must-revalidate

  • must-revalidate는 원 서버에 접속이 불가능한 경우 무조건 504 Gateway Timeout 오류를 반환한다.
  • must-revalidate는 캐시 유효시간(max-age)이 남아있다면 원 서버에 요청을 하지 않고, 캐시를 재활용한다.

 

 

출처

인터넷 네트워크 강의

'네트워크' 카테고리의 다른 글

HTTP 정리 - 상태코드와 헤더  (0) 2022.08.16
HTTP 정리 - 기본  (0) 2022.08.10
인터넷 네트워크 정리  (0) 2022.08.04