-
spring을 공부하던 중 웹 페이지에서 파일 다운로드하는 방법을 공부하고 있습니다.
소스코드를 보면
response.setHeader("Cache-Control", "no-cache");
response.addHeader("Content-disposition", "attachment; fileName=" + imageFileName);
오늘은 이 부분에 있어서 cache-control이 무엇이며 캐쉬가 무엇인지에 알아보도록 하겠습니다.
캐쉬
먼저 캐쉬란 client가 요청하는 웹 페이지, 이미지, javascript, css 등 첫 요청 시 응답에 대한 복사본(USING SPACE)을 특정 위치에 저장하게 되는데 저장에 사용되는 메커니즘이 캐쉬이다. 이후 동일한 요청이 있을 시, 불필요하게 웹 서버(응답 서버)에서 자원들을 다시 내려받지 않고 특정 위치에 저장된 캐쉬를 이용해 자원을 접근하게 되며 서버를 통해 내려받는 양이 적어지니 응답 시간과 트래픽이 감소하게 됩니다.
그럼 HTTP 캐쉬는 뭐가 다를까요?
브라우저가 웹 페이지 구성요소를(응답받은 웹 페이지나, 이미지)를 PC의 hard disk에 저장한다. 이 캐쉬는 client와 server사이에 위치해 기능을 수행합니다.
특정 위치란?
1. Browser cache
웹브라우저(safari, chrome 등등) 혹은 HTTP 요청을 하는 클라이언트 어플리케이션들이 내부적으로 갖고 있는 캐쉬
2. Proxy cache
실제 서버가 있는 곳이 아닌 네트워크 관리자에 의해 네트워크상에 설치되는 캐쉬.
일반적으로 큰 회사나 ISP의 방화벽에 설치된다.
shared cache의 일종으로 많은 수의 사용자들에 의해 공유되어 사용된다. 이는 지연시간과 트래픽을 줄이는데 효과적.
3. Gateway cache
네트워크상에 설치되지 않고 실제 서버의 관리자에 의해 설치 및 운용된다.
실제 서버의 앞단에 설치되어 요청에 대한 캐쉬 및 효율적인 분배를 통해 서버의 응답 성능을 좋게 한다.
로드밸런서 등을 사용해서 실제 서버가 아닌 gateway cache로 요청을 reroute 한다.
그렇다면 어떻게 캐쉬를 컨트롤할까?
HTTP headers를 사용하는 방법으로 캐쉬를 컨트롤할 수 있습니다. response.setHeader("Cache-Control", "no-cache") 처럼 말이죠.
먼저 HTTP headers의 구성요소는 다음과 같습니다.
validation : 파일이 이전과 비교하여 변경되었는지 확인
freshness : 캐쉬의 만료 여부를 체크함
따라서 현재 사용되고 있는 HTTP1.1버전은 캐쉬 만료를 request,response 객체에 헤더 값 cache-control을 통해 관리할 수 있다는 뜻입니다.
그렇다면 Cache_Control에 어떤 값을 설정할 수 있는지 알아볼까요?
따라서 제가 의문을 가지고 있었던 response.setHeader("Cache-Control", "no-cache")는 캐쉬를 저장하고 사용하지만, 원 서버(origin server)에유효성을 검증해야 사용이 가능하단 걸 알았습니다.
이해를 돕기 위해 그림을 하나 더 가지고 왔습니다.
시나리오
1. response객체(요청의 응답) 재사용을 안 하고 싶을 경우, response.setHeader("Cache-Control", "no-store")
2.response객체(요청의 응답) 재사용 가능하지만, 각 시간마다 유효성 검사를 받아야 할 경우 response.setHeader("Cache-Control", "no-cache")
3. 특정 client에게만 캐쉬 할 경우 private, 응답이 어떤 캐시에 의해서든 캐시 되는 것을 설정하려면 public을 명시적으로 선언해줍니다.
그 외 만료시간 등 여러 옵션이 존재하는 것을 알 수 있습니다.
출처
www.letmecompile.com/http-cache-튜토리얼/
developer.mozilla.org/ko/docs/Web/HTTP/Headers/Cache-Control#Browser_compatibility
'CS > 네트워크' 카테고리의 다른 글
재요청시 캐쉬는 어떻게 작동할까? (0) 2020.12.27