[http] Content Negotiation 콘텐츠 협상

devapploper·2020년 12월 28일
4
post-thumbnail

한국에서 구글에 접속하면 콘텐츠를 한국어로 보여줍니다.
미국에서 구글에 접속하면 콘텐츠를 영어로 보여줍니다.

특별히 설정을 하지 않았는데, 어떻게 이게 가능할까요?

바로 content negotiation를 통해 이것이 가능하게 되는데요.

content negotiation의 정의를 한번 봅시다.

콘텐츠 협상

content negotiation 은 user agent가 사용자에게 가장 알맞는 형태의 리소스를 받을 수 있도록, 리소스를 어떤 형태로 받을지 정할 수 있도록하게 하는 메커니즘입니다. 이때 리소스의 형태는 문서의 언어나, 이미지의 포맷이나, 콘텐츠의 인코딩에 해당하는 부분을 말합니다.

그러니까 다른 말로 user agent가 어떤 URI에 있는 리소스를 요청할 때, 해당 리소스가 사용자에게 적절한 형태로 받도록 정하게 해주는 방법이라는 것이네요.

이를 한글로 풀어보면 콘텐츠를 어떤 형태로 받을지 협상한다? 정도가 될 것 같네요.

콘텐츠 협상에는 두가지 방법이 있습니다.

첫째는 http 헤더를 통해 콘텐츠 협상을 하는 서버 주도적 협상이고 (server-driven/proactive negotiation) 이고,

둘째는 에이전트 주도적 협상(agent-driven/reactive negotiation) 입니다.

첫번째 방법이 통상적으로 사용되는 방법입니다.

서버 주도적 협상

서버 주도적 협상은 콘텐츠 협상의 주도권이 서버에 있다고 보면 됩니다.

브라우저(혹은 다른 user-agent)는 여러 개의 http 헤더를 URL과 함께 보냅니다.

사용자가 선호하는 설정 값들이 이 헤더에 담겨있다고 보면 됩니다. 서버는 사용자에게 어떤 형태의 콘텐츠가 가장 알맞는지 헤더에 담긴 내용과 내부적인 알고리즘을 사용해서 찾아냅니다.

http/1.1의 기준에는 서버 주도적 협상을 일으키게하는 특정 헤더 목록이 있습니다.

여기에는 Accept, Accept-Charset, Accept-Encoding, Accept-Language 가 있습니다.

헤더설명
Accept콘텐츠를 어떤 미디어 타입으로 보내도 괜찮은지 서버에게 알리는 헤더
Accept-Language컨텐츠를 어떤 언어로 보내도 괜찮은지 서버에게 알리는 헤더
Accept-Charset컨텐츠를 어떤 character set로 보내도 괜찮은지 알리는 서버에게 헤더
Accept-Encoding컨텐츠를 어떤 encoding으로 보내도 괜찮은지 서버에게 알리는 헤더

위 그림의 1번 - Requests the resource - 클라이언트가 서버에게 요청할 때 헤더를 분석해보겠습니다.

Accept: text/*

  • 클라이언트는 서버에게 text/* 라고 담긴 Accept 헤더를 보내므로써 "text 미디어타입은 모두 보내도 괜찮다" 라고 말하고 있습니다.

Accept-Language: en

  • 클라이언트는 서버에게 en 이라고 Accept-Language 헤더를 작성하여 보냈습니다. 영어로 된 컨텐츠를 받길 선호한다는 것을 서버에게 알리고 있는 것이죠.

Accept-Encoding: br, gzip;q=0.8

  • 클라이언트는 서버에게 br 인코딩을 가장 선호(q=1.0)하고, 그 다음으로 gzip 인코딩을 선호(q=0.8)한다고 말하고 있습니다.

에이전트 주도적 협상

위의 서버 주도적 협상과는 반대로 에이전트 주도적 협상은 콘텐츠 협상의 주도권이 에이전트 쪽에 있다고 보시면 이해가 쉬우실 겁니다.

에이전트 주도적 협상이 작동하는 법을 짧게 말씀드리겠습니다.

user agent는 서버에 요청을 보냅니다. 서버는 user agent가 받고자 하는 리소스의 형태(representation)와 메타데이터 (content-type, quality, language, etc)에는 어떤 것이 있는지 user agent에게 알립니다.

user agent는 여기서 알맞은 형태를 고르고, 해당 요청을 받기 위한 특별한 URL로 서버에 재요청 합니다. 이 작업은 user agent가 자동으로 선택하거나, 혹은 사용자에게 선택권을 보여주고 그로부터 직접 고르도록 할 수도 있는 방법도 있습니다.


마무리

콘텐츠 협상을 통해 사용자에게 가장 적절한 리소스를 제공한다.
콘텐츠 협상에는 두가지 방법, 서버 주도적 협상과 에이전트 주도적 협상이 있다.
서버 주도적 협상은 http 헤더의 Accept 헤더에 담긴 값을 통해 이뤄진다.

콘텐츠 협상을 조사하면서 어떻게 http 요청이 사용자에게 가장 적절한 형태의 콘텐츠를 표시해주는지 알아보았습니다.

그러나 user agent 혹은 우리의 브라우저는 사용자에게 가장 적절한 형태의 리소스가 무엇인지 어떻게 알고 있는지 그 부분에 대한 궁금증은 아직 남아있네요.

뇌피셜로는 user agent의 IP 주소로부터 사용자의 위치와 선호하는 언어를 유추하는게 아닐까 생각합니다.

읽어주셔서 감사합니다. 🥸


작성에 참고한 자료들:
(1) Wikipedia - Content Negotiation
(2) Mozilla Web Docs - Content Negotiation

profile
app 을 dev 하는 developer. devapploper 입니다

0개의 댓글