Hama Develop

필요한 것만 보내줘, 조건부 HTTP

July 18, 2021

참고자료: https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests

HTTP 요청은 서버와 클라이언트가 소통하기 위해 사용된다.

클라이언트가 HTTP 형식으로 리소스를 요청하면 서버는 HTTP 형식으로 응답을 한다.

매우 간단한 구조 이지만 이 사이에는 다양항 상호 작용이 일어나게 된다.

이번 포스팅에서 다루어 볼 내용은 HTTP 요건을 조건부로 하는 상황에 대한 내용이다. 이러한 요청을 HTTP 조건부 요청이라 한다.

조건부 요청은 리소스의 변화를 파악하기 위한 요청이다.

조건부 요청이 가장 흔하게 사용되는 곳은 캐시다. 브라우저가 리소스가 필요할 때 항상 서버에게 요청을 하지는 않는다. 몇몇 리소스는 캐시로 자체 저장을 하고 있다 .

서버에서 돌아온 응답의 cache-control 헤더에 따라서 리소스를 캐싱 하는 것이다. 쉽게 말하면 서버에서 어떤 응답은 캐시로 가지고 있어도 되는지 알려 주는 것이다. (더 자세한 내용은 https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Cache-Control 을 참고)

캐시된 리소스가 더이상 신선하지 않다고 판단되는 경우(언제 신선하지 않아 지는지는 헤더에 명시되어 있다.) 더이상 그 리소스를 사용하지 않고 서버에 조건부 HTTP 요청을 보낸다.

바뀌었으면 바뀐 걸 주고 안 바뀌었으면 안바뀌었다고 알려주라는 요청이다.

Last-ModifiedETag 로 리소스의 변화를 체크한다.

어떻게 리소스가 바뀌었는지 알고 서버에서는 응답을 해 줄 수 있는 것일까? Last-Modified는 리소스가 언제 수정 되었는지를 나타낸다. 특정 시점 이후로 리소스가 바뀌었을 경우 바뀐 것으로 판단한다. ETag 는 리소스의 지문이다. 특정 버젼 마다 태그를 달고 태그의 변화가 있었는지를 분간해 리소스가 바뀐 것을 판단한다.

이를 validator 라 한다.

요청 헤더에 따라 다른 방식으로 처리를 한다.

클라이언트가 헤더에 어떤 요청을 넣었는지에 따라 서버의 일처리가 달라진다.

  • if-Match

    • 서버자원의 ETag가 이 헤더에 나열된 값들 중 하나와 일치한다면 성공이다.
  • if-None-Match

    • 서버자원의 ETag가 이 헤더에 나열된 값들중 어느 것도 일치 하지 않으면 성공이다.
  • If-Modified-Since

    • 서버 자원의 Last-Modified 날짜가 이 헤더 내의 주어진날짜보다 최근 일자면 성공이다.
  • if-Unmodified-Since

    • 서버 자원의 Last-Modified 날짜가 이 헤더 내의 주어진날짜보다 오래되거나 같다면 성공이다.
  • if-Range

    • If-MatchIf-Modified-Since 와 함께 쓰인다. 다운로드 재시작에 사용된다.
    • 만약 리소스의 변화가 없었다면 중지 되었던 다운로드 다음 데이터를 이어서 주고, 변화가 있었다면 전체 파일 다운로드를 새로 시작한다.

조건부 요청을 통한 캐시 예시

가장 일반적인 유즈케이스는 캐시를 갱신하는 것이다. 비어 있는 캐시를 가지고 있거나 혹은 캐시를 가지고 있지 않은 경우, 요청된 리소스는 200 OK의 상태로 회신된다.

img1.png

응답으로 리소스와 함께 validator 가 전송된다. 이 예시에서는 EtagLast-Modified가 전송되었다.

이 벨리데이터는 리소스와 함깨 캐시로 저장된다.

리소스가 신선한 동안에는 해당 리소스를 그냥 사용하고, 신선해지지 않았을 때 서버에 조건부 HTTP 요청을 보내게 된다.

만약 리소스가 바뀌지 않았다면, 서버는 304 not modified를 응답으로 준다.

이를 통해 캐시는 다시 신선해지고 클라이언트는 캐싱된 리소스를 사용한다.

img2.png

만약 리소스의 변동이 생겼다면, 서버는 200 ok를 응답하고 새로운 버젼의 리소스를 내려준다. 클라이언트는 이 리소스를 받아서 캐시한다.

img3.png

tags: