HTTP란?
HTTP(Hyper Text Transfer Protocol)란 서버/클라이언트 모델을 따라 데이터를 주고받기 위한 프로토콜이다.
인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약으로, 80번 포트를 사용한다.
HTTP는 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동된다.
HTTP는 Stateless, Connectionless와 같은 특징을 갖고 있으며 Method, Path, Version, Headers, Body 등으로 구성된다.
무상태(Stateless)
Stateful은 서버가 클라이언트의 이전 상태를 보존한다는 의미이다.
반대로 Stateless는 서버가 클라이언트의 이전 상태를 보존하지 않는다는 의미이다.
따라서 HTTP 는 어떤 클라이언트가 요청을 한 것인지 식별할 수가 없다.
Stateful
- 클라이언트 : 춘천으로가는 버스 티켓 얼마인가요?
- 서버 : 5000원 입니다.
- 클라이언트 : 2장 주세요.
- 서버 : 네. 합해서 만원입니다. 결제는 무엇으로 하시겠습니까?
- 클라이언트 : 현금으로 하겠습니다.
- 서버 : 결제 완료되었습니다.
위와 같이 서버가 사야 하는 티켓의 정보와 개수의 정보를 서버가 기억하고 저장하고 있다. 이것을 Stateful 하다고 한다.
Stateless
- 클라이언트 : 춘천으로 가는 버스 티켓 얼마인가요?
- 서버 : 5000원입니다.
- 클라이언트 : 2장 주세요.
- 서버 : 무엇을 2장 달라고 하시는 거죠..?
- 클라이언트 : 춘천 가는 버스 티켓이라고 했잖아요!
위와 같이 서버가 클라이언트가 이전에 했던 요청사항을 하나도 기억하지 못한다. 이것을 Stateless 하다고 한다.
Stateful은 일상에서와 같이 대화 간의 문맥(상태)을 유지하고 관리한다.
Stateful은 대화가 오고 갈 때마다 문맥을 저장해야 하기 때문에 항상 같은 서버가 유지되어야 한다.
Stateless 같은 경우 요청할 때마다 자신이 필요한 모든 정보를 요청하기 때문에 서버가 중간에 바뀌더라도 응답을 받을 수 있다. 따라서 여러 개의 서버를 무한히 증설해서 클라이언트의 요청이 증가해도 해결할 수 있다.
하지만 모든 것을 Stateless로 설계할 수 없다. 쇼핑몰의 장바구니와 로그인과 같은 경우는 사용자의 정보를 서버에 유지시켜줘야 한다. 이 경우 쿠키, 세션 등을 사용해 상태를 유지할 수 있다.
비연결성 connectionless
TCP/IP는 연결을 유지한다.
클라이언트 1이 요청을 보내면 서버가 응답하고 연결을 유지한다.
클라이언트 2가 요청을 보내면 서버가 응답하고 연결을 유지한다.
....
이렇게 클라이언트가 요청을 보내지 않는 상황이어도 무수히 많은 연결을 계속해서 유지하고 있어야 하기 때문에 불필요한 리소스가 낭비된다.
HTTP의 비연결성
HTTP는 기본적으로 연결을 유지하지 않는다.
요청이 있을 때만 연결 후 응답을 하고 연결을 끊어버린다.
서버는 요청을 주고받을 때만 연결을 유지하기 때문에 최소한의 자원만을 사용할 수 있다.
비연결성의 한계
TCP/IP 연결은 매번 새로 맺어야 한다.
TCP 연결은 3 way handshake를 매번 해야 하기 때문에 RTT(Round Trip Time)로 인한 지연 시간이 발생한다.
하지만 이를 해결하기 위해 HTTP2는 하나의 연결을 통해 병렬로 파일을 전송할 수 있는 기술을,
HTTP3는 TCP가 아닌 UDP를 활용한 기술로 개선되었다.
자세한 내용 : https://brightstarit.tistory.com/4
HTTP 메시지
HTTP 메시지는 HTTP 요청 메시지와 HTTP 응답 메시지로 구분한다.
기본적으로 HTTP 메시지 구조는 아래와 같다.
start-line 시작 라인
header 헤더
empty line 공백 라인(CRLF, 필수)
message body
HTTP 요청 메시지 예시
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
(CRLF)
message body
HTTP 응답 메시지 예시
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 4432
(CRLF)
message body
시작 라인
요청 메시지
GET /search?q=hello&hl=ko HTTP/1.1
request-line으로 불린다.
request-line = HTTP 메서드(SP: 공백)요청 대상(SP : 공백)HTTP 버전 CRLF
응답 메시지
HTTP/1.1 200 OK
status-line으로 불린다.
status-line = HTTP 버전(SP: 공백)상태 코드(SP : 공백)상태 문구(reason-phrase) CRLF
HTTP 헤더
Host: www.google.com
Content-Type: text/html;charset=UTF-8
Content-Length: 4432
header-field = 필드 이름":" (OWS: 띄어쓰기 허용) 필드 값 (OWS)
필드 이름: 필드 이름은 대소문자 구분 없음. 필드 이름 다음에 띄어쓰기 없이 ":"가 와야 함.
HTTP 헤더는 HTTP 전송에 필요한 부가 정보가 들어있다.
필요시 임의의 헤더도 추가할 수 있다.
message body
message body는 실제 전송할 데이터이다. HTML, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터를 전송할 수 있다.
'백엔드 > 네트워크' 카테고리의 다른 글
[네트워크] 포워드 프록시(forward proxy)와 리버스 프록시(reverse proxy) (0) | 2023.04.22 |
---|---|
[네트워크] HTTPS (0) | 2023.04.20 |
[네트워크] HTTP/2 (0) | 2023.04.18 |
[네트워크] OSI 7 Layer (1) | 2023.04.18 |