Http #3. http의 기본

김동욱·2022년 3월 2일
0
post-thumbnail

1. 기본 구조

http는 클라이언트서버 구조로 이루어져있다.
클라이언트는 http메세지를 통해서 서버에게요청을 서버는 요청 받을 데이터를 토대로 대기를 한다.
요청에 대한 결과가 다 작성되면 대기가 끝나고 클라이언트에게 응답을 한다

클라이언트(요청) => 서버(대기...응답) => 클라이언트(받음)

예전에는 클라이언트와 서버가 하나로 이루어져 있었지만 근래에는 클라이언트와 서버가 따로 분리되어 독립적으로 진화하고 있다
클라이언트는 UI 개발에 집중하고 서버는 비지니스 로직 개발에 집중을 할 수 있게되어 효율적인 작업을 가능케 하였다.


2. 무상태 프로토콜 지향

http는 무상태(Stateless)를 지향한다. 즉 서버는 클라이언트의 상태를 보존하지않는다.

예를 들어 서버에서 상태를 유지한 채로 서비스가 진행되면 서버에는 많은 부하가 일어나게 되고 서버가 다운되거나 자료가 삭제가 되는 경우가 발생하면 월급이 날아가는 일이 생겨버린다.

쉽게 말해 맥도날드 점원이 햄버거 주문 콜라 주문 사이드 메뉴 주문 받다가 갑자기 화장실에 가버리면 새로운 점원에게 다시 주문을 해야하는 일이 생겨버린다.

하지만 무상태는 클라이언트에서 데이터를 가공후 서버로 전달하기 때문에 서버에 부하가 적고 서버가 다운되거나 자료가 삭제되도 클라이언트측에서 데이터를 가지고 있기 때문에 데이터 손실 위험도 적다. 그리고 클라이언트의 요청이 증가해도 서버는 상태유지가 필요가 없기 때문에 서버를 무한으로 증설할 수 있다.

맥도날드에서 예전엔 점원에게 주문했지만 요즈음은 키오스크(미들웨어)로 한번에 정보를 전달하기때문에 점원(서버)의 수고가 훨씬 줄었다.

하지만 모든 http상태를 무상태로 하는 것은 아니고 무상태의 한계 또한 있다.. 로그인이나 팝업을 유지할때는 상태를 사용해야하고 클라이언트에서 데이터를 많이 보내기때문에 클라이언트측에서의 과부하또한 일어날 수 있다.


3. 비 연결성 지향

http는 비 연결성(Connectionless)를 지향한다. 즉 클라이언트에서 서버에게 요청을 하면 서버는 응답을 한 후에 즉시 연결을 끊어버린다.

예를들어 컴퓨터01과 서버가 연결을 유지하고있을때 컴퓨터85가 서버에게 새로운 요청을 보내게 되면 서버는 한번에 2가지 이상을 작업을 수행해야함으로 과부하가 걸릴 수 있다. 하지만 비 연결성을 유지하면 서버의 입장에서는 응답을 할 때만 연결을 유지하면 되기때문에 최소한의 자원을 유지할 수가 있다.

비 연결성의 장점은 다음과 같다.

  • http는 기본적으로 연결을 유지하지 않는 모델이다.
  • 초 단위 이하의 빠른 속도로 응답한다.
  • 수천명이 한 서버를 이용해서 서비스를 이용해도 동시에 처리되는 요청은 수십개 이하일 것이다(수천명이 동시에 버튼을 누르면 모르겠다ㄷㄷ)

하지만 비 연결성에는 단점이 있다.

  • TCP/IP연결을 새로 맺어야한다.
  • HTML뿐 아니라 CSS, JS, IMG등 수많은 자원이 함께 다운로드된다.
  • 지금은 지속연결로 문제를 해결하고 있다.(즉 모든 파일을 다 다운 받은 후 연결 종료)
  • HTTP/2, HTTP/3에는 최적화가 잘 되어있다.

3. 메세지

http로는 모든 것을 전송 할 수 있다. HTML, IMG, 영상, JSON... 심지어 서버간에 데이터를 주고 받을때도 http를 사용한다.

우리가 택배를 보낼때 발신인, 수신인등의 정보를 적듯이 http도 송 수신을 할 때엔 정보를 적어서 보낸다. 이걸 http 메세지라고한다. HTTP의 메시지 구조는 크게

  • start-line
  • header
  • empty line
  • body

로 이루어져있다. 이건 요청, 응답 메세지 둘다 같다.(요청 메시지의 start-line은 request-line 응답 메세지는 status-line이 온다.)

3-1. start-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로 구성

3-2. header

헤더는 field-name: field-value로 이루여져있다. 위의 Host 부분에서 Host가 field-name, localhost:8000이 field-value이다. 참고로 field-name 바로 위에 오는 : 는 띄어 쓰기가 안되고 : 다음의 field-value는 띄어쓰기가 가능하다. 그리고 field-name은 대소문자 구문이 없다. header의 용도는 다음과 같다.

  • http 전송에 필요한 모든 부가 정보
  • 바디의 내용, 크기, 인증, 브라우저 정보 등등...
  • 필요에 따라 헤더 추가가 가능하다.

3-3. body

실제 전송할 데이터가 들어있다. HTML, JSON, IMG... 바이트로 표현할 수 있는 모든 데이터가 다 들어있다.

profile
안녕하세요. 부산에서 근무하고 있는 프론트엔드 개발자 김동욱입니다. 영어 공부 겸 개발 공부를 위해서 글을 작성하고있습니다.

0개의 댓글