[캐시 기본 동작]
• 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 됨
• 인터넷 네트워크는 매우 느리고 비쌈
• 브라우저 로딩 속도가 느림
• 캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 됨
• 비싼 네트워크 사용량을 줄일 수 있음
• 브라우저 로딩 속도가 매우 빠름
• 빠른 사용자 경험
캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신. 다시 네트워크 다운로드가 발생
캐시 유효 시간 초과해서 서버에 다시 요청하면
1. 서버에서 기존 데이터를 변경함
2. 서버에서 기존 데이터를 변경하지 않음->다시 받기 아까워
->[검증헤더와 조건부 요청]
캐시 만료후에도 서버에서 데이터를 변경하지 않으면 데이터를 전송하는 대신에 저장해 두었던 캐시를 재사용 할 수 있음. 단 클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 수 있는 방법 필요
캐시 유효 시간이 초과해도, 서버의 데이터가 갱신되지 않으면 304 Not Modified + 헤더 메타 정보만 응답(바디X)
클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신,
캐시에 저장되어 있는 데이터 재활용
=>네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드
검증헤어 : Last Modified
조건부 요청 : if-modified-since
[검증헤더와 조건부 요청]
1. 검증 헤더
• 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터
• Last-Modified , ETag
2. 조건부 요청 헤더
• 검증 헤더로 조건에 따른 분기
• If-Modified-Since: Last-Modified 사용
• If-None-Match: ETag 사용
• 조건이 만족하면 200 OK
• 조건이 만족하지 않으면 304 Not Modified
If-Modified-Since : 이후에 수정됐으면
데이터 미변경 예시
• 캐시: 2020년 11월 10일 vs 서버: 2020년 11월 10일 동일해.
변경이 안일어났으니 304(너의 캐시로 리다이렉션해라), 헤더 데이터만 전송(BODY 미포함)
전송 용량 0.1M (헤더 0.1M, 바디 1.0M)
데이터 변경 예시
• 캐시: 2020년 11월 10일 vs 서버: 2020년 11월 10일 수정이 됐으니까
200 OK, 모든 데이터 전송(BODY 포함)
전송 용량 1.1M (헤더 0.1M, 바디 1.0M)
1초미만단위는 캐시 조정 불가능, 날짜 기반의 로직이여서 전체 데이처를 다시 다운로드해,주석은 그냥 신경안쓰고 싶어
==>[ETag]
캐시용 데이터에 임의의 고유한 버전 이름을 달아둠 ex) ETag: "v1.0", ETag: "a2jiodwjekjl3"
데이터가 변경되면 이 이름을 바꾸어서 변경함(Hash를 다시 생성) ex) ETag: "aaaaa" -> ETag: "bbbbb"
진짜 단순하게 ETag만 보내서 같으면 유지, 다르면 다시 받기!
[캐시 제어 헤더] 응답코드에 다음과 같이 있으면..
1. Cache-Control: 캐시 제어
• Cache-Control: max-age 캐시 유효 시간, 초 단위
• Cache-Control: no-cache 데이터는 캐시해도 되지만, 항상 오리진 서버에 검증하고 사용
• Cache-Control: no-store 데이터에 민감한 정보가 있으므로 저장하면 안됨 (메모리에서 사용하고 최대한 빨리 삭제)
2. Pragma: 캐시 제어(하위 호환)
3.Expires: 캐시 만료일을 정확히 날짜로 지정 가능
[조건부 요청 헤더]
If-Match, If-None-Match: ETag 사용
If-Modified-Since, If-Unmodified-Since: Last-Modified 사용
[프록시 캐시]
[캐시 무효화]
이런 화면은 캐시화되면 절대 안돼! 이런경우에 사용
1. Cache-Control: no-cache, no-store, must-revalidate 다 넣어줘
2. Pragma: no-cache
'Spring 강의 > network' 카테고리의 다른 글
하루 3분 네트워크 (0) | 2022.06.22 |
---|---|
[network] - (7) HTTP 헤더1 : 일반 헤더 (0) | 2022.04.07 |
[network] - (6) HTTP 상태코드 (0) | 2022.04.07 |
[network] - (5) HTTP메서드 활용 (0) | 2022.04.05 |
[network] - (4) HTTP 메서드 (0) | 2022.04.04 |