Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4부 17장] 내용 협상과 트랜스코딩 #16

Open
ruthetum opened this issue Oct 2, 2022 · 0 comments
Open

[4부 17장] 내용 협상과 트랜스코딩 #16

ruthetum opened this issue Oct 2, 2022 · 0 comments

Comments

@ruthetum
Copy link
Member

ruthetum commented Oct 2, 2022

내용 협상

  • 서버에 있는 페이지들 중 어떤 것이 클라이언트에게 맞는지 판단하는 세 가지 방법이 존재
  1. 클라이언트 주도 협상
  2. 서버 주도 협상
  3. 투명 협상

스크린샷

1. 클라이언트 주도 협상

  • 클라이언트가 요청 시 여러 가지 버전에 대한 링크와 각각에 대한 설명이 담긴 HTML 페이지를 돌려주거나, 300 Multiple Choices 응답 반환

  • 서버 입장에서 가장 구현하기 쉽고, 클라이언트는 원하는 버전을 선택하기 때문에 최선의 선택을 할 수 있음

  • 하지만 클라이언트에서 선택을 해야하기 때문에 요청 횟수와 대기시간 증가

2. 서버 주도 협상

  • 서버가 클라이언트의 요청 헤더를 검증해서 어떤 버전을 제공할지 결정

  • 당연히 클라이언트 주도 협상보다 빠름

  • 서버가 가장 적절한 것을 선택할 수 있도록 q값 메커니즘을 제공하고, 서버가 클라이언트에게 요청이 어떻게 평가되는지 말해줄 수 있도록 하기 위해 Vary 헤더를 제공

  • 하지만 식별하기 위한 값이 헤더에 존재하지 않는 경우 서버가 추측해서 제공

내용 협상 헤더

  • Accept : 서버가 어떤 미디어 타입으로 보내도 되는지
  • Accept-Language : 서버가 어떤 언어로 보내도 되는지
  • Accept-Charset : 서버가 어떤 차셋으로 보내도 되는지
  • Accept-Encoding : 서버가 어떤 인코딩으로 보내도 되는지

서버는 클라이언트 Accept 관련 헤더들을 적절한 엔터티 헤더들과 매핑

  • Accept <-> Content-Type
  • Accept-Language <-> Content-Language
  • Accept-Charset <-> Content-Type
  • Accept-Encoding <-> Content-Encoding

내용 협상 헤더의 품질값

// example
Accept-Language: en;q=0.5, fr;q=0.0 nl;q=1.0, tr;q=0.0
  • q값은 0.0 ~ 1.0 까지의 값
  • 0.0은 가장 낮은 선호도, 1.0은 가장 높은 선호도
  • 예시의 값은 네덜란드어(nl)를 가장 선호, 그 다음에는 영어도 선호, 프랑스/터키어는 선호하지 않음

그 외의 헤더들에 의해 결정

  • User-Agent와 같은 클라이언트의 다른 요청 헤더들을 이용해 알맞은 요청을 만들고, 서버가 응답에 넣어 보낼 수 있는 Vary 헤더를 정의
    • 서버가 오래된 버전의 웹 브라우저에서 자바스크립트 버전을 지원하지 않는 경우, 그들에게 자바스크립트가 포함되지 않은 페이지를 돌려줄 수 있음

3. 투명 협상

  • 투명 협상은 클라이언트 입장에서 협상하는 중개자 프락시를 통해 클라이언트와의 메시지 교환을 최소화

    • 프락시가 서버를 대신해서 협상
  • 당연히 클라이언트 주도 협상보다 빠르고, 웹 서버가 직접 협상을 할 필요가 없음

  • 하지만 투명 협상에 대한 정형화된 명세가 없음

  • 서버는 응답에 Vary 헤더를 포함시켜 보내고, 프락시는 내용 협상을 위해 어떤 헤더를 사용하고 있는지 알려줄 수 있음

참고.

