HTTP란?
http는 Hyper Text Transfer Protocol의 약자이다.
처음 시작은 하이퍼 텍스트를 전송하는 프로토콜로 시작하였으나 현대에는 거의 모든 형태의 데이터 전송이 가능하다.
또한 서버간의 데이터를 주고 받을 때도 대부분 HTTP를 사용한다.
현재 가장 많이 사용되는 버전은 HTTP/1.1로 대부분의 기능이 다 들어있으며 그 위의 버전은 대부분 성능 개선에 초점이 맞추어져 있다.
또한, HTTP/1.1, HTTP/2는 TCP 기반으로 동작하며 HTTP/3는 UDP에서 동작한다.
HTTP의 특징
HTTP는 클라이언트 서버 구조로 동작하며 무상태 프로토콜(스테이스리스), 비연결성이란 특징을 지닌다.
또한, HTTP 메시지를 통해 통신을 하며 단순하고 확장이 가능하다는 특징이 있다.
그럼 HTTP의 각 특징들에 대해서 자세하게 살펴보자.
1. 클라이언트 서버 구조
HTTP는 클라이언트가 HTTP 메시지를 통해 서버로 요청을 보내고 대기하면 서버가 요청을 받고 응답을 보내는 구조이다.
이렇게 클라이언트와 서버의 역할이 분리되는 것이 중요한 이유는 이렇게 역할이 분리되면 클라이언트는 UI,UX기능에만 신경쓰고 서버는 서비스 로직등 주요 로직만 처리하여 클라이언트와 서버가 독립적으로 진화할 수 있기 때문이다.
2. 무상태 프로토콜
HTTP는 무상태 프로토콜을 지향한다.
무상태(Stateless)라는 말은 서버가 클라이언트의 상태를 보존하지 않는다는 의미이다.
이는 상태를 유지해야하는 Stateful과 큰 차이를 보인다.
상태를 유지한다는 것은 서버가 클라이언트의 이전 상태를 보존하는 것이다.
바꿔 말하면 상태를 유지한다는 것은 컨텍스트가 중간에 바뀌면 장애가 발생한다는 것이다.
또한 만약 서버에 장애가 나 다른 서버로 바뀌는 경우 클라이언트는 처음부터 다시 요청을 시작해야한다.
하지만 무상태인 경우 중간에 컨텍스트가 바뀌어도 상관이 없다.
따라서 갑자기 클라이언트 요청이 증가해서 서버를 대거 투입할 수 있으며 이는 응답 서버를 쉽게 바꿀 수 있다는 것이기에 무한한 서버 증설이 가능하다.
일반적으로 스케일 아웃이라고 부르는 수평확장에 굉장한 이점을 가진다.
다만 한계점도 있는데, 우선 모든것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.
무상태는 로그인이 필요없는 단순한 서비스 소개화면에서는 사용가능 하지만 로그인이 필요한 경우 서버에 로그인 했다는 상태를 유지해야 하므로 무상태로는 구현이 어렵다.
따라서 이런경우에는 상태유지로 만들어야 한다.(다만 상태유지는 필요한곳에 최소한으로 사용하는 것이 좋다)
또한 요청이 많다는 단점도 있다.
3.비연결성(connectionless)
TCP/IP가 연결을 유지하는 모델이라면 HTTP는 연결을 유지하지 않는 단방향 통신이다.
연결을 유지하는 경우 서버는 클라이언트가 놀고 있더라도 연결을 유지하며 서버 자원을 소모하여야 한다.
하지만 연결을 유지하지 않는 모델은 필요한 요청과 응답만 주고 받고 연결을 끊어버리면 되기에 서버 입장에서는 필요한 자원을 최소화 할 수 있다는 장점이 있다.
HTTP는 일반적으로 초단위 이하의 빠른 속도로 응답을 하며 앞서 말한 비연결성 모델이므로 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 매우 작다.
따라서 서버 자원을 매우 효율적으로 사용할 수 있는 것이다.
비연결성의 단점은 TCP/IP 연결을 새로 맺어야 하므로 3 way handshake 시간이 추가가 된다.
또한 웹 브라우저로 사이트를 요청하면 HTML 분만 아니라 JS,css같은 수많은 자원이 함께 다운로드된다.
이런 문제를 해결하기 위하여 지속 연결(Persistent Connections)을 통하여 자원을 한번에 받아 따로따로 요청받고 응답받는 시간을 단축하였다.
4. HTTP 메시지
HTTP는 요청과 응답 메시지가 존재한다.
메세지는 start-line(시작라인), header(헤더), emptyLine(공백라인,CRLF),Message Body의 구조를 가진다.
그럼 구조를 하나하나 자세하게 살펴보자.
- Start-line
시작 라인은 request-line과 status-line으로 구분된다.
요청메시지는 request-line이라고 하며 method, 공백, request-target, 공백, http 버전이 들어가게 된다.
HTTP 메서드에는 GET,POST,PUT,DELETE 등등이 들어가게 되며 서버가 수행해야 할 동작을 지정한다.
request-target에는 요청대상이 들어가게 되며 절대경로로 보통 시작하게 된다.
절대경로란 "/"로 시작하는 경로를 말하며 다른 유형의 경로 지정 방법도 존재한다.
반대로 응답 메시지는 Status-line이며 http 버전, 공백, status-code, 공백, reason-phrase 로 구성된다.
이중 status 코드는 상태코드라고 하여 요청 성공, 실패를 나타낸다.
흔히 200, 403, 502 같은 코드들을 한번쯤 본적이 있을것이다.
reason-phrase는 상태코드를 사람이 이해할 수 있는 짧은 상태 코드 설명 글이라고 생각하면 된다.
- Header
헤더에는 headeer-field가 있으며 필드는 field-name , ":", OWS(띄워쓰기 허용) ,field-value의 구조로 이루어 진다.
field-name에는 대소문자 구분이 없다.
예를 들어 Host: www.naver.com에서 서 host는 Fieldname, "www.naver.com"은 field-value가 된다.
헤더의 용도는 HTTP 전송에 필요한 모든 부가정보를 기록하기 위함이다.
예를 들어, 메시지 바디의 내용, 크기, 압축, 인증, 요청 클라이언트 정보, 서버 애플리케이션 정보 등이 있다.
사실상 Body를 제외한 Meta Data정보가 다 들어있다고 생각해도 좋다.
- 메시지 바디
바디에는 실제 전송할 데이터가 들어간다.
HTML 문서, 이미지, 영상, JSON등 Byte로 표현할 수 있는 모든 데이터를 전송할 수 있다.
만약 압축해서 보내면 압축된 내용이 들어가게 된다.
'HTTP' 카테고리의 다른 글
HTTP - HTTP 메서드의 속성 (0) | 2024.01.11 |
---|---|
HTTP - HTTP 메서드 (2) (0) | 2024.01.11 |
HTTP - HTTP 메서드 (0) | 2024.01.10 |
HTTP - URI와 웹 브라우저 요청 흐름 (2) | 2024.01.08 |
HTTP - 인터넷 네트워크에 대하여 (2) | 2024.01.07 |