HTTP
- 서버와 클라이언트가 웹에서 데이터를 주고받기 위한 프로토콜(규약)
- HTTP/1.1, HTTP/2는 TCP 기반 위에서 동작한다.
- TCP는 3-way handshake 로 연결을 맺는다.
- HTTP/3는 UDP 기반 위에서 동작한다.
HTTP의 특징
- 클라이언트-서버 모델
- 클라이언트가 서버에 요청을 보내면 서버는 클라이언트에게 응답을 보낸다.
- 무상태 프로토콜(Stateless)
- 서버가 클라이언트 상태를 유지하지 않음
- 클라이언트가 서버에 요청을 보내면,
- 서버는 클라이언트에게 응답을 주고,
- 바로 close 상태가 된다.(연결을 끊는다.)
- 서버가 클라이언트에게 다음 요청을 보내게 되면,
- 다시 연결을 맺고, 응답을 받아야 하는 구조
- TCP 기반의 연결구조라면, 클라이언트가 서버에 요청을 보낼 때마다 3-way handshake를 통해 연결을 맺고 데이터를 주고받는 과정을 거쳐야 한다. (매 요청마다 이 과정을 수행해야 하기 때문에 비효율적)
- 해결책 : Keep-Alive 속성 사용
- Keep-Alive : 일정 기간 동안 연결을 끊지 않고 클라이언트와 서버 사이에 데이터를 주고받을 수 있도록 한다.
- 그러나, Keep-Alive를 잘못 사용하면 성능 하락의 요인이 된다.
- Keep-Alive 상태에서 클라이언트의 요청이 많아지면 유지되는 connection이 많아져서 신규 사용자를 못받게 될 수 있다. → 웹 서버 Thread가 부족해지는 현상 발생
- 비연결성(Connectionless)
- 서버가 클라이언트 요청에 대해 응답을 마치면 맺었던 연결을 끊어 버림
- 해결책 : 쿠키(클라이언트에 정보 저장), 세션(서버에 정보 저장), JWT → 클라이언트의 정보 유지
HTTP가 Stateless와 Connectionless의 특징을 가지게 된 이유
- HTTP는 웹에서 불특정 다수와 통신이 가능하도록 설계된 프로토콜이다.
서버가 다수의 클라이언트의 상태,연결을 유지해야 한다면 리소스 낭비가 심해질 것이다.
따라서, 상태 또는 연결을 유지하지 않는 대신 더 많은 연결이 가능하도록 설계된 것이 HTTP 프로토콜이다.
HTTP 요청/응답 메시지 구조
클라이언트 |
→
|
요청메시지 |
서버 |
Request line |
Header |
Blank line |
Body |
응답메시지 |
←
|
Status line |
Header |
Blank line |
Body |
- Request line
- HttpMethod
- path
- queryString
HTTP 요청 메소드
HTTP 응답 코드
- 200번대(성공)
- 300번대(리다이렉션)
- 400번대(클라이언트 에러)
- 500번대(서버 에러)
HTTP 헤더
- Content-type, Accept, Cookie, Set-Cookie, Authorization 등