- 웹 객체는 정적이지 않다.
- 같은 URL은 시간에 따라 다른 버전의 객체를 가리킬 수 있다.
- 같은 리소스를 여러번 요청했지만, 시간이 흐름에 따라 리소스의 다른 인스턴스를 받게 된다.
- 클라가 자신이 갖고 있는 리소스의 사본이
서버가 갖고 있는 것과 정확히 같은지 판단하고,
상황에 따라서는 새 인스턴스를 요청할 수 있는 능력을 가질 것을 요구한다. - 인스턴스 조작에 대표적으로 범위 요청과 델타 인코딩이 있다.
1. 검사기와 신선도
- 조건부 요청은 클라가 서버에게 자신이 갖고있는 버전을 말해주고, 검사기를 사용해 자신의 사본 버전이 더 이상 유효하지 않을 때만 사본을 보내달라고 요청하는 것이다.
1.1 신선도
- 서버는 클라에게 얼마나 오랫동안 콘텐츠를 캐시하고,
그것이 신선하다고 가정할 수 있는지에 대한 정보를 줄 것이다. - Expires나 Cache-Control 헤더를 통해 정보를제공할 수 있다.
Expires
- 문서가 만료되서 더 이상 신선하다고 간주할 수 없게 되는 정확한 날짜를 명시함
- 서버와 클라가 시계를 동기화시켜야하는데, 쉽지 않고 때무에 상대시간을 이용하는것을 더 선호한다.
Cache-Control
- 문서의 최대 수명을
문서가 서버를 떠난 후로부터의 총 시간을 초 단위로 정한다. - 7장 복습
1.2 조건부 요청과 검사기
- 더이상 신선하지 않다면, 자신이 갖고 있는 사본을 신선한 것으로 만들어야함
- 항상 다시 갖고 온다면 불필요한 리소스 낭비가 있을 것.
- 리소스가 바뀐 경우에만 사본을 요청하는 조건부 요청을한다.
- HTTP 요청 메세지이지만, 특정 조건이 참일 때만 수행된다.
- 예)
If-Modified-Since: 날짜
- 각 조건 헤더마다 검사기 조건이 다르다.
If-Modified-Since
:Last-Modified
- 변한게 있으면 보내달라If-Unmodified-Since
:Last-Modified
- 변한게 없으면 보내달라If-Match
:ETag
- 같으면 보내달라If-None-Match
:ETag
- 다르면 보내달라
- HTTP는 강한검사기, 약한 검사기 2개로 구분한다.
- 약한 검사기
- 인스턴스를 고유하게 식별하지 못하는 경우도 있다.
- 바이트의 개수를 세는 방식으로 동작하는 가상의 횟수 검사기
- Last-Modified: 최소단위가 1초라서 약한 검사기 (서버는 1초에 수천번이 요청을 처리하기 때문)
- 강한 검사기
- 언제나 고유하게 식별한다.
- 콘텐츠에 대한 암호 체크섬
- ETag는 강한 검사기
W/
를 붙임으로써 약한 엔터티 태그임을 알릴 수도 있다.- 재검사로 인한 대량 전송을 유발하지 않으면서, 겉모양새만 약간 고치고 싶을 수도 있을 경우
2. 범위 요청
클라가 문서의 일부분이나 특정 범위만 요청할 수 있도록 해준다.
범위요청을 이용하면, HTTP 클라는 받다가 실패한 엔터티를 일부 혹은 범위로 요청함으로써, 다운로드를 중단된 시점에서 재개할 수 있다.
1
Range: bytes=4000-
모든 서버가 범위 요청을 맏아들일 수 있는 것은 아니지만, 많은 경우 가능하다.
Accept-Range
헤더를 포함시키는 방법으로 알려줄 수 있다.1
Accept-Ranges: bytes
3. 델타 인코딩 (델타: 변경된 부분)
- 객체 전체가 아닌, 변경된 부분에 대해서만 통신하여 전송량을 최적화하는, HTTP 프로토콜 확장이다.
- 클라는 페이지의 어떤 버전을 갖고 있는지 서버에게 말해준다. (ETag)
- 클라는 자신이 갖고 있는 현재 버전에 델타를 적용하기 위해, (A-IM: Accept-Instance-Manipulation)
어떤 알고리즘을 알고 있는지도 서버에게 말해주어야 한다. - 서버는 자신이 클라가 갖고 있는 버전을 갖고 있는지
어떻게 최신 버전과 클라의 버전 사이의 델타를 계산할 것인지 체크해야 한다. - 델타를 계산해서 클라에게 보내주고 (ETag)
- 서버가 델타를 보내고 있음을 클라에게 알려주고 (IM) (226 IM Used)
- 페이지의 최신 버전에 대한 새 식별자를 명시해야 한다. (ETag)
3.1 인스턴스 조작, 델타 생성기 그리고 델타 적용기
- 클라는 A-IM 헤더를 사용하여 자신이 받아들일 수 있는 인스턴스 조작의 종류를 명시할 수 있다.
- 서버는 IM 헤더에 사용한 인스턴스 조작의 종류를 명시할 수 있다.
- IANA에 등록된 인스턴스 조작의 종류
- vcdiff: vcdiff 알고리즘을 이용한 델타
- diffe: 유닉스 diff-e 명령어를 이용한 델타
- gdiff: gdiff 알고리즘을 이용한 델타
- gzip: gzip 알고리즘을 이용한 압축
- deflate: deflate 알고리즘을 이용한 압축
- range
- identit
- 문서는 클라에게 반환되기 전에 압축률을 극대화하기 위해 여러번의 인스턴스 조작을 거칠 수 있다.
- 델타 인코딩은 전송시간을 줄일 수 있지만, 구현하기가 까다로울 수 있다.
- 문서를 제공하는데 걸리는 시간을 줄이는 대신,
서버는 문서의 과거 사본을 모두 유지하기 위해 디스크 공간을 더 늘려야 한다.
- HTTP 완벽가이드 책을 보고 이해한 내용을 정리 한 글입니다.
참고자료