Cache
1. 개요
1) 캐시가 없다면?
(1) 데이터 변경이 없어도 계속해서 데이터를 내려받아야함
- 네트워크는 느리고 비싼데 계속해서 데이터를 받는다?
- 브라우저 로딩 속도도 느린데 계속해서 데이터를 받는다고?
- 불편해!
2) 적용
(1) HTTP header에 cache를 유효시간을 포함하여 세팅
(2) 최초 요청 시 네트워크를 통해 cache 정보를 내려받아 browser cache에 저장
(3) 재요청 시 browser cache 를 뒤져서 체크하여 cache 정보 가져옴
(4) 네트워크를 사용하지 않아도 되고 빠름
(5) cache 설정 시 지정한 유효시간이 초과되면 cache에 데이터가 없으므로 다시 cache를 browser cache에 덮음
3) 의문: cache가 만료됐어도 내려받을 정보에 변화가 없다면? 근데 다시 내려받는다? 흠...
2. 검증 header와 조건부 요청
1) cache가 만료됐어도 내려받을 정보에 변화가 없다는 걸 확인할 수 있다?
(1) Last-Modified: 최종 수정일을 기록할 수 있음
(2) 유효 시간이 지나면 request를 보낼 때 if-modified-since message를 붙여서 server에 넘김
(3) server 내 데이터 최종 수정일을 확인, 검증하여 판단할 수 있음
2) 검증 header: server data와 cache data가 같은지 검증, 검증 header로 조건에 따른 분기 처리 가능
(1) Last-Modified
- If-Modified-Since / If-Unmodified-Since
(2) ETag
- If-None-Match / If-Match
3) Last-Modified 사용 시 단점
(1) 1초 미만 단위로 cache 조정이 불가능
(2) 날짜 기반의 로직을 사용하여 날짜는 다르지만, 같은 데이터를 수정하여 데이터 결과가 같은 경우는 구별 못함
(3) ETag는 cache 데이터에 임의로 고유한 버전을 달아둬서 비교
3. cache-control
1) cache-control: max-age: 초단위의 유효시간
2) cache-control: no-cache: 데이터를 cache에 저장해도 되지만, 항상 origin server와 검증을 거친 후 사용
3) cache-control: no-store: 데이터에 민감정보가 있으므로 저장하면 안됨
4. pragma
1) 하위 호환으로 cache를 제어
2) cache를 내보내기 전에 server에 요청하여 유효성 검사를 강제
3) no-cache 속성과 같은 효과
5. expires: cache 만료일을 지정
1) cache-control:max-age 권장 -> expires 무시됨
6. proxy cache
1) origin server: 실제 원본 data가 있는 곳
2) proxy cache server를 도입하여 DNS server에 요청이 오면 origin server로 바로 가는 것이 아니다
(1) 빠른 응답시간 확보를 위해 proxy cache server로 이동하여 data를 가져옴
3) cache-control
(1) public: response를 pulbic cache에 담아도 됨
(2) private: 해당 사용자만을 위한 response로 default
(3) s-maxage: proxt cache에만 적용되는 maxage 지정
7. cache 무효화: cache-control 무효화 response
1) no-cache: 항상 origin server data와 검증하고 사용
2) no-store: 저장하면 안되는 민감 정보가 포함됨
3) must-revalidate
(1) cache 만료 후 최초 조회 시 origin server 검증이 필요함
(2) origin server 접근 실패 시 504 error(gateway timeout) 발생
(3) cache가 만료되지 않았다면 cache내 data를 사용
4) pragma: no-cache -> http 1.0 하위 호환