## `HTTP`란?
Hyper Text Transfer Protocol. TCP로 서버와 클라이언트 사이에 데이터를 전송하는 표준 **스펙**. TCP 연결 후, 클라이언트가 서버에 요청 메시지를 보내고, 서버가 클라이언트에게 응답 메시지를 제공하는 방식으로 동작한다.
## HTTP 통신 과정
### 0. 라우팅
**라우팅**은 요청을 보낼 서버의 위치(IP)를 찾는 과정으로 다음과 같은 단계로 이뤄진다.
> 1. 주어진 URL에서 도메인을 찾는다.
> `http://www.example.com/` > `Domain : example.com`
> 2. 로컬에서 해당 도메인이 존재하는지 확인한다.
> 3. 로컬에 없는 경우, DNS(Domain Name System)을 통해 서버의 IP 주소를 받는다.
> 4. 그럼에도 없는 경우, `404`를 출력한다.
### 1. TCP 연결(3-way-handshake)
**3-way-handshake**은 서버와 클라이언트 모두 통신을 할 준비가 되었음을 확인하는 과정으로 다음과 같은 단계로 이뤄진다.
> 1. 클라이언트가 서버에게 `SYN` 패킷을 보낸다.
> 2. 서버는 클라이언트에게 `SYN-ACK` 패킷으로 응답한다.
> 3. 클라이언트가 서버에게 `ACK` 패킷으로 응답하여 연결을 완료한다.
### 2. 요청 메시지 전송(클라이언트 > 서버)
#### 요청 메시지 예시
```
POST /example/resource HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Content-Type: application/json
{ "key": "value" }
```
- `POST /example/resource HTTP/1.1` : **요청 라인**
- `POST` : HTTP 메서드
- `/example/resource` : 요청 URI
- `HTTP/1.1` : 사용 중인 HTTP 프로토콜의 버전
- `Host: www.example.com ...(생략)` : **헤더**
- [[A. 주요 HTTP 헤더 목록|주요 헤더 목록]]
- `{ "key": "value" }` : **본문**
- 헤더에서 줄 바꿈을 한 밑의 부분은 모두 본문에 해당한다.
- 일반 문자열에서 JSON, binary code 등 문자로 표현만 된다면 어떤 데이터 형식이든 본문에 포함될 수 있다.
### 3. 응답 메시지 전송(서버 > 클라이언트)
#### 응답 메시지 예시
```
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: Apache/2.4.18 (Ubuntu)
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
```
- `HTTP/1.1 200 OK` : **상태 라인**
- `200 OK` : HTTP Status 코드와 그에 대한 간략한 설명. 주요 Status 코드 목록은 [[B. 주요 HTTP Status 목록|여기]]서 볼 수 있다.
- `Content-Type: text/html ...(생략)` : **헤더**
- [[A. 주요 HTTP 헤더 목록|주요 헤더 목록]]
- `<html> ...(생략)` : **본문**
- 헤더에서 줄 바꿈을 한 밑의 부분은 모두 본문에 해당한다.
- 일반 문자열에서 JSON, binary code 등 문자로 표현만 된다면 어떤 데이터 형식이든 본문에 포함될 수 있다.
## HTTP의 특징
### 비연결성
[[0. HTTP#HTTP 통신 과정|HTTP 통신 과정]]을 보면 알 수 있듯 HTTP는 매번 새로 커넥션을 맺는데, 이를 **비연결성**이라고 한다. 이런 비연결성은 장점과 단점이 모두 존재한다. 장점은 많은 요청이 들어오는 상황에서는 커넥션 유지 여부를 신경 쓰지 않고 서버에 요청을 배분할 수 있다는 점이다. 단점은 실시간으로 계속 통신을 해야 하는 상황에서는 매번 커넥션을 맺는 과정이 비효율적이라는 점이다.
웹에서는 비연결성의 단점보다 장점이 부각되기 때문에 HTTP를 주로 사용한다. 클라이언트에서 렌더링된 컨텐츠를 사용자가 사용하는 시간이 길고, 동적 렌더링을 클라이언트에서 처리하므로 클라이언트와 서버가 실시간으로 통신을 할 필요성이 적기 때문이다.
### 무상태
HTTP의 [[0. HTTP#비연결성|비연결성]]에서 파생되는 특징으로 모든 요청은 이전 요청과 무관하게 처리된다. 이 또한 많은 요청을 처리해야 하는 상황에서 장점이 될 수 있다. 이전 요청을 신경 쓰지 않고 서버에 요청을 배분할 수 있기 때문이다. 다만, 인증과 인가 기능처럼 이전 상태를 기억해야 하는 기능의 경우, 추가적인 요소(쿠키나 세션)이 필요하다.