728x90

캐시(cache)란 ?

캐시는 컴퓨터 시스템의 성능을 향상시키고 데이터 접근 속도를 개선하기 위해 사용되는 중간 저장소입니다. 캐시는 이전에 접근한 데이터나 결과를 임시로 저장하여 동일한 데이터에 대한 다시 접근 시 원본 데이터를 다시 가져오지 않고 캐시에서 빠르게 반환함으로써 시스템 성능을 향상시킵니다.

캐시의 기본 동작은 다음과 같습니다:

  1. 요청된 데이터 접근 : 클라이언트나 애플리케이션에서 어떤 데이터를 요청합니다.
  2. 캐시 검사 : 요청된 데이터가 캐시에 이미 저장되어 있는지 확인합니다.
  3. 캐시에 데이터가 있을 경우: 요청된 데이터가 캐시에 저장되어 있으면, 원본 데이터를 다시 가져오지 않고 캐시에서 데이터를 반환합니다. 이로 인해 데이터 접근 속도가 빨라집니다.
  4. 캐시에 데이터가 없을 경우: 요청된 데이터가 캐시에 저장되어 있지 않으면, 원본 데이터를 가져와서 캐시에 저장한 후에 클라이언트에 반환합니다. 이후 동일한 데이터에 대한 요청이 들어오면 캐시에서 데이터를 반환하게 됩니다.

요청 메세지를 보낼 때, cache-control : max-age=60으로 60초의 시간동안은 요청 받았던 파일이나 이미지 등을 브라우저 캐시에 보관합니다. 이 후, 같은 파일의 요청메세지가 GET메서드로 오면, 캐시에 저장해두었던 응답결과로 반환합니다. 캐시 유효 시간이 초과했는데, 동일한 데이터를 요청한다면 서버를 통해 데이터를 다시 조회하고 캐시를 갱신합니다. 이 때, 다시 네트워크 다운로드가 발생하는 비효율 적인 상황이 발생합니다.

📋 검증 헤더와 조건부 요청

해당 사항을 해결할 수 있는 방법이 검증 헤더 , 조건부 요청 입니다. 

검증 헤더와 조건부 요청은 HTTP 요청과 응답에 사용되는 기능으로, 웹 서버와 클라이언트 간의 효율적인 통신을 도와줍니다. 이를 통해 불필요한 데이터 전송을 줄이고 네트워크 부하를 감소시킬 수 있습니다.

  1. 검증 헤더(Validation Headers) : 검증 헤더는 서버가 리소스(예: 웹 페이지, 이미지, 동영상 등)의 변경 여부를 클라이언트에게 알려주는 역할을 합니다. 클라이언트는 이 헤더를 통해 리소스를 캐시하고, 이후 동일한 리소스에 대한 요청 시 서버로부터 리소스의 변경 여부를 확인합니다.동작 원리는 다음과 같습니다

    주요 검증 헤더
    👉 Last-Modified : HTTP 응답 헤더 중 하나로, 웹 서버가 특정 리소스의 최종 수정 시간을 클라이언트에게 알려주는 역할을 합니다. 이 헤더는 클라이언트가 해당 리소스를 다시 요청할 때, 서버가 리소스의 변경 여부를 확인하는 데 사용됩니다.

    1. 웹 서버는 특정 리소스에 대한 요청이 들어올 때, 해당 리소스의 최종 수정 시간을 계산합니다.
    2. Last-Modified 헤더에 이 최종 수정 시간을 포맷에 맞추어 기록하여 HTTP 응답으로 클라이언트에게 전달합니다.
    3. 클라이언트는 해당 리소스를 다시 요청할 때, If-Modified-Since 헤더를 함께 보내서 서버에게 해당 리소스의 변경 여부를 질의합니다.
    4. 서버는 If-Modified-Since 헤더에 포함된 시간과 리소스의 최종 수정 시간을 비교하여 리소스의 변경 여부를 판단합니다.
      • If-Modified-Since의 시간보다 최종 수정 시간이 이후라면, 리소스가 변경되었다는 의미로 200 OK 응답과 함께 실제 데이터를 보냅니다.
      • If-Modified-Since의 시간과 최종 수정 시간이 동일하거나 이전이라면, 리소스가 변경되지 않았다는 의미로 304 Not Modified 응답 헤더만을 반환하고, 실제 데이터 Body에 포함하지 않습니다.

    네트워크 다운로드가 발생하지만 용량이 적은 헤더 정보만 다운로드가 되며, 클라이언트는 캐시에 저장되어 있는 데이터를 재활용 할 수 있습니다. 브라우저에서 파일 1개를 클릭한 후 , 해당 브라우저에서 아무런 실행 없이 새로고침을 해보면 status가 304임을 확인할 수 있습니다.

 

