ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 내용 협상(content negotiation)이란 무엇인가
    CS지식/네트워크 2021. 7. 12. 22:04

    내용 협상(content negotiation)은 왜 도입된 것일까?

    상황을 가정하여 생각해보자.

    www.naver.com이라는 네이버 사이트는 한국인이 접속을 하기도 하고 외국인이 접속을 한다고 생각해보자.

    사용언어가 다른 두 클라이언트는 그냥 www.naver.com URL로 접속을 할 것이다.

    이 때, 서버는 클라이언트에게 그냥 한국어로 된 웹 페이지로 응답하면 될까?

    그렇다면 외국인은 네이버 사이트를 이용하기 힘들 것이다.

    그러면 웹 서버는 한국어 버전과 다른 언어 버전으로 되어 있는 네이버 웹 페이지 리소스를 가지고 있을텐데

    어떻게 판단하여 클라리언트에게 적합한 버전을 보낼 수 있을까?

     

    여기서 필요한 개념이 내용 협상(content negotiation)이라는 것이다.

    내용 협상을 통해 하나의 URL이 여러 가지 리소스 중 적합한 것에 대응되도록 할 수 있다.

    이것이 가능하려면 서버는 특정 URL에 대해 어떤 콘텐츠가 클라이언트에게 적합한지에 대한 다른 판단도 할 수 있어야한다.

     

    내용 협상은 어떻게 수행되는 것일까?

    내용 협상 기법에는 클라이언트 주도 협상, 서버 주도 협상, 투명 협상 총 세 가지 기법이 존재한다.

    1) 클라이언트 주도 협상

    클라이언트 주도 협상은 서버가 어떤 리소스를 줄지 선택하기 쉽게 해주는 방법으로

    서버가 클라이언트의 요청을 받으면 응답 가능한 페이지의 목록을 요청에 대한 응답으로 클라이언트에게 주어 클라이언트가 보고 싶은 것을 선택하게 하는 것이다.

    클라이언트 주도 협상의 장점은 서버 입장에서 가장 구현하기 쉽고 클라이언트는 자신이 원하는 최선의 선택을 하여 서비스를 받을 수 있다.

    단점은 웹 사이트에 접근하는 데 있어 두 번의 요청이 필요다는 것이다.

    이렇게 된다면 속도는 기존보다 느려질 수 있고 클라이언트 입장에서는 귀찮게 느껴질 수 있다.

     

    클라이언트에게 선택지를 응답으로 던져주는 방법은 두 가지가 있다.

    첫 번째는 여러 가지 버전에 대한 링크와 해당 버전에 대한 설명이 담긴 HTML 페이지를 돌려주는 것이다.

    두 번째는 300 Multiple Choices 응답 코드로 HTTP/1.1 응답을 돌려주는 것이다.

     

     

    2) 서버 주도 협상

    서버 주도 협상은 서버가 어떠한 페이지로 응답해줄 것인지 결정하는 것이다.

    위에서 본 클라이언트 주도 협상은 추가적인 요청과 응답이 요구되는 단점이 있는데 서버 주도 협상은 이를 줄여준다.

    서버 주도 협상이 이루어지기 위해서는 클라이언트가 자신이 원하는(선호하는) 것이 무엇인지를 서버에게 명확히 알려줘야한다.

    서버는 이러한 정보를 클라이언트의 요청메시지의 내용 협상 헤더를 통해 얻는다.

    - 내용 협상 헤더

    클라이언트는 아래의 표와 같은 헤더들을 이용해서 자신의 선호 정보를 서버에게 알려줄 수 있다.

    헤더 설명
    Accept 서버가 어떤 미디어 타입으로 보내도 되는지 알려줌
    Accept-Language 서버가 어떤 언어로 보내도 되는지 알려줌
    Accept-Charset 서버가 어떤 차셋으로 보내도 되는지 알려줌
    Accept-Encoding 서버가 어떤 인코딩으로 보내도 되는지 알려줌

     

    Accept-Language를 통해 클라이언트가 원하는 언어 버전의 웹 페이지를 얻을 수 있을 것이다.

    그러나 다음과 같은 경우에는 어떻게 해야할까?

    클라언트는 프랑스인이다.

    A 사이트에 접속을 하게 되고 내용 협상 헤더를 포함하여 요청한다.

    서버는 요청을 받고 응답을 해주려고 하는데 서버에 존재하는 버전은 한국어와 영어 뿐이다.

    이러한 경우에는 서버가 알아서 어떠한 버전이 적합한지 추측해서 응답하거나

    클라이언트 주도 협상 모델로 전환하여 클라이언트에게 묻는 방법 뿐이다.

     

    여기서는 클라이언트 주도 협상 모델로 전환하는 것은 아는 방법이므로 설명을 제외하고 서버가 알아서 응답하는 방법을 더 알아보자.

    HTTP에서는 위와 같은 경우를 위해서 클라이언트의 선호 정보를 더 자세하게 서버에게 주기 위해 품질값(quality value)라는 것을 이용한다.

    품질값(quality value)은 클라이언트가 각 선호의 카테고리마다 여러 선택 가능한 항목을 선호도와 함께 보낼 수 있는 것이다.

    Accept-Language: ko;q=1.0, en;q=0.3, fr;q=0.0

    위의 예시에서 보듯이 Accept-Language헤더에 자신이 선호하는 언어를 나열하고 q라는 품질값에 값을 주어 선호도를 매길 수 있다.

    q는 0.0부터 1.0까지의 값을 가질 수 있고 숫자가 클수록 선호도가 높은 것이다.

    위 헤더를 해석해보면 한국어로 된 문서를 원하지만 없다면 영어로 된 문서라도 받는다는 것이다.

    또한, 프랑스어로 된 문서는 원하지 않는다는 것이다.

     

     

    3) 투명 협상

    투명 협상은 투명한 중간 장치(주로 프락시)가 서버를 대신하여 클라이언트와 협상하는 방식이다.

    클라이언트 입장에서 협상하는 프락시를 둠으로써 클라이언트와의 메시지 교환을 최소화하는 동시에 서버 주도 협상으로 인한 부하를 서버에서 제거할 수 있는 장점을 가진다.

    이러한 협상이 이루어지기 위해서는 서버가 클라이언트의 요청에 가장 잘 맞는 것이 무엇인지 판별하기 위해 어떠한 요청 헤더를 검사해야 하는지 중개자(프락시)에게 알려주어야한다.

    이를 위해 서버는 응답에 Vary 헤더를 포함시켜 중개자(프락시)에게 내용 협상을 위해 어떠한 헤더를 사용하고 있는지를 알려준다.

    'CS지식 > 네트워크' 카테고리의 다른 글

    로그(log)란 무엇인가  (0) 2021.07.18
    HTTP/2.0이란 무엇인가  (0) 2021.07.16
    HTTPS란 무엇인가  (0) 2021.06.23
    다이제스트 인증이란 무엇인가  (0) 2021.06.20
    HTTP 인증이란 무엇인가  (0) 2021.06.17

    댓글

Designed by Tistory.