## **콘텐츠 협상**
클라이언트의 요청에 따라 서버가 응답하는 콘텐츠의 유형을 결정하는 프로세스이다. HTTP 프로토콜의 핵심 개념 중 하나이며 HTTP/1.1 사양에 정의되었다.
***
## **작동 메커니즘**
**콘텐츠 협상**은 주로 클라이언트가 서버로 보내는 HTTP 요청 헤더를 통해 이루어진다. 서버는 클라이언트의 요청 헤더를 보고 클라이언트가 수용할 수 있는 가장 적합한 콘텐츠 형식을 결정하고 그에 맞는 응답을 제공한다.
#### 1. `Accept`헤더
클라이언트가 보낸 요청의 응답 형식 중에서 처리 가능하거나 원하는 타입을 명시한다. [[MIME (Multipurpose Internet Mail Extensions)|MIME]]을 이용한다.
* **사용 예시**
```http
Accept: application/json, text/html;q=0.9, */*;q=0.8
```
* **동작 순서**
서버는 요청을 받고 `Accept` 헤더를 분석하여 클라이언트가 요청한 형식 중 가장 높은 가중치를 가진 형식으로 응답한다. 만약 클라이언트가 요청한 형식을 서버가 지원하지 않으면 서버는 기본 형식으로 응답하거나 `406 Not Acceptable`를 돌려준다.
#### 2. 그 외 다양한 헤더
- `Accept-Language`: 선호하는 언어를 명시
- `Accept-Encoding`: 지원하는 압축 형식(예: gzip, deflate)을 명시
- `Accept-Charset`: 지원하는 문자 인코딩(예: UTF-8)을 명시
#### 3. 콘텐츠 협상 전략
서버 측은 다양한 협상 전략을 사용할 수 있다.
- **서버 주도 협상(Server-Driven Negotiation)**:
- 서버가 클라이언트의 **`Accept` 헤더**를 기반으로 적절한 응답을 결정한다. 혹은 **요청**을 분석하여 가장 적합한 콘텐츠의 형식을 결정한다.
- **클라이언트 주도 협상(Client-Driven Negotiation)**:
- 클라이언트가 필요한 리소스의 타입을 명시적으로 요청한다. 더 나아가 클라이언트는 형식 접미사나 쿼리 파라미터를 사용하여 더 명확한 요청할 수 있다.
***
## **콘텐츠 협상의 예시**
* **JSON으로 요청**
```http
GET /api/items/1 HTTP/1.1
Host: example.com
Accept: application/json
```
헤더는 클라이언트가 서버에 데이터를 보낼 때 데이터의 형식을 명시는 데 사용된다. 서버 응답의 형식을 지정하는데 사용되지는 않는다. 한마디로 단순히 데이터 형식을 알려주는 형식이다.
* **JSON으로 응답**
```http
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Example Item",
"description": "This is an example item."
}
```
***
## **비표준 HTTP 콘텐츠 협상**
표준 HTTP 콘텐츠 협상의 일부가 아니며 **특정 애플리케이션**이나 **API 설계**에 따라 사용될 수 있는 방식이다.
#### 형식 접미사(Format Suffix)
* **사용 예**: `http://example.com/resource.json`
#### 쿼리 파라미터(Query Parameter)
* **사용 예**: `http://example.com/resource?format=json`
#### Content-Type 헤더
* **사용 예**
```http
POST /resource HTTP/1.1
Host: example.com
Content-Type: application/json
{"key": "value"}
```
> 헤더는 클라이언트가 서버에 데이터를 보낼 때 데이터의 형식을 명시는 데 사용된다. 서버 응답의 형식을 지정하는데 사용되지는 않는다. 한마디로 단순히 데이터 형식을 알려주는 형식이다.