304로 응답이 왔다는 것은 요청 메세지 Request 시 if-modified-since 을 작성해서 보낸 것을 의미합니다. 해당 시간이 적힌 이후로의 데이터변경이 없음을 의미하므로 요청한 데이터와 동일한 데이터가 쿠키에 있기 때문에 새로이 응답 메세지를 보낸 것이 아니라 캐시에 보관되어 있던 응답 메세지를 보낸 것입니다.

 

👉 ETag (Entity Tag) : 리소스의 고유한 식별자를 나타내는 문자열로, 리소스가 변경되면 변경된 ETag 값을 반환합니다. 이 식별자는 해당 리소스의 내용이 변경되었는지를 클라이언트가 확인하는 데 사용됩니다.

동작 원리는 다음과 같습니다:

  1. 웹 서버는 특정 리소스의 데이터를 해시 함수 등을 사용하여 유일한 식별자를 생성합니다.
  2. ETag 헤더에 이 식별자를 포맷에 맞추어 기록하여 HTTP 응답으로 클라이언트에게 전달합니다.
  3. 클라이언트는 해당 리소스를 다시 요청할 때, If-None-Match 헤더를 함께 보내서 서버에게 해당 리소스의 변경 여부를 질의합니다.
  4. 서버는 If-None-Match 헤더에 포함된 식별자와 현재 리소스의 식별자를 비교하여 리소스의 변경 여부를 판단합니다.
    • If-None-Match의 식별자와 현재 리소스의 식별자가 일치하지 않으면, 리소스가 변경되었다는 의미로 200 OK 응답과 함께 실제 데이터를 보냅니다.
    • If-None-Match의 식별자와 현재 리소스의 식별자가 동일하면, 리소스가 변경되지 않았다는 의미로 304 Not Modified 응답을 반환하고, 실제 데이터를 포함하지 않습니다.

 

 

캐시는 주로 웹 브라우저, 웹 서버, 프록시 서버 등에서 사용되며, 웹 페이지의 이미지, 스타일 시트, 스크립트 파일 등을 캐시하여 사용자에게 빠른 웹 페이지 로딩 속도를 제공하는 데 활용됩니다. 또한, 데이터베이스 쿼리 결과나 API 응답 결과 등을 캐시하여 데이터 접근 속도를 개선하는 데에도 활용됩니다.


캐시 제어 (cache-control)이란?

캐시 제어 헤더HTTP 응답과 요청에 포함되어 캐시 동작을 제어하는데 사용되는 헤더들을 말합니다. 이러한 헤더들을 이용하여 클라이언트와 서버 간의 캐시 동작을 조정하고, 캐시의 적용 범위와 지속 시간 등을 설정할 수 있습니다.

  1. Cache-Control: 캐시 동작을 설정합니다. 주요 지시자로는 public, private, no-cache, max-age, s-maxage 등이 있습니다.
    Cache-control : max-age → 캐시가 어느 기간동안 유효한지를 입력합니다. 단위는 초 단위 입니다.
    Cache-control : no-cache → 캐시를 사용하지 않도록 지시하는 지시자 입니다. HTTP 응답의 Cache-Control 헤더에서 사용되며, 이 지시자가 포함된 경우 클라이언트와 중개 서버는 응답을 캐시하지 않고 매번 원본 서버에 검증하여 새로운 응답을 가져옵니다.
    Cache-control : no-store → 캐시를 완전히 비활성화하는 캐시 제어 지시자 no-store 지시자가 포함된 응답은 민감한 정보나 개인 정보와 같이 보안상 민감한 데이터를 포함하는 경우 사용됩니다. 따라서 no-store 지시자는 이러한 상황에서 캐시를 사용하지 않도록 지시하여 보안을 강화합니다.
    Cache-control : must-revalidate → 캐시된 데이터가 유효한지 원본 서버와 검증을 수행해야 합니다. 원 서버 접근 실패 시 반드시 오류가 발생해야 합니다. (504-Gateway Timeout) 캐시된 데이터를 사용하기 전에 원본 서버와 검증을 거쳐야 하며, 만료된 후 최초 조회 시 반드시 원본 서버에 검증 후 새로운 데이터를 가져와서 사용합니다.
  2. Pragma: 캐시 동작을 설정하는데 사용되지만, 일반적으로 사용되지 않으며 Cache-Control 헤더를 대신 사용합니다.
  3. Expires (하위 호환) : 캐시 만료 시간을 설정합니다. 정확한 날짜로 지정해야 하고, max-age와 expires가 같이 쓰이면 expires는 무시됩니다. 응답이 해당 시간 이후에는 더 이상 캐시를 사용하지 않고 서버에 재요청합니다. 하지만 이 헤더는 오래된 방식이므로 Cache-Control의 max-age를 더 권장합니다.

 

 

