인스턴스 조작과 인코딩

인스턴스 조작과 인코딩

목차

  • 웹 객체는 정적이지 않다.
  • 같은 URL은 시간에 따라 다른 버전의 객체를 가리킬 수 있다.
  • 같은 리소스를 여러번 요청했지만, 시간이 흐름에 따라 리소스의 다른 인스턴스를 받게 된다.
  • 클라가 자신이 갖고 있는 리소스의 사본이
    서버가 갖고 있는 것과 정확히 같은지 판단하고,
    상황에 따라서는 새 인스턴스를 요청할 수 있는 능력을 가질 것을 요구한다.
  • 인스턴스 조작에 대표적으로 범위 요청과 델타 인코딩이 있다.

1. 검사기와 신선도

  • 조건부 요청은 클라가 서버에게 자신이 갖고있는 버전을 말해주고, 검사기를 사용해 자신의 사본 버전이 더 이상 유효하지 않을 때만 사본을 보내달라고 요청하는 것이다.

1.1 신선도

  • 서버는 클라에게 얼마나 오랫동안 콘텐츠를 캐시하고,
    그것이 신선하다고 가정할 수 있는지에 대한 정보를 줄 것이다.
  • Expires나 Cache-Control 헤더를 통해 정보를제공할 수 있다.
  1. Expires
    • 문서가 만료되서 더 이상 신선하다고 간주할 수 없게 되는 정확한 날짜를 명시함
    • 서버와 클라가 시계를 동기화시켜야하는데, 쉽지 않고 때무에 상대시간을 이용하는것을 더 선호한다.
  2. 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개로 구분한다.
    1. 약한 검사기
      • 인스턴스를 고유하게 식별하지 못하는 경우도 있다.
      • 바이트의 개수를 세는 방식으로 동작하는 가상의 횟수 검사기
      • Last-Modified: 최소단위가 1초라서 약한 검사기 (서버는 1초에 수천번이 요청을 처리하기 때문)
    2. 강한 검사기
      • 언제나 고유하게 식별한다.
      • 콘텐츠에 대한 암호 체크섬
      • ETag는 강한 검사기
        • W/를 붙임으로써 약한 엔터티 태그임을 알릴 수도 있다.
        • 재검사로 인한 대량 전송을 유발하지 않으면서, 겉모양새만 약간 고치고 싶을 수도 있을 경우

2. 범위 요청

  • 클라가 문서의 일부분이나 특정 범위만 요청할 수 있도록 해준다.

  • 범위요청을 이용하면, HTTP 클라는 받다가 실패한 엔터티를 일부 혹은 범위로 요청함으로써, 다운로드를 중단된 시점에서 재개할 수 있다.

    1
    Range: bytes=4000-
  • 모든 서버가 범위 요청을 맏아들일 수 있는 것은 아니지만, 많은 경우 가능하다.

  • Accept-Range헤더를 포함시키는 방법으로 알려줄 수 있다.

    1
    Accept-Ranges: bytes

3. 델타 인코딩 (델타: 변경된 부분)

  • 객체 전체가 아닌, 변경된 부분에 대해서만 통신하여 전송량을 최적화하는, HTTP 프로토콜 확장이다.
  1. 클라는 페이지의 어떤 버전을 갖고 있는지 서버에게 말해준다. (ETag)
  2. 클라는 자신이 갖고 있는 현재 버전에 델타를 적용하기 위해, (A-IM: Accept-Instance-Manipulation)
    어떤 알고리즘을 알고 있는지도 서버에게 말해주어야 한다.
  3. 서버는 자신이 클라가 갖고 있는 버전을 갖고 있는지
    어떻게 최신 버전과 클라의 버전 사이의 델타를 계산할 것인지 체크해야 한다.
  4. 델타를 계산해서 클라에게 보내주고 (ETag)
  5. 서버가 델타를 보내고 있음을 클라에게 알려주고 (IM) (226 IM Used)
  6. 페이지의 최신 버전에 대한 새 식별자를 명시해야 한다. (ETag)

3.1 인스턴스 조작, 델타 생성기 그리고 델타 적용기

  • 클라는 A-IM 헤더를 사용하여 자신이 받아들일 수 있는 인스턴스 조작의 종류를 명시할 수 있다.
  • 서버는 IM 헤더에 사용한 인스턴스 조작의 종류를 명시할 수 있다.
  • IANA에 등록된 인스턴스 조작의 종류
    • vcdiff: vcdiff 알고리즘을 이용한 델타
    • diffe: 유닉스 diff-e 명령어를 이용한 델타
    • gdiff: gdiff 알고리즘을 이용한 델타
    • gzip: gzip 알고리즘을 이용한 압축
    • deflate: deflate 알고리즘을 이용한 압축
    • range
    • identit
  • 문서는 클라에게 반환되기 전에 압축률을 극대화하기 위해 여러번의 인스턴스 조작을 거칠 수 있다.
  • 델타 인코딩은 전송시간을 줄일 수 있지만, 구현하기가 까다로울 수 있다.
  • 문서를 제공하는데 걸리는 시간을 줄이는 대신,
    서버는 문서의 과거 사본을 모두 유지하기 위해 디스크 공간을 더 늘려야 한다.


참고자료

📚