봄디의 개발일지
[HTTP] HTTP 란 ? 본문
1️⃣ HTTP 란 ?
HTTP 란 HyperText Transfer Protocol 의 줄임말로, 현재는 HTTP 메시지에 모든 것을 전송합니다.
HTML 텍스트뿐만 아니라 이미지, 음성, 영상, 파일 그리고 서버끼리 통신할 때 사용하는 JSON, XML 등등 거의 모든 형태의 데이터를 다 전송할 수 있습니다.
그리하여 지금은 HTTP 시대 !! 라고 말할 수 있습니다.
HTTP 버전 중에 HTTP/1.1 을 가장 많이 사용하고 있습니다.
그 이후로도 HTTP/2 , HTTP/3 이 나왔지만 HTTP/1.1 에 성능 개선이 추가된 거라고 생각하시면 됩니다.
HTTP/1.1 과 HTTP/2 는 TCP 프로토콜을 기반으로 동작하며, HTTP/3 은 UDP 기반으로 개발이 되어있습니다.
HTTP 의 특징으로는 아래와 같습니다.
- 클라이언트 서버 구조
- 무상태 프로토콜 (Stateless), 비연결성
- HTTP 메시지
- 단순함, 확장 가능
하나씩 HTTP 특징에 대해 설명해드리겠습니다.
2️⃣ 클라이언트 서버 구조
HTTP 는 클라이언트와 서버 구조로 이루어져 있습니다. 클라이언트가 HTTP 메시지를 통해서 서버에 요청을 보내면, 클라이언트는 서버로부터 응답이 올 때까지 기다립니다. 서버가 요청에 대한 결과를 만들어서 클라이언트에게 응답을 하면 응답 결과를 얻어서 클라이언트가 동작합니다.
여기서의 핵심은 클라이언트와 서버가 분리되어 있으므로 각 독립적으로 발전할 수 있다 ! 라는 것 입니다.
3️⃣ 무상태 프로토콜 (Stateless) 비연결성
Stateless 하다는 것은 서버가 클라이언트의 상태를 보존하지 않는 것을 의미합니다.
상태를 유지하지 않는 Stateless 가 무엇인지 더 자세히 알아보겠습니다.
예) 스타벅스에 음료를 주문하러 간 상황
Stateful (상태 유지가 된 경우)
고객 : 초코칩 프라푸치노 하나 얼마인가요?
점원 : 6000원입니다. (초코칩 프라푸치노 상태 유지)
고객 : 2개 주세요.
점원 : 12000원입니다. 휘핑크림은 올려드릴까요? (초코칩 프라푸치노, 2개 상태 유지)
고객: 휘핑크림은 빼주세요.
점원: 결제 완료되었습니다. (초코칩 프라푸치노, 2개, 휘핑크림 제거 상태유지)
위의 경우 주문하는 중간에 점원이 바뀐다면, 어떤 제품을 2개 달라는 것인지, 어떤 제품을 휘핑크림을 빼달라는 건지 이해를 못하는 경우가 발생합니다. 즉, 위의 상황에서는상태가 유지된 경우를 의미합니다.
이 경우에는 클라이언트 하나가 서버 하나를 계속 붙잡아야하는 경우가 생기고, 해당 서버가 고장나면 다른 서버로 넘어갈 때 처음부터 주문을 다시 해야하는 경우가 발생합니다.
Stateless (상태를 유지하지 않는 경우)
고객 : 초코칩 프라푸치노 하나 얼마인가요?
점원 : 6000원입니다.
고객 : 초코칩 프라푸치노 2개 주세요.
점원 : 12000원입니다. 휘핑크림은 올려드릴까요?
고객: 초코칩 프라푸치노 2개 휘핑크림은 제거해주세요.
점원: 결제 완료되었습니다.
위의 경우에서는 중간에 점원이 바뀌는 경우가 있어도 주문을 무사히 할 수 있고, 고객이 갑자기 증가해도 점원을 대거 투입할 수 있습니다.
주문을 할 때마다 필요한 모든 정보를 담아서 말을 하기 때문입니다.
Stateless 무상태인 경우, 마찬가지로 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있습니다.
즉, 무상태는 응답 서버를 쉽게 바꿀 수 있고 엄청난 확장성을 가져올 수 있습니다.
중간에 서버가 장애가 발생하더라도, 상태를 보관하지 않기 때문에 다른 서버로 전달하여 원하는 결과를 얻을 수 있습니다.
하지만, 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있습니다.
로그인이 필요 없는 단순한 서비스 소개 화면 - 무상태 가능
로그인 - 상태 유지가 필요함
로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지해야합니다.
일반적으로는 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지합니다.
결론적으로 상태 유지는 최소한만 사용하고, 무상태를 유지하는 것이 중요합니다 !!
4️⃣ 비 연결성 (Connectionless)
- 연결을 유지하는 경우
클라이언트1이 서버에 접속해서 요청을 보내고 응답을 하고, 그 다음에 클라이언트2도 접속해서 요청해서 서버에서 응답하고, 클라이언트3도 서버에 접속해서 요청을 보내고 응답을 하는 경우, 클라이언트1은 계속 접속이 되어 있는 상태입니다.
그 이후에 클라이언트1이 다시 요청을 하고 응답을 하는 경우에도 다른 클라이언트2,3은 연결이 계속 유지되고,
서버의 자원을 계속해서 소모하게 됩니다.
- 연결을 유지하지 않는 경우
연결을 유지하지 않는 경우에는 원하는 요청이 있을 때 클라이언트와 서버를 연결해서 요청을 보내고 응답을 받습니다.
할 일이 다 끝났기에 연결 상태를 계속 유지하지 않고 연결을 종료합니다.
다른 클라이언트도 마찬가지로, 요청하고 응답하고 일이 다 끝난 경우에 연결을 끊어 종료합니다.
위와 같은 연결을 유지하지 않는 경우에는 서버에서 유지하는 자원을 최소한으로 줄일 수 있습니다.
HTTP 는 기본이 연결을 유지하지 않는 모델입니다. (비 연결)
따라서 초 단위의 이하의 빠른 속도로의 응답이 가능하고, 서버 자원을 매우 효율적으로 사용할 수 있습니다.
✅ 비 연결성의 한계
요청,응답을 하고 연결을 바로 끊기 때문에 매번 TCP/IP 연결을 새로 맺어야 한다는 단점이 있습니다.
매번 새로 연결을 해야 하므로 3 way handshake 의 시간이 추가됩니다.
웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등 수 많은 자원이 함께 다운로드가 되는데 받을 때마다 연결을 하면 너무 비효율적입니다.
따라서 지금은 HTTP 지속 연결을 사용하여 문제를 해결하고 있습니다.
🔍 참고글
인프런 김영한 강사님의 [모든 개발자를 위한 HTTP 웹 기본 지식] 섹션 3. HTTP 기본 강의를 참고하여 작성했습니다.
'HTTP' 카테고리의 다른 글
[HTTP] HTTP 메서드 활용 (2) | 2024.09.29 |
---|---|
[HTTP] HTTP 상태코드 (100~500대 상태코드 총정리) (0) | 2024.09.29 |
[HTTP] HTTP 메서드 (GET, POST, PUT, PATCH, DELETE) (0) | 2024.09.29 |
[HTTP] URI 와 웹 브라우저 요청 흐름 (0) | 2024.09.15 |
[HTTP] 인터넷 네트워크 (IP, TCP/UDP, DNS) (2) | 2024.09.15 |