문서 간에 링크를 통해 연결할 수 있는 프로토콜
하지만, 이제는 문서뿐 아니라 HTTP 메시지에 모든 것을 전송한다.
HTTP/1.1
1997년 : 가장 많이 사용하며, 우리에게 가장 중요한 버전HTTP/1.1
, HTTP/2
는 TCP 기반으로 동작한다. HTTP/3
HTTP/1.1
을 주로 사용한다.HTTP/2
, HTTP/3
도 점차 증가하고 있다. 기존 TCP는 3 way hanshake
부터 내부적으로 포함하거나 추가해야 하는 작업들이 너무 많아서
신뢰성이나 연결성은 보장되지만 속도가 떨어진다.
그렇기에 UDP 프로토콜을 애플리케이션 레벨에서 재설계를 해서 나온 게 HTTP/3
이다.
HTTP는 클라이언트와 서버 구조로 되어있는데, HTTP는 클라이언트가 HTTP 메시지를 만들어 보내고, 서버에서 요청에 대한 응답이 올 때까지 기다린다.(Request) 그리고 서버는 요청에 대한 결과를 만들어서 응답(Response) 하는 구조인데, 어째서 이렇게 클라이언트와 서버를 분리해야만 할까?
클라이언트에서는 복잡한 비즈니스 로직이나 데이터를 다룰 필요 없고, UI를 그리는데 집중할 수 있다.
서버에서는 복잡한 비즈니스 로직이나, 데이터를 다루는 데만 집중하면 된다.
👉 만약 트래픽이 폭주해 고도화가 필요한 경우 클라이언트는 신경 쓰지 않고 서버만 개선하면 된다.
클라이언트와 서버를 독립적으로 구분한다는 것은 각자의 책임을 나눠 해당 책임에만 집중하여,
이슈가 생기거나 할 때 한 쪽에만 신경 쓰면 된다는 장점을 가진다.
서버가 클라이언트의 상태를 보존한다.
즉, 클라이언트와 서버 간에 송/수신을 하며 단계별 과정을 진행하는데 서버에서 클라이언트가 이전 단계에서 제공한 값을 저장하고 다음 단계에서도 저장한 상태인 것.
서버가 멈추거나 하는 여러 이유로 다른 서버를 사용해야 한다면 이전 서버에서 가지고 있던 상태 값들을 가지고 있지 않기 때문에 에러가 발생한다.
클라이언트: 변수 A에는 10만 원을 넣어줘.
서버: 변수 A에 10만 원을 넣겠습니다.
클라이언트: 변수 B에는 20만 원을 넣어줘.
서버: 변수 B에 20만 원을 넣겠습니다.
클라이언트: 변수 A와 B의 합은 뭐야?
서버: 변수의 합은 30만 원입니다.
클라이언트: 변수 A에는 10만 원을 넣어줘.
서버 A: 변수 A에 10만 원을 넣겠습니다.
--서버 A 다운으로 서버 B로 교체--
클라이언트: 변수 B에는 20만 원을 넣어줘.
서버 B: 변수 B에 20만 원을 넣겠습니다.
클라이언트: 변수 A와 B의 합은 뭐야?
서버 B: 변수의 합을 계산할 수 없습니다.
새로운 서버로 변경되면서 기존 서버에 저장한 변수값을 새로운 서버에서는 알 수 없기에 에러가 발생한다.
(만약, 기존 서버에서 새로운 서버로 이전 데이터를 모두 전달해 준다면 문제가 없을 수 있다.)
즉, 항상 같은 서버가 유지되어야 한다.
서버가 클라이언트의 상태를 보존하지 않는다.
그렇기에 매번 요청에 모든 상태 값들을 전달해 줘야 한다.
클라이언트: 변수 A에 10만 원을 넣어줘
서버 A: 변수 A에 10만 원을 넣겠습니다.
--서버 A 다운으로 서버 B로 교체--
클라이언트: 변수 B에는 20만 원을 넣어줘.
서버 B: 변수 B에 20만 원을 넣겠습니다.
클라이언트: 변수 A에 10만 원을 넣고 변수 B에는 20만 원을 넣고 곱을 계산해 줘
서버 C: 변수의 합은 200만 원입니다.
상태 유지
: 중간에 서버가 변경되면 안 된다.무상태
: 중간에 서버가 변경돼도 된다.무상태
상태 유지
클라이언트 1
이 서버와 연결을 한 뒤 클라이언트 2
에서 서버와 연결을 할 때도 클라이언트 1
과 서버는 연결을 유지하고 있다. (이는 클라이언트 3
의 경우도 마찬가지다.)비연결성이 좋기만 한 것은아니다. 매번 새로 연결해야 한다는 것은 매 연결마다 들어가는 비용에 대해서 고려하지 않을 수 없다.
HTTP 초기에는 모든 자료에 대해서 비연결성으로 각각의 자원에 대해 연결
/응답
/종료
를 반복하다 보니 대략적으로 1초가량 소모되었다고 한다. 그럼 이 경우 HTTP 지속 연결을 하면 어떻게 될까?
클라이언트는 서버와 연결을 한 다음 필요한 자원을 요청/응답으로 다운로드한다.
HTTP 초기와 차이점
으로 연결이 종료되는 것이 아니라 필요한 자원들을 모두 다운로드할 때까지 연결이 종료되지 않고 요청
/응답
이 반복된 뒤 종료된다. 그럼으로써 속도 자체가 더 빨라졌다.
실무 상황에서 특정 시간에 발생하는 대용량 트래픽에 대해서 대응해야 하는 경우가 생긴다
(Ex: 선착순 이벤트, 명절 KTX 예약)
이럴 경우 수천, 수만 명 이상이 동시에 접속을 하면서 서버에 과부하가 걸리는 경우가 있는데,
이 경우 무상태 페이지를 활용해 페이지 접속 인원을 분산해서 대용량 트래픽을 분산시키면 좋다.
HTTP 전송에 필요한 모든 부가정보
GET
, POST
, PUT
, DELETE
GET
: 리소스 조회POST
: 요청 내역 처리HTTP-message = start-line
*(header-field CRLF)
*CRLF
[ message - body ]
200
: 성공400
: 클라이언트 요청 오류500
: 서버 내부 오류