http는 클라이언트
와 서버 구조
로 이루어져있다.
클라이언트는 http메세지를 통해서 서버에게요청
을 서버는 요청 받을 데이터를 토대로 대기
를 한다.
요청에 대한 결과가 다 작성되면 대기가 끝나고 클라이언트에게 응답
을 한다
클라이언트(요청) => 서버(대기...응답) => 클라이언트(받음)
예전에는 클라이언트와 서버가 하나로 이루어져 있었지만 근래에는 클라이언트와 서버가 따로 분리되어 독립적으로 진화하고 있다
클라이언트는 UI 개발에 집중하고 서버는 비지니스 로직 개발에 집중을 할 수 있게되어 효율적인 작업을 가능케 하였다.
http는 무상태(Stateless)를 지향한다. 즉 서버는 클라이언트의 상태를 보존하지않는다.
예를 들어 서버에서 상태를 유지한 채로 서비스가 진행되면 서버에는 많은 부하가 일어나게 되고 서버가 다운되거나 자료가 삭제가 되는 경우가 발생하면 월급이 날아가는 일이 생겨버린다.
쉽게 말해 맥도날드 점원이 햄버거 주문 콜라 주문 사이드 메뉴 주문 받다가 갑자기 화장실에 가버리면 새로운 점원에게 다시 주문을 해야하는 일이 생겨버린다.
하지만 무상태는 클라이언트에서 데이터를 가공후 서버로 전달하기 때문에 서버에 부하가 적고 서버가 다운되거나 자료가 삭제되도 클라이언트측에서 데이터를 가지고 있기 때문에 데이터 손실 위험도 적다. 그리고 클라이언트의 요청이 증가해도 서버는 상태유지가 필요가 없기 때문에 서버를 무한으로 증설할 수 있다.
맥도날드에서 예전엔 점원에게 주문했지만 요즈음은 키오스크(미들웨어)로 한번에 정보를 전달하기때문에 점원(서버)의 수고가 훨씬 줄었다.
하지만 모든 http상태를 무상태로 하는 것은 아니고 무상태의 한계 또한 있다.. 로그인이나 팝업을 유지할때는 상태를 사용해야하고 클라이언트에서 데이터를 많이 보내기때문에 클라이언트측에서의 과부하또한 일어날 수 있다.
http는 비 연결성(Connectionless)를 지향한다. 즉 클라이언트에서 서버에게 요청을 하면 서버는 응답을 한 후에 즉시 연결을 끊어버린다.
예를들어 컴퓨터01과 서버가 연결을 유지하고있을때 컴퓨터85가 서버에게 새로운 요청을 보내게 되면 서버는 한번에 2가지 이상을 작업을 수행해야함으로 과부하가 걸릴 수 있다. 하지만 비 연결성을 유지하면 서버의 입장에서는 응답을 할 때만 연결을 유지
하면 되기때문에 최소한의 자원을 유지할 수가 있다.
비 연결성의 장점은 다음과 같다.
하지만 비 연결성에는 단점이 있다.
지속연결
로 문제를 해결하고 있다.(즉 모든 파일을 다 다운 받은 후 연결 종료)http로는 모든 것을 전송 할 수 있다. HTML, IMG, 영상, JSON... 심지어 서버간에 데이터를 주고 받을때도 http를 사용한다.
우리가 택배를 보낼때 발신인, 수신인등의 정보를 적듯이 http도 송 수신을 할 때엔 정보를 적어서 보낸다. 이걸 http 메세지라고한다. HTTP의 메시지 구조는 크게
로 이루어져있다. 이건 요청, 응답 메세지 둘다 같다.(요청 메시지의 start-line은 request-line 응답 메세지는 status-line이 온다.)
요청의 start-line request-line의 구성은 다음과 같다
method(메서드) SP(공백) request-target(요청 대상) SP HTTP-version(HTTP버전) CRLF(엔터)
응답의 start-line start-line의 구성은 다음과 같다
HTTP-version(HTTP버전) SP status-code(상태코드) SP reason-pharse(상태코드 나타내는 짧은 글) CRLF로 구성
헤더는 field-name: field-value
로 이루여져있다. 위의 Host 부분에서 Host가 field-name, localhost:8000이 field-value이다. 참고로 field-name 바로 위에 오는 : 는 띄어 쓰기가 안되고 : 다음의 field-value는 띄어쓰기가 가능하다. 그리고 field-name은 대소문자 구문이 없다. header의 용도는 다음과 같다.
실제 전송할 데이터가 들어있다. HTML, JSON, IMG... 바이트로 표현할 수 있는 모든 데이터가 다 들어있다.