Search

HTTP 캐시 헤더

생성일
2023/07/26 04:07
태그

웹 브라우저의 캐시

운영체제에서의 캐시(Cache)는 주기억 장치에서 자주 사용되는 데이터를 임시 저장소에 저장해두고 빠르게 액세스하여 사용하는 기술이다.
임시 저장소에 저장해두고 빠르게 액세스하여 처리 속도를 높인다는 캐시 개념을 인터넷에 적용하여, HTTP에서 제공하는 Cache-Control 헤더를 사용하여 서버의 부하와 네트워크 트래픽을 줄일 수 있다.

HTTP 캐시 제어

Cache-Contorl 헤더
캐시의 생명 주기를 명시하는 응답 헤더
max-age : 캐시 유효 시간(초 단위)
no-cache : 데이터는 캐싱해도 되지만, 항상 Origin 서버에 검증 후 사용
no-store : 데이터에 민감한 정보가 포함되어 있어 저장하지 말고 사용 후 빠르게 삭제
public : public 캐시(프록시 캐시 서버)에 저장 가능
private : public 캐시에 저장 불가
s-maxage : 프록시 캐시 서버에서의 유효 시간(초 단위)
Age : Origin 서버의 응답이 프록시 캐시 서버에 머문 시간(초 단위)
must-revalidate : 캐시 만료 후 최초 조회 시 Origin 서버에 검증 필요
Expires 헤더
캐시 만료일을 정확한 날짜로 지정하는 헤더로, 현재는 Cache-Control: max-age가 더 권장되어 잘 사용되지 않는다.
Cache-Control: max-age와 함께 사용되면 Expires는 무시된다.
Last-Modified 헤더
데이터의 최종 수정 시각을 명시하며 If-Modified-Since 요청 헤더와 함께 사용된다.
클라이언트가 캐시 유효 시간이 초과된 데이터를 요청할 필요가 있는 경우, 캐시에 저장되어 있는 Last-Modified 헤더의 시각을 기준으로 If-Modified-Since 헤더를 보내 데이터 변경 여부를 확인한다.
데이터가 변경되지 않았다면 서버에서 304 Not Modified에 바디 없이 헤더 메타 정보만 담아 응답을 보낸다.
데이터가 변경되었다면 200 OK로 새로운 데이터를 바디에 담아 응답을 보낸다.
ETag 헤더
데이터 버전의 이름이나 해시값과 같은 문자열을 통해, 리소스의 버전을 식별하는 고유 식별자이다.
서버에서 파일이 변경될 때마다 ETag 값을 새로 생성하고 이전 ETag 값을 보관한다. 클라이언트에서 보낸 ETag 값이 다르다면 데이터를 새로 보내고 아니라면 그대로 유지하도록 한다.
데이터 변경 없이 수정 날짜만 바뀌어도 클라이언트에서 요청 시에 데이터를 다시 보내는 Last-Modified 헤더의 한계를 극복하기 위한 리소스 검증 헤더이다. 주석 변경이나 파일 변경 후 롤백과 같은 경우에 새로 데이터를 보내지 않으며 베타 테스트 중 ETag 업데이트를 하지 않고 배포 시에 업데이트하는 상황에서 사용된다.
If-None-Match 요청 헤더와 함께 사용된다.

no-cache vs must-revalidate

아래 그림과 같이 원서버와 프록시 캐시 서버가 존재하는 경우에서 원서버와 프록시 캐시 서버 간의 연결이 끊기는 상황을 가정해보자.
no-cache의 경우에는 프록시 서버의 정책에 따라 이미 저장되어있던 오래된 캐시 데이터를 반환하거나 캐시 데이터가 없다고 응답할 수있다.
must-revalidate의 경우에는 원서버의 검증을 꼭 해야하기 때문에 클라이언트에 504 Gateway Timeout을 보내게 된다.