캐시(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
해더에서 데이터가 마지막에 수정된 시간을 작성함으로써 두 정보를 비교해 캐시 활용 여부를 결정할 수 있다.
- 데이터 요청시 서버에서는 유효시간(60초)와 Last-Modified로 해당 데이터의 최종 수정일을 작성하여 보내준다.
- 클라이언트는 응답결과를 캐시에 저장하여 해당 데이터는 60초간은 서버에 요청하지 않고 브라우저 캐시에 저장된 데이터를 활용한다.
- 만약 유효시간이 만료됐다면 서버에 데이터를 요청하게 되는데 if-modified-since라는 검증 헤더에 서버로부터 받았던 Last-Modfied 날짜를 작성해서 전달한다.
- 서버에서 해당 데이터의 수정일과 클라이언트가 전송한 최종 수정일을 비교하여 변경이 되었을 경우 새로운 데이터를 다시 최종 수정일과 유효시간과 함께 전송하고, 변경되지 않았다면 304 Not Modified + 헤더 메타 정보만 반환하여 캐시에 저장되어 있는 데이터를 재활용한다.
Last-Modified, If-Modified-Since는 1초 미만 단위로 캐시 조정이 불가능하다.
2. If-None-Match / ETag
ETag(Entity Tag)라는 검증 헤더를 이용하여 서버에서 지정한 임의의 버전 이름을 달아 관리한다.
- 서버에서 해당 데이터의 ETag를 검증 헤더에 넣어서 반환한다.
- 클라이언트는 응답 결과를 캐시에 저장한다.
- 해당 데이터의 유효시간(max-age)이 만료되어 다시 서버에 요청을 할 경우 저장해뒀던 ETag를 If-None-Match에 작성하여 보낸다.
- 서버에서는 해당 데이터의 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 |