프록시 캐시란?

프록시 캐시라이언트와 서버 사이에 위치하여 클라이언트의 요청을 대신 받아서 서버로 전달하고, 서버의 응답을 클라이언트에게 전달하는 역할을 하는 중개 서버입니다. 이러한 프록시 서버는 원격 서버와 클라이언트 간의 통신을 중개하며, 캐시를 사용하여 네트워크 트래픽을 줄이고 응답 속도를 향상시킵니다.

 

 

프록시 캐시는 서버로부터 받은 응답을 캐시에 저장하여 동일한 요청이 들어올 경우 새로운 요청을 서버로 전달하지 않고 캐시된 응답을 클라이언트에게 바로 제공합니다. 이렇게 함으로써 원격 서버에 불필요한 요청을 줄이고, 클라이언트의 요청에 더 빠르게 응답할 수 있습니다.

이렇게 함으로써, 동일한 요청이 반복되거나 여러 클라이언트가 동일한 리소스를 요청할 경우, 프록시 서버는 원격 서버에 대한 중복 요청을 줄여 네트워크 트래픽을 최소화하고 응답 속도를 향상시킵니다. 또한 프록시 캐시는 웹 서버의 부하를 감소시키고 클라이언트에게 빠른 응답을 제공하여 사용자 경험을 향상시킵니다.

여러 사람이 찾은 자료일수록 이미 캐시에 등록되어 있기에 빠른 속도로 자료를 가져올 수 있습니다. 이는 같은 국내에 있기에 원서버에 접근하는 것보다 훨씬 빠른 속도에 자료를 가져올 수 있기 때문입니다. 이 때 클라이언트에서 사용하고 저장하는 캐시를 private 캐시라 하며 프록시 캐시 서버의 캐시를 public 캐시라 합니다.

 

 

💥 캐시 무효화

캐시 무효화(Cache Invalidation)란, 캐시에 저장된 데이터가 유효하지 않아서 더 이상 사용해서는 안 된다는 표시를 내리는 과정을 말합니다. 캐시는 원본 서버의 데이터를 저장하여 클라이언트에게 빠르게 응답을 제공하는데 사용되지만, 원본 데이터가 변경되거나 삭제되었을 때 캐시에 저장된 데이터가 더 이상 유효하지 않게 될 수 있습니다. 이때 캐시 무효화를 통해 클라이언트가 더 이상 캐시된 데이터를 사용하지 않도록 하고, 새로운 데이터를 다시 원본 서버에서 가져와서 캐시를 업데이트하는 작업이 필요합니다.

728x90
반응형

'[HTTP]' 카테고리의 다른 글

[HTTP] HTTP 헤더 정보  (0) 2023.07.30
[HTTP] HTTP 헤더  (0) 2023.07.27
[HTTP] HTTP 상태 코드  (0) 2023.07.26
[HTTP] HTTP 메서드의 속성  (0) 2023.07.15
[HTTP] Resource & HTTP 메서드  (0) 2023.07.07

+ Recent posts