> [!date] published: 2022-11-21 [RFC 7231 - HTTP/1.1 : Semantics and Content 번역](https://roka88.dev/106) > 서버를 기준으로 필요한 내용 위주로 정리함. ## 🌟 2. Resources (리소스) 리소스 : HTTP 요청의 대상. 각 리소스는 URI (I임에 유의. Uniform Resource Identifier) 로 식별된다. 요청에 RFC 7230에 정의된 다양한 형태 중 하나로( ……… 5.3 ……… ) 대상 URI가 들어있고, 요청을 받은 서버에서는 그 대상에 대한 URI를 재구성한다 ( ……… 5.5 ……… ) ## 🌟 3. Representations (표현) 리소스의 현재, 또는 원하는 상태를 표현하기 위한 추상화가 필요하고, 그 추상화를 “REST” 라고 부른다. “표현” 이란 리소스의 어느 시점의 상태를 프로토콜을 통해 쉽게 전달할 수 있게 하기 위한 정보. 표현 메타데이터의 집합과 표현 데이터 스트림으로 구성된다. selective representation은 조건부 요청을 평가하고, GET에 대한 200(OK)나 304(Not Modified) 응답을 구성하기 위한 데이터와 메타데이터를 제공하는데 사용된다. ### ✨ 3.1 Representation Metadata (표현 메타데이터) Representation 헤더 필드 : 표현에 대한 메타데이터 제공 메시지에 본문이 있을 경우에는 표현 헤더 필드는 본문의 표현 데이터를 해석하는 방법 설명 HEAD 요청에 대한 응답에서는 요청이 GET이었을 때 본문에 있었을 표현 데이터를 설명한다. - Content-Type : [3.1.1.5](#3115-content-type) - Content-Encoding : [3.1.2.2](#3122-content-encoding) - Content-Language : [3.1.3.2](#3132-content-language) - Content-Location : [3.1.4.2](#3142-content-location) #### ✏️ 3.1.1 Processing Representation Data ##### 📍 3.1.1.1 Media Type Content-Type 헤더필드와 Accept 헤더필드에서 사용하는 데이터 타입을 표현하는 방식 ``` Media-type = type "/" subtype *(OWS ";" OWS parameter)) type = token (대소문자 구분 ❌) subtype = token (대소문자 구분 ❌) parameter = name "=" value name = token (대소문자 구분 ❌) value = token or quoted-string (name에 따라서 대소문자 구분 여부 결정) ``` parameter의 value는 토큰 혹은 quoted-string으로 전송되는데, 아래와 같은 형식이 모두 가능하지만 일관성을 위해서 가장 처음 예가 권장된다. ``` text/html;charset=utf-8 text/html;charset=UTF-8 Text/HTML;Charset="utf-8" text/html; charset="utf-8" ``` (결론적으론 **type, subtype, parameter-name은 소문자로 통일**, **불필요한 공백을 넣지 말고**, **parameter-value는 가능하면 소문자에 따옴표 없는 토큰**으로 하는 방식이 권장된다는 것 같다.) parameter의 "=" 문자 주위에 공백을 허용하지 않는다. → 공백이 있으면 잘못된 것. ##### 📍3.1.1.2 Charset charset은 대소문자를 구분하지 않는 토큰 ``` charset = token ``` ##### 📍3.1.1.3 Canonicalization and Text Defaults 표준 형식은 Text 타입의 경우에 줄 바꿈으로 CRLF를 사용하는 것을 권장하지만, HTTP는 전체 본문에 일관되기만 하면 CR 또는 LF만으로도 줄바꿈을 할 수 있다. 생성쪽은 위와 같은 방식으로 메시지를 생성할 수 있고 (금지는 아님) **수신 측에서는 CLRF 뿐 만 아니라 CR, LF 만으로 줄바꿈 된 텍스트 미디어의 줄바꿈을 해석할 수 있어야 한다.** 위 내용은 "text" 타입의 경우에만 적용된다. ##### 📍3.1.1.5 Content-Type 메시지 페이로드에 포함된 표현 또는 선택된 표현 등 관련 표현의 미디어 타입을 나타낸다. ``` Content-Type = media-type media-type = Section 3.1.1.1 ``` 본문을 포함하는 메시지를 생성하는 발신자는 미디어타입을 그 발신자가 알 수 없는 경우가 아니라면 메시지에 Content-Type 헤더 필드를 생성해야 한다. 수신 측에서는 만약 본문이 있는 메시지에 Content-Type 필드가 없는경우 미디어 타입을 가정하거나, 데이터를 검토해서 타입을 결정할 수 있다. 리소스 소유자는 올바른 Content-Type 을 제공하는 것이 적절하지만 아닌 서버도 많기 때문에 클라이언트 쪽에서 타입을 재정의하는 경우 있다. 이 경우에는 잘못된 타입으로 결정하는 위험과 추가적인 보안 위험에 노출시킬 수 있다. #### ✏️ 3.1.2 Encoding for Compression or Integrity ##### 📍3.1.2.1 Content Codings 표현에 적용되었거나 적용될 수 있는 인코딩 변환. Accept-Encoding 과 Content-Encoding 헤더필드에 사용된다. ``` content-coding = token ``` content-coding 값은 대소문자를 구분하지 않는다. 이 명세에서 정의되는 값은 compress (x-compress), deflate, gzip ##### 📍3.1.2.2 Content-Encoding 표현에 어떤 content-coding이 적용되었는지, content-type 헤더필드에 있는 그 타입의 데이터를 얻기 위해 어떤 디코딩 매커니즘을 사용해야 하는지 나타낸다. ``` Content-Encoding = content-coding Content-Encoding: gzip ``` 하나 이상의 인코딩이 표현에 적용될 수 있고, 해당 인코딩이 적용된 순서대로 Content-Encoding 필드에 나열되어야 한다. 요청 메시지에 허용되지 않는 Content-Coding이 있는 경우에는 415(Unsupported Media Type)로 응답한다. #### ✏️ 3.1.3 Audience Language ##### 📍3.1.3.1 Language Tags Content-Language 헤더필드에서 사용하는 문법 ``` fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN ``` ##### 📍3.1.3.2 Content-Language ``` Content-Language = language-tag ``` Content-Lauguage가 지정되지 않은 경우, 기본값은 모든 언어 대상이라는 것이다. 다수를 대상으로 하는 컨텐츠의 경우에는 필드의 값에 다수의 언어를 기재할수도 있다. 모든 미디어 타입에 적용될 수 있다. (텍스트 문서에만 한정되지 않는다.) #### ✏️ 3.1.4 Identification ##### 📍3.1.4.2 Content-Location 이 메시지의 페이로드에 해당하는 특정 리소스의 식별자로 사용할 수 있는 URI을 참조한다. 요청 메시지가 생성될 때 이 URI에 대해 GET 요청을 수행한다면, 이 요청에 대한 200(OK) 응답은 페이로드에 동일한 표현을 포함할 것이다. ``` Content-Location = absolute-URI/partial-URI ``` Content-Location 값은 Request URI의 대체 값은 아니다. Content-Location이 2xx(Successful) 응답 메시지에 포함되고, 요청 URI와 동일한 URI에 대한 것을 가리키는 경우, 수신자는 페이로드를 메시지 작성 시점의 그 리소스의 표시로 간주할 수 있다. - GET, HEAD 요청의 경우 서버가 Content-Location을 제공하지 않았을때와 그 의미가 같다. - PUT, POST와 같은 요청의 경우 서버의 응답에 해당 리소스의 새로운 표현이 포함됨을 의미한다. ### ✨ 3.2 Representation Data 표현 데이터는 메시지의 페이로드 본문으로 제공되거나 요청 URI에 의해 참조된다. 표현 데이터는 Content-Type, Content-Encoding을 통해 결정된다. 페이로드를 구체적으로 기술하는 헤더 필드를 "payload header fields" 라고 한다. - Content-Length - Content-Range - Trailer - Transfer-Encoding