Search
🌐

[HTTP 완벽 가이드] 7. 캐시

[HTTP 완벽 가이드] 7. 캐시
Study
Web
2023/06/0613:57
[HTTP 완벽 가이드] 7. 캐시
Study
Web
2023/06/0613:57

1. 캐시의 혜택

불필요한 데이터 전송 감소
네트워크 요금 및 비용 절감
네트워크 병목 감소
대역폭을 늘리지 않고 빠른 페이지 로딩 가능
원서버에 대한 요청을 줄여줌
서버 부하 저하 및 빠른 응답 가능
갑작스러운 요청 쇄도에 유연하게 대처 가능 (예. 수강 신청 트래픽 급증)
거리로 인한 지연 감소

2. 캐시의 적중과 부적중

캐시가 존재 O → 캐시 적중 (cache hit)
캐시가 존재 X → 캐시 부적중 (cache miss)

2.1. 재검사 (Revalidation)

신선도 검사 (HTTP 재검사)
캐시가 최신인지 서버를 통해 때대로 검사
캐시가 충분히 오래되었을 때만 재검사 진행
재검사가 필요할때 원서버에 작은 재검사 요청을 보냄
If-Modified-Since 헤더 사용
GET 요청에 해당 헤더 사용
캐시된 시간 이후 변경된 경우에만 사본을 보내달라는 의미
재검사 적중 (느린 적중)
컨텐츠가 변경 X → 서버는 304 Not Modified 응답 보냄
캐시가 신선하다고 표시 후 캐시를 클라이언트에 제공
재검사 부적중(캐시 부적중)
신선도 검사 Fail
서버 객체가 캐시 사본과 다른 경우
객체 삭제
서버 객체가 삭제된 경우 → 캐시 삭제

2.2. 캐시 적중률

적중률 40%면 웹 캐시에서 준수
문서 적중률보다 바이트 적중률이 더 의미 있음 (큰 객체 고려)

2.3. 적중과 부적중의 구분

cache hit, cache miss 구분 어려움
Date 헤더 이용
응답의 Date 헤더와 현재 시간 비교
응답의 Date 헤더 < 현재 시간 → 캐시
Age 헤더 이용

3. 캐시 토폴로지

3.1. 개인 전용 캐시 (private cache)

웹브라우저 - 개인 전용 캐시 내장
예) 인터넷 익스플로러
도구 > 인터넷 옵션 > 검색 기록 > 설정 > 파일보기 에서 캐시 컨텐츠 확인 가능
임시 파일. 연관된 URL 및 문서 만료 시각 표현
예) 구글 크롬
URL - about:cache
캐시 컨텐츠 목록 조회 가능

3.2. 공용 캐시 (public cache)

프록시 서버, 프락시 캐시
수동 프록시 지정, 프록시 자동 설정 파일 설정 등으로 브라우저가 프록시 캐시 사용 설정 가능
인터셉터 프록시 사용 → 브러우저 설정 없이 HTTP 요청이 캐시를 통하도록 강제 가능

3.3. 기타

프록시 캐시 계층 설정 가능
레벨 1 캐시 → 레벨 2 캐시
캐시망
캐시망의 프록시 캐시는 동적으로 커뮤니케이션 결정
부모 캐시 vs 캐시 우회해서 원서버 바로 갈지?

4. 캐시 처리 절차

1.
요청 받기
네트워크로부터 도착한 요청 메세지 읽음
2.
파싱
메세지 파싱하여 URL 및 헤더 추출
3.
검색
로컬 복사본 있는지 검사
사본 X → 사본을 받아와 로컬에 저장
4.
신선도 검사
캐시 사본이 충분히 신선한지 검사
신선하지 않은 경우 변경사항 체크 to server
5.
응답 생성
새로운 헤더와 캐시된 본문으로 응답 메세지 생성
캐시는 Date 헤더를 조정하면 안됨. Date 헤더는 그 객체가 원 서버에서 최초로 생겨난 일시 표현
6.
발송
네트워크를 통해 응답을 클라이언트로 반환
7.
로깅
선택사항으로, 로그파일에 트랜잭션에 대한 서술한 로그 기록 남김

