Java Spring

HTTP ) 헤더2 - ( 캐시 , 조건부 헤더, 프록시캐시 )

Machine_웅 2025. 2. 12. 14:14
728x90
반응형

캐시의 기본동작

 

캐시가 없는 경우

• 데이터가 변경되지 않아도 계속 네트워크를 통해서 데이터를 다운로드 받아야 한다.
• 인터넷 네트워크는 매우 느리고 비싸다.
• 브라우저 로딩 속도가 느리다.
• 느린 사용자 경험

 

 

캐시가 있는 경우

캐시 덕분에 캐시 가능 시간동안 네트워크를 사용하지 않아도 된다.
• 비싼 네트워크 사용량을 줄일 수 있다.
• 브라우저 로딩 속도가 매우 빠르다.
• 빠른 사용자 경험

 

 

캐시 유효시간이 초과한경우

캐시 유효 시간이 초과하면, 서버를 통해 데이터를 다시 조회하고, 캐시를 갱신한다.
• 이때 다시 네트워크 다운로드가 발생한다.

 


 

 

 

 

중요

304 NOT Modified 로 응답을 보낸다.

Http 바디가 없다 

 

 

 

 

 


 

[ 검증 헤더와 조건부 요청 ]

 

검증 헤더
• 캐시 데이터와 서버 데이터가 같은지 검증하는 데이터
• 방법 : Last-Modified , ETag


조건부 요청 헤더
• 검증 헤더로 조건에 따른 분기
• If-Modified-Since: Last-Modified 사용
• If-None-Match: ETag 사용
• 조건이 만족하면 200 OK
• 조건이 만족하지 않으면 304 Not Modified

 

 

예시

 If-Modified-Since: 이후에 데이터가 수정되었으면?
    • 데이터 미변경 예시
          • 캐시: 2020년 11월 10일 10:00:00 vs 서버: 2020년 11월 10일 10:00:00
         304 Not Modified, 헤더 데이터만 전송(BODY 미포함), 요청한곳으로 리다이렉션
          • 전송 용량 0.1M (헤더 0.1M)


     • 데이터 변경 예시
          • 캐시: 2020년 11월 10일 10:00:00 vs 서버: 2020년 11월 10일 11:00:00
          • 200 OK, 모든 데이터 전송(BODY 포함)
          • 전송 용량 1.1M (헤더 0.1M, 바디 1.0M)

 

Last-Modified, If-Modified-Since 단점

• 1초 미만(0.x초) 단위로 캐시 조정이 불가능
• 날짜 기반의 로직 사용
• 데이터를 수정해서 날짜가 다르지만, 같은 데이터를 수정해서 데이터 결과가 똑같은 경우
• 서버에서 별도의 캐시 로직을 관리하고 싶은 경우
    • 예) 스페이스나 주석처럼 크게 영향이 없는 변경에서 캐시를 유지하고 싶은 경우

 

 

 임의로 로직을 관리하싶은경우에는 ETag, If-None-Match로 캐시 메커니즘을 사용 


ETag, If-None-Match

• ETag(Entity Tag)
• 캐시용 데이터에 임의의 고유한 버전 이름을 달아둠
• 예) ETag: "v1.0", ETag: "a2jiodwjekjl3"
• 데이터가 변경되면 이 이름을 바꾸어서 변경함(Hash를 다시 생성)
• 예) ETag: "aaaaa" -> ETag: "bbbbb"
• 진짜 단순하게 ETag만 보내서 같으면 유지, 다르면 다시 받기!

 

 


캐시 제어 헤더

중요

no-cache   =>   데이터는 캐시를 해도되는데, 항상 서버에서 검증을 받고 써라

 

 

 

 

 

pragma 와 expires는 잘사용하지 않는다.

 

정리 


 

 

 

 

 

 


캐시 무효화

 

 

 

원서버에서 접근 할수 없는 경우 항상 오류를 반환한다라는 것에서 차이가 있다.

728x90
반응형