콘텐츠 협상(Content Negotiation)

조 은길·2022년 3월 17일
0

HTTP 웹 기본 지식

목록 보기
22/32
post-thumbnail

이번 TIL은 인프런의 "모든 개발자를 위한 HTTP 웹 기본 지식"을 학습하고, 정리한 내용입니다.
만약, 제 글의 내용을 퍼갈 시에는 " 모든 개발자를 위한 HTTP 웹 기본 지식 "도 출처에 첨부하시기 바랍니다.


콘텐츠 네고시에이션은 쉽게 말해서, 클라이언트가 원하는 표현 방식으로 서버한테 달라고 요청하는 거다.

콘텐츠 네고시에이션은 크게 4가지가 있는데, 위와 같다.

그럼, 서버가 "아! 그래?? 그럼 클라이언트가 원하는 우선순위가 이거니까, 내가 맞춰서 할 수 있나 해볼게." => 여기서 Accept 블라블라가 나온다.

예를 들어,

어떤 클라이언트가 XML을 더 선호한다면, Accept에 XML의 우선순위를 높여서 보내면 된다.
(물론, 서버에서 XML을 제공한다는 것을 미리 알고 있어야 한다)

물론, 서버가 원하는 것을 못 줄 수도 있다. 하지만, 최대한 원하는 것을 달라고, 클라이언트가 요청하는 것이다.

엑셉트-언어 는 클라이언트가 한국에 있으면, 최대한 한국어로 데이터를 주라고 요청하는 거다.

정리해서, 클라이언트가 서버에게 요청하기 위해 존재하니까, "요청"시에만 사용한다.

예를 들어서, 유저가 한국어 브라우져를 사용하는데, 미국의 싸이트를 들어갔다고 해보자!!

근데, 이 싸이트가 넷플릭스나 애플처럼 다중 언어를 지원한다.

그리고, 해당 싸이트의 기본 언어 설정 우선 순위가 영어라면??

당연히 영어로 언어를 보낼 것이다.

일단, 클라이언트 측에서 클라이언트가 한국어를 원하는지 다른 언어를 원하는지 아무런 정보가 없다.

그럼, 서버는 당연히 기본값으로 응답을 해줄 수 밖에 없다.

그런데, 컨텐츠 네고시에이션이 적용되고 나면, "내가 선호하는 언어는 한국어에요~"

이렇게 보내면, 서버는 한국어가 지원되면, 한국어를 메세지 바디에 넣어서 보내게 된다.

헤더로 이런 거를 처리할 수있다는 점에 굉장히 큰 이점이 있다.

ex) 아마존 싸이트 들어가면, 자동 한국어 처리된다.

하지만, 실무는 항상 이렇게 깔끔하게 떨어지지는 않는다.

클라이언트가 원하는 언어는 "한국어"인데, 해당 싸이트에서 지원하는 언어는 기본이 독일어이고, 영어를 부가적으로 지원하는 싸이트라면??

대부분의 한국인 입장에서 영어는 번역기라도 돌려가면서 읽을 수 있겠지만, 독일어는 참 난감하다. 아마, 둘 중에 선택해야 된다면 영어를 선택할 것이다.

하지만, 이 상황에서는 서버 측은 클라이언트가 원하는 한국어가 없기 때문에, 기본 값인 독일어를 내보낸다.

이런 상황을 방지하기 위해서, "언어 우선 순위"를 설정한다.

협상과 우선순위 1

  • ko-KR
    • 숫자를 생략했기 때문에, 가장 높은 우선순위를 갖는다.
    • "한국 사람들이 쓰는 한국어"라는 뜻
  • ko
    • q=0.9 이기 때문에, 2번째 우선순위를 갖는다.
    • "한국 공통어" 라는 뜻
  • en-us => en 순으로 우선 순위를 가짐

이 헤더를 봤을 때는, 서버 측에서는 기본값인 독일어가 아닌, 영어를 보내주게 된다.

위 예시는 구글에 hello라는 검색어를 쳤을 때, 요청 헤더값을 확인한 것이다.

가장 높은 언어 우선 순위로 미국 영어가 설정되있고, 한국어가 3번째 우선순위로 설정되있는 것을 확인 할 수있다.

참고로, 위에 accept를 살펴보면, 선호하는 메시지 바디 형식으로 html이 1순위 그다음으로 xml이 2순위 등으로 설정되있는 것을 볼 수 있다.

협상과 우선순위 2

여기서는 우선순위가 다음과 같다.

text/plain;format=flowed => text/plain => text/* => */*

*은 아무거나 들어와도 된다는 말이다.

text/*는 text 타입으로 들어와야 하지만, JSON으로 들어오든 HTML로 들어오든 상관없다는 뜻!

협상과 우선순위 3

사실, 이렇게까지 디테일하게 내려갈 일은 많이 없다.

text/plain은 매칭되는 것이 없다. 그러나, *은 아무거나 들어와도 된다는 뜻이다.

즉, text/*text/plain과 매칭된다.

profile
좋은 길로만 가는 "조은길"입니다😁

0개의 댓글