5. 사본 신선하게 유지

캐시된 데이터는 서버의 데이터와 일치하게 관리 필요
HTTP
캐시된 사본과 서버가 일치하도록 유지해주는 메커니즘 존재
문서 만료와 서버 재검사

5.1. 문서 만료

특별한 헤더를 이용해 유효기간을 붙일 수 있음
Expires
절대 유효 기간 명시
해당 유효 기간 경과 시, 해당 문서는 더이상 신선하지 않다고 간주
예) Expires: Fri, Jul, 2002, 05:00:00 GMT
Cache-Control
max-age - 문서의 최대 나이.
처음 생성 된 이후 더이상 신선하지 않다고 간주될때까지 경과한 시간의 최대값 (초단위)
예) Cache-Control: max-age=484200

5.2. 서버 재검사

캐시된 문서 만료 시 서버 재검사 진행
캐시가 원 서버에게 문서가 변경되었는지의 여부를 물어보는 것을 의미
재검사 결과
컨텐츠 변경 O → 새로운 사본을 가져와 덮어씌운 후 클라이언트에 반환
컨텐츠 변경 X → 새 만료일을 포함한 새 헤더를 가져와 캐시 안의 헤더 갱신

5.3. 조건부 메서드와의 재검사

HTTP 조건부 메서드
재검사 효율적으로 만듦
캐시가 서버에게 조건부 GET 요청을 보낼 수 있게 해줌
서버가 갖고 있는 문서가 캐시가 갖고 있는 것과 다른 경우에만 객체 본문을 보내달라고 하는 것
조건부 헤더
If-Modifed-Since: <date>
If-None-Match: <tags>
If-Modifed-Since: 날짜 재검사
문서가 주어진 날짜 이후 변경된 경우
조건 참 → GET 요청 처리
새로운 만료 날짜와 다른 정보가 담긴 헤더들과 함께 새 문서가 캐시에 반환
문서가 주어진 날짜 이후 변경되지 않은 경우
조건 거짓 → 304 Not Modified 응답 메세지 클라이언트에 반환
본문은 다시 보내지 않음
Last-Modifed 서버 응답 헤더와 함께 사용
캐시된 문서 재검사 진행 시 Last-Modifed 의 날짜를 IMS 헤더에 포함
If-None-Match: 엔티티 태그 재검사
문서에 대한 일련번호와 같이 동작하는 특별한 태그 제공
해당 태그가 서버에 있는 문서 태그와 다른 경우 요청 처리
특정 문서가 일정 간격으로 다시 쓰여지지만 실제로 같은 데이터를 포함하고 있는 경우 활용 가능

5.4. 약한 검사기와 강한 검사기

약한 검사기
어느 정도 컨텐츠 변경 허용
캐시된 사본 무효화 하지 않고 문서를 살짝 고칠 수 있도록 허용하고 싶은 경우
W/ 접두사로 약한 검사기 구분
강한 검사기
컨텐츠가 바뀔때마다 바뀜
강한 엔티티 태그
엔티티 값이 바뀌면 매번 바뀌어야 함

6. 캐시 제어

문서가 만료되기전까지 얼마나 오랫동안 캐시될 수 있게 할건지 서버가 설정할 수 있는 방법 존재
Cache-Control: no-store
캐시가 응답의 사본 만드는 것을 금지
응답 전달 후 객체 삭제
Cache-Control: no-cache
로컬 저장소에 저장
다만, 먼저 서버와 재검사를 하지 않고서는 캐시에서 클라이언트 제공 불가
항상 원서버와 검증하고 사용
Cache-Control: must-revalidate
신선하지 않은 사본을 원서버와의 최초 재검사 없이는 제공해선 안됨
신선도 검사 시도시 Fail → 504 Gateway Timeout Error
Cache-Control: max-age
최대 나이 비교하여 캐시 재검사 유무 등 판단
Expires
캐시 만료 절대 시간
휴리스틱한 방법
max-age나 expires 둘다 포함하지 않는 경우 → 경험적으로 최대 나이 계산
LM 인자 알고리즘