과정을 즐기자

HTTP 특징 본문

Network

HTTP 특징

320Hwany 2022. 12. 15. 10:38

HTTP란?

HTTP는 HyperText Transfer Protocol의 약자로 HTML 문서를 주고 받을 수 있는 프로토콜이다.
하지만 HTML뿐만 아니라 Text, 이미지, 음성, 파일, JSON 거의 모든 형태의 데이터를 전송할 수 있다.

HTTP 특징

  1. 클라이언트 서버 구조

HTTP 메세지에는 요청 메세지, 응답 메세지가 있다. 클라이언트가 서버에 요청을 하고 서버가 클라이언트에게 응답을 하는 구조이다.
이렇게 역할을 분담을 하는 것이 중요하다. 클라이언트 문제면 클라이언트만 확인하면 되고 서버에 문제가 있으면 서버 쪽만 확인하면 된다.

  1. 무상태 프로토콜 (Stateless)

무상태 프로토콜이라는 것은 클라이언트의 상태를 서버에 저장하지 않는다는 것이다. 다시 말해 서버가 클라이언트의 상태를 몰라도 된다는 말이다.
예를들어 고객이 클라이언트고 점원이 서버라고 해보자. 고객은 사과 10개를 신용카드로 산다고 점원에게 말한다고 해보자.

  • 서버가 클라이언트의 상태를 유지하는 경우

먼저 고객이 어떤 것을 살 지를 점원에게 말하고 몇 개 살지를 말하고 어떤 것으로 결제할 지를 말한다고 해보자.
(사과를 산다, 10개 산다, 신용카드로 결제는 모두 각각 다른 요청이다)
점원이 전의 내용의 기억하므로 (서버가 클라이언트의 상태를 유지) 문제가 없다.
하지만 만약에 점원이 바뀐다면? 다른 점원은 고객의 상태를 모르기 때문에 다시 처음부터 말을 해야한다.
(10개를 산다고 말했지만 무엇을 10개 사는 지를 점원은 모른다)

어떤 한 점원이 일을 못하게 된다면 그때까지 담당하던 고객의 정보를 다른 점원이 모른다.

  • 서버가 클라이언트의 상태를 유지하지 않는 경우

이를 해결하기위해서는 고객은 점원이 전에 말한 정보를 모른다고 생각하고 한번에 사과 10개를 신용카드로 산다고 말하면 된다.
(각각의 다른 요청이지만 전의 내용을 점원이 기억하는 것이 아니고 고객이 다시 한번 말을 해준다.)
이렇게하면 점원이 바뀌더라도 요청을 처리할 수 있다.

다시 클라이언트 서버로 돌아와서 무상태 프로토콜은 어떤 한 서버가 장애가 나더라도 다른 서버가 그 요청을 처리할 수 있다.
또한 서버를 늘려도 같은 기능을 처리할 수 있기 때문에 스케일 아웃, 수평 확장에 좋다.

하지만 무상태 프로토콜의 단점도 있는데 아무래도 보내야 하는 데이터의 양이 많아질 수 밖에 없다.
또한 쿠키, 세션을 통해서 로그인을 할 때는 서버에서 세션 정보를 유지를 해야 로그인을 유지할 수 있다.
이럴 때는 상태 유지를 해야한다. 하지만 상태 유지도 최소한만 사용하여 설계하자.

  1. 비 연결성(connectionless)

클라이언트와 서버의 연결을 계속해서 유지한다면 서버 자원이 소비된다. 이러한 문제 때문에 HTTP는 서버는 연결을 유지하지 않는 비 연결성을 사용하는데
TCP/IP 연결을 새로 맺어야 하기 때문에 이것은 또 시간이 더 걸리게 된다. 따라서 HTTP 지속 연결(Persistent Connections)로 해결하였고
또한 HTTP/2, HTTP/3에서는 이러한 연결도 더 최적화 되어있다.

HTTP 메세지

HTTP 메세지는 요청 메세지, 응답 메세지가 있다. 메세지 구조는 약간 다르지만 공통적으로 start-line(시작 라인), header(헤더),
empty-line(공백 라인), message body로 이루어져 있다.

  1. start-line(시작 라인)

start-line 요청 메세지에서는 request-line, 응답 메세지에서는 status-line이라고 한다.
request-line의 스펙은 (HTTP 메소드) + (Path, query) + (HTTP version)이다.
예를들면 GET /search?q=JAVA HTTP/1.1와 같이 이루어질 수 있다.

status-line의 스펙은 (HTTP 버전) + (Status Code) + (response-phrase)이다.
예를들면 HTTP/1.1 200 OK와 같이 이루어질 수 있다. 여기서 response-phrase는 사람이 이해할 수 있는 짧은 status code 설명글이다.

  1. HTTP header

HTTP 전송에 필요한 모든 부가정보가 들어있다. (메세지 바디 내용, 메세지 바디 크기, 압축, 인증, 요청 클라이언트 정보...)
header는 header-field만 있고 field-name ":" (띄어쓰기 허용) field value (띄어쓰기 허용)으로 이루어져 있다.
header-field 종류는 Host, Content-Type, Content-Length 등이 있고 자세한건 다른 글에서 설명하겠다.

  1. empty-line

header와 message body 사이의 공백은 반드시 있어야 한다.

  1. HTTP Message Body

실제 전송할 데이터가 들어있다. HTML 문서, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터가 전송 가능하다.

출처 : 모든 개발자를 위한 HTTP 웹 기본 지식 (김영한)