[HTTP/Network] HTTP Header.2

dk.han·2022년 10월 7일
0
post-thumbnail

캐시와 조건부 요청

star.jpg라는 1M 크기의 이미지 파일을 요청해서 받아올 때, 캐시가 없다면, 데이터가 변경되지 않아도 계속 네트워크를 통해서 1M 크기의 이미지 파일을 다운로드해야 한다. 이런 경우 인터넷 네트워크는 매우 느리고 비싸기 때문에 브라우저 로딩 속도가 느려지고, 느린 사용자 경험을 제공하게 된다.
단점들을 해결하고자 캐시를 활용한다. 캐시를 활용하면, 캐시 가능 시간(cache-control: max-age)동안 네트워크를 사용하지 않아 네트워크 사용량을 줄이고, 브라우저 로딩 속도가 빨라져 빠른 사용자 경험을 제공할 수 있다.

1. 캐시 데이터 요청과 응답

캐시 유효 시간이 초과한 경우 서버에 다시 요청하면 두가지 상황이 나타난다.

  • 서버에서 기존 데이터를 변경하지 않은 경우.
  • 서버에서 기존 데이터를 변경한 경우.

서버에서 기존 데이터를 변경하지 않은 경우

데이터를 네트워크를 통해 다시 받아오는 것 대신에, 저장해 두었던 캐시를 재사용 할 수 있다.
단, 클라이언트의 데이터와 서버의 데이터가 같다는 사실을 확인할 수 있는 방법이 필요하다. 이때 검증 헤더와 조건부 요청을 사용해 사실 확인을 할 수 있다.

  1. 서버에서 캐시 데이터를 보내 줄 때, Last-Modified 또는 ETag 헤더를 포함시켜 보내준다

    Last-Modified, ETag (검증 헤더)

    • Last-Modified: 데이터가 마지막에 수정된 시간. ( 최종 수정일 )
    • ETag: 데이터에 임의의 고유한 버전 ( Last-Modified - if-modified-since의 단점 보완 )
    • 클라이언트는 캐시데이터를 저장 할 때, 데이터와, Last-Modified 또는 ETag 를 같이 저장한다.
  2. 캐시 유효 시간이 초과된 경우 if-modified-since 또는 If-Modified-Since 헤더를 포함해서 서버에 다시 요청을 보낸다.

    if-modified-since, If-None-Match (조건부 요청)

    • If-modified-since: 캐시에 저장 했던, 데이터 최종 수정일을 적어 보낸다.
    • If-None-Match: 캐시에 저장 했던, 데이터 버전을 적어 보낸다.
    • 서버에서 조건부 요청 헤더를 비교하여 데이터가 수정되지 여부를 확인한다.
    • 데이터가 변경되지 않은 경우, 304 Not Modified를 보내주며, HTTP body는 없다.
    • 클라이언트는 서버가 보낸 응답 헤더 정보로 캐시의 메타 정보를 갱신하여 데이터를 재사용 가능하다.
    • 네트워크 다운로드가 발생하지만, 용량이 적은 헤더 정보만 다운로드하므로 실용적인 해결책.

서버에서 기존 데이터를 변경한 경우

이 경우, 데이터가 변경되지 않았을 경우와 메커니즘은 같으나 서버 응답메시지가 다를 뿐이다. If-modified-since 또는 If-None-Match 조건부 요청 헤더를 보냈을 때, 데이터가 변경된 경우에는 200 OK와 함께 HTTP body에 변경된 데이터를 포함해서 보내주게 된다.

2. 검증 헤더와 조건부 요청 헤더

캐시 제어 헤더

  • Cache-Control
  • Cache-Control: max-age : 캐시 유효 시간, 초 단위
    • Cache-Control: no-cache : 데이터는 캐시해도 되지만, 항상 origin 서버에 검증하고 사용해라의 의미.
  • Cache-Control: no-store : 데이터에 민감한 정보가 있으므로 저장하면 안됨이라는 뜻 ( 메모리에서 사용하고 최대한 빨리 삭제하세요 의미 )
  • pragma
  • Expires
    • 캐시 만료일을 정확한 날짜로 지정하는 기능
    • 지금은 Cache-Control: max-age 권장하므로, Cache-Control: max-age와 Expires가 같이쓰이면 Expires는 무시한다.

프록시 캐시

Youtube의 origin 서버는 미국에 위치해있다. 우리가 유튜브 영상을 보기 위해서 미국에 있는 origin 서버와 네트워크 통신을 한다면, 다운로드 속도는 굉장히 느릴 것이다. 하지만 우리가 영상을 빠르게 다운로드하여 볼 수 있는 이유는 우리와 가깝게 위치한 곳에 존재하는 프록시 캐시 서버 덕분이다. 프록시 캐시 서버에서 사용하는 헤더에 대해 알아보자.

  • Cache-Control
    • Cache-Control: public : 응답이 public 캐시( 프록시 서버 )에 저장 되어도 됨을 의미.
    • Cache-Control: private : 응답이 해당 사용자만을 위한 것임을 의미, private 캐시에 저장해야 한다 ( defualt )
    • Cache-Control: s-maxage : 프록시 캐시에만 적용되는 max-age

Reference

모든 개발자를 위한 HTTP 웹 기본 지식

0개의 댓글