캐시 프락시는 단일한 URL을 통해 접근할 수 있는 문서의 여러 다른 사본을 저장할 수 있다.
만약 서버가 그들의 캐시에 대한 의사결정 프로세스를 캐시에게 알려 주었다면, 캐시는 서버의 입장에서 클라이언트와 협상할 수 있다.
캐시는 올바른 응답을 클라이언트에게 돌려주기 위해 내용 협상 헤더를 사용한다.
서버가 특정 요청 헤더에 따라 다르게 응답한다면, 캐시된 응답을 돌려보내기 전에 캐시는 반드시 일반적인 내용 협상 헤더들 뿐 아니라 이들 요청 헤더들도 맞춰보아야 한다.
캐시는 각 배리언트마다 알맞은 문서 버전을 저장해야 한다. 캐시가 검색을 할 때, 먼저 내용 협상 헤더로 적절한 콘텐츠를 맞춰보고, 다음에 요청의 배리언트를 캐시된 배리언트와 맞춰본다.

캐시와 얼터네이트

  • 캐시는 같은 URL에 대해 두 개의 다른 문서를 갖게 됨

  • 이 다른 버전은 배리언트(variant)나 얼터네이트(alternate)로 불림

  • 내용 협상은 배리언트 중에서 클라이언트의 요청에 가장 잘 맞는 것을 선택하는 과정

Vary 헤더

  • Vary 응답 헤더는 서버가 문서를 선택할 때 클라이언트 요청 헤더 모두(일반적인 내용 협상 헤더 외에 추가)를 나열

  • 예를 들어 제공된 문서가 User-Agent 헤더에 의존하는 경우 Vary 헤더는 반드시 User-Agent를 포함해야 함

  • 캐시는 새 요청이 오면 반드시 캐시된 응답 안에 서버가 보낸 Vary 헤더가 들어있는지 확인

  • 투명 협상을 구현하기 위해 캐시는 반드시 캐시된 배리언트와 함께 클라이언트 요청 헤더와 그에 알맞은 서버 응답

트랜스 코딩

  • 서버가 클라이언트의 요구에 맞는 문서를 하나도 갖고 있지 않다면 기존의 문서를 클라이언트가 사용할 수 있게 변환하는 옵션으로 세 가지 방법이 존재
  1. 포맷 변환
  2. 정보 합성
  3. 콘텐츠 주입

1. 포맷 변환

  • 데이터를 클라이언트가 볼 수 있도록 한 포맷에서 다른 포맷으로 변환

  • 예를 들어 HTML을 WML으로 변환하거나, 접속 속도가 느리면서 고해상도 이미지에 관심이 없는 경우 이미지의 크기나 해상도를 줄여줄 수 있음

  • 내용 협상 헤더에 의해 진행 (User-Agent에 의해 진행될 수도 있음)

내용 변환, 트랜스코딩 vs 콘텐츠 인코딩, 전송 인코딩

  • 내용 변환, 트랜스코딩 : 콘텐츠를 특정 접근 장치에서 볼 수 있도록 하기 위함
  • 콘텐츠 인코딩, 전송 인코딩 : 콘텐츠의 더 효율적인 혹은 안전한 전송을 위함

2. 정보 합성

  • 문서에서 정보의 요점을 추출하는 것

  • 예를 들어 각 절의 제목에 기반한 문서의 개요 생성이나 페이지에서 광고 및 로고 제거를 하는 경우

  • 보통 포털 사이트의 웹 페이지 디렉터리 같은 자동화된 웹페이지 분류 시스템에 종종 사용

3. 콘텐츠 주입

  • 앞선 두 종류의 트랜스 코딩(포맷 변환, 정보 합성)은 일반적으로 웹 문서의 양을 줄이는 것이 목적

  • 콘텐츠 주입은 오히려 양을 늘리는 변환 방법으로, 예를 들어 자동 광고 생성, 사용자 추적 시스템에 활용

  • 특정 사용자를 대상으로 하는 광고를 그때그때 효과적으로 삽입하기 위해 동적으로 이루어짐

트랜스코딩 vs 정적으로 미리 생성해놓기

  • 트랜스코딩의 대안은 웹 서버에 미리 웹페이지의 여러 가지 사본을 만드는 것

  • 예를 들어 하나는 고화질/저화질 이미지, HTML/WML 등등 미리 모두 생성

  • 하지만 여러 가지 이유로 그다지 현실적인 기법은 아님

    • 페이지가 수정될 때보다 여러 페이지를 수정
    • 리소스를 저장하기 우해 더 많은 공간이 필요
    • 타켓 광고 삽입은 정적인 방법으로 수행될 수 없음
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant