TCP 프로토콜 위에서 동작한다.
크롬 브라우저 개발자도구 네트워크 탭에서 프로토콜 우클릭 후 프로토콜이라는 column을 확인해보자.
h2 는 HTTP/2 버전을 의미한다. 과거에 네이버는 HTTP/1.1을 사용했었는데 어느새 개선된 HTTP/2 프로토콜을 사용하고 있다.
일단 나는 신입개발자니까 HTTP/1.1을 공부하자.
HTTP의 특징을 하나씩 자세히 알아보자
HTTP는 클라이언트가 HTTP메시지를 통해서 서버에 요청을 보낸다.
클라이언트는 서버에서 응답이 올 때 까지 묻지도, 따지지도 않고 그저 대기한다.
서버는 요청에 대한 결과를 만들어서 응답한다.
응답 결과를 열어서 클라이언트가 동작하게 된다.
클라이언트와 서버를 분리해야 한다.
비즈니스 로직과 데이터는 모두 서버에서 처리하고, 클라이언트는 UI에 집중한다.
이렇게하면 클라이언트와 서버가 독립적으로 발전할 수 있다.
클라이언트는 서버가 어떤 일을 하는지 몰라도 된다.
이 정의를 이해하기 전에 상태 유지 프로토콜에 대해서 알아보자
서버가 클라이언트의 이전 상태를 보전하는 것이다.
상태유지 프로토콜은 클라이언트의 요청을 하나 하나 모두 기억한다.
만약 배달앱에서 상태유지를 하는 서버와 통신을 한다고 가정해 보자.
클라이언트는 순차적으로 이런 요청을 보낸다.
1. 짜장면 2그릇
2. 초인종 누르지 말아주세요
3. 결제는 카드로
서버는 클라이언트의 요청을 받아 응답하고 받은 요청을 기억한다. 그런데 만약 2번째 요청을 받고 서버에 오류가 발생해서 다른 서버로 요청을 보내야 한다고 가정해보자.
서버1
1. 짜장면 2그릇 주문이요~
2. 초인종은 누르지 말아 달래요~
😨 아 갑자기 화장실이 급해서 주문 좀 대신 받아주세요~
교체된 서버2
1. 결제는 카드로
🙄🙄🙄🙄🙄🙄 ?? 갑자기... 뭘 주문했는지 말도 안했는데
이런 식으로 상태를 유지하는 프로토콜을 사용하는 경우에 정상적인 통신을 하려면 클라이언트가 통신해야 하는 서버를 하나 밖에 가질 수 없다.
지금 통신하고 있는 서버만 전체 맥락을 이해 할 수 있으니까!
반면에 ....
무상태 프로토콜은 서버가 클라이언트의 요청을 기억해 두지 않는다.
이런 방식으로 진행 된다.
클라이언트
1. 짜장면 2그릇
2. 짜장면 2그릇, 초인종 누르지 말아주세요
3. 짜장면 2그릇, 초인종 누르지 말아주세요, 결제는 카드로
아까와 같은 상황이 벌어졌다고 가정해 보자
서버1
1. 짜장면 2그릇 주문이요~
2. 짜장면 2그릇, 초인종 누르지 말아달래요~
😨 아 갑자기 화장실이 급해서 주문 좀 대신 받아주세요~
교체된 서버2
1. 짜장면 2그릇, 초인종 누르지 말아주세요, 결제는 카드로
👌 네, 주문 접수되었습니다.
이 처럼 무상태 프로토콜은 클라이언트가 필요한 데이터를 모두 담아서 서버에 보낸다.
만약 예기치 못한 상황이 서버에 발생해도 중간에 통신하는 서버를 바꿔 클라이언트는 여러 서버와 통신 할 수 있다.
무상태 프로토콜을 사용하는 통신은 서버가 무한정으로 증설 할 수 있겠다. 얼마든지 클라이언트는 다른 서버와 통신 할 수 있을 테니까!
💡정리해 보자
상태유지: 중간에 다른 서버로 바뀌면 안된다. 통신하는 서버가 바뀔 때 클라이언트의 상태 정보를 다른 서버로 넘겨줘야 한다.
무상태: 중간에 통신하는 서버가 중간에 바뀌어도 된다.
무상태 프로토콜의 한계
모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.
무상태가 가능한 경우
상태를 유지해야 하는 경우
데이터를 너무 많이 보낸다. 그때 그때 자신의 상태를 설명해야 하는 데이터를 모두 보낸다.
자세히 알아보자
TCP/IP프로토콜은 클라이언트가 한 번 서버로 요청을 보내면 계속해서 연결을 유지하고 있다.
클라이언트가 아무 요청도 보내지 않아도 연결을 유지함 ....
클라이언트가 아무 요청도 하지 않는데 서버와의 연결을 계속 유지하는 것은 서버에 부담이 많이간다.
하는 것도 없으면서 집에서 밥만 축내는 백수들이 많아지는 것이다.😫
HTTP는 가차없다.
HTTP는 클라이언트의 요청에 대해 응답하고 서버가 연결을 끊어버린다. 서버는 연결을 유지하지 않아 최소한의 자원을 사용하며 서버를 유지 할 수 있다.
일반적으로 초 단위 이하의 빠른 속도로 응답한다.
1시간 동안 수천명이 서비스를 동시에 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음 (연결을 유지 하지 않고 있으니까)
쉬지 않고 계속 검색버튼을 누르는 사람은 많지 않다. (그렇겠지?..)
⚠️ 한계
HTTP는 TCP/IP를 사용하고 있기 때문에 클라이언트가 새로운 요청을 보낼 때 마다 3 way handshake를 또 해야 한다.
웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지등 수 많은 자원이 함께 다운로드되어야 하는데 파일하나 받을 때마다 연결을 끊고 다시 연결하고 ... 큰 단점이다.
html받고 연결 끊고 TCP연결하고 자바스크립트 받고 연결 끊고 ..... 😥
지금은 HTTP 지속 연결로 문제를 해결했다.
지속연결은 보내야 하는 데이터를 모두 보낼 때 까지 연결을 유지하고 있다가 모든 데이터를 전송 후 연결을 해제한다.
html 요청 응답
css 요청 응답
js 요청 응답
이미지 요청 응답
.... 모두 받으면 연결 종료
HTTP는 요청 메시지와 응답 메시지의 구조가 약간 다르다.
HTTP의 메시지 구조
시작라인 satrt-line
헤더 header
공백라인(무조건 있어야하는 필수 라인)
메시지 바디 message body
HTTP 메서드 쿼리 HTTP버전
Host(헤더)
예시
Get /search?q=hello HTTP/1.1
Host: www.google.com
💡 요청 메시지도 body본문을 가질 수 있음
HTTP버전 HTTP상태코드
헤더필드
메시지 바디
예시
HTTP/1.1 200 OK
content-type: text/html;
content-length: 1024
<html>
<body> ... </body>
</html>
HTTP메서드
요청대상
HTTP버전
GET POST PUT DELETE
메서드는 서버가 수행해야 할 동작을 지정한다.HTTP버전
상태코드
reason-parse
필드이름
: 필드값
HTTP 메시지 바디
HTTP는 단순하고 확장이 가능, 메시지도 단순
크게 성공하는 표준 기술은 단순하지만 확장 가능한 기술이다...