Content Negotiation

정은경·2022년 4월 8일
0

Content Negotiation

  • 통신 방법을 최적화하고자 하나의 요청 안에서 서버와 클라이언트가 서로 최고의 설정을 공유한느 시스템을 의미
  • 헤더를 이용

협상 대상과 헤더

요청 헤더응답협상 대상
AcceptContent-Type 헤더MIME 타입
Accept-LanguageContent-Language 헤더/HTML태그표시 언어
Accept-CharsetContent-Type 헤더문자의 문자셋
Accept-EncodingContent-Encoding 헤더바디 압축

1) 파일의 종류 결정

구글 크롬의 요청 헤더 중 일부
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/web,*/*;q=0.8

  • image/web
  • */*l;q=0.8
  • q는 품질 계수라는 것으로 0~1까지의 수치로 설정
    • 기본은 1.0이고 이때는 q가 생략됨
    • 우선 순위를 나타냄 (웹 서버가 WebP를 지원하면 WebP를, 그렇지 않으면 PNG 등 다른 포맷(우선순위0.8)을 서버에 보낼 것을 요구하고 있음)
    • 서버는 요청한 형식 중에서 파일을 반환
    • 우선 순위를 해석해 위에서부터 차례로 지원하는 포맷을 찾고, 일치하면 그 포맷을 변환
    • 만약 일치하는 형식이 없으면 서버가 406 Not Acceptible 오류를 반환

2) 표시 언어 결정

  • 클라이언트가 지원하는 언어 종류를 나타냄

    구글 크롬의 요청 헤더 중 일부
    Accept-Language: en-US;en;q=0.8,ko;q=0.6

  • en-US는 q가 1.0 (생략)

  • en은 q가 0.8

  • ko는 q가 0.6

  • q값은 클수록 우선순위가 높음

3) 문자셋 결정

구글 크롬의 요청 헤더 중 일부
Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3

  • 어느 모던 브라우저도 Accept-Chartset을 송신하지 않음
  • 아마도 브라우저가 모든 문자셋 인코더를 내장하고 있어, 미리 협상할 필요가 없어졌기 때문으로 여겨짐
  • 문자셋은 MIME 타입과 세트로 Content-Type 헤더에 실려 통지됨
    Content-Type: text/html; charset=UTF-8
  • HTML의 경우, 문서 안에도 쓸 수 있음 (RFC 1866의 HTML/2.0으로 이미 이용할 수 있음)
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
  • HTML5에서는 다음과 같이 표기하 수 도 있음 (meta http-equiv 태그는 http 헤더와 똑같은 지시를 문서 내부에 삽입해서 반환)
    <meta charset="UTF-8">
  • 사용할 수 있는 문자셋은 IANA에서 관리

4) 압축

  • 통신에 걸리는 시간보다 압축/해제가 짧은 시간에 이루어지므로, 압출을 함으로써 웹페이지를 표시할 때 걸리는 전체적인 처리 시간을 줄일 수 있음
  • 콘텐츠 압축 협상은 모두 HTTP의 헤더 안에서 완료한다
  • 우선 클라이언트가 수용가능한 압축 방식을 헤더에 지정
    Accept-Encoding: deflate, gzip
  • 서버는 전송바은 목록 중 지원하는 방식이 있으면, 응답할 때 그 방식으로 압축하거나, 미리 압축된 콘텐츠를 반환 (gzip인 경우의 예: Content-Encoding: gzip, Content-Length 헤더는 압축된 파일의 크기)
  • Content-Encoding으로 콘텐츠 크기를 줄이는 방법 말고도, Transfer-Encoding 헤더로 통신 경로를 압축하는 방법도 규격에 있지만, 그다지 사용되지 않음

Reference

profile
#의식의흐름 #순간순간 #생각의스냅샷

0개의 댓글