HTTP 웹 기본 지식 step-3 모든 것이 HTTP, HTTP의 주요 특징

배인성·2022년 5월 9일
0

HTTP

목록 보기
3/7

HTTP

HTTP란 HyperText Transfer Protocol 이고, 초기에는 문서간의 링크를 통해서 연결할 수 있는 html을 전송하는 것이 시작이었는데, 지금은 모든 형태의 데이터를 전송할 수 있다.

HTTP는 여러 버전이 있는데, 지금 가장 많이 쓰이는 것은 HTTP 1.1 버전이다.

HTTP 1.1은 기본적으로 TCP기반이고, 현재 UDP 기반의 HTTP 3이 개발되고 있는데

UDP의 특성을 공부한 이후라서, HTTP 3버전이 굉장히 기대된다 ㅋㅋ (얼마나 빠를지)

HTTP의 특징

  • 클라이언트 서버 구조
  • 무상태 프로토콜(Stateless) 지향
  • 비연결성
  • HTTP 메세지를 통해 통신을 한다.
  • 단순하고 확장가능함

밑에서부터 하나씩 살펴보도록 하겠다!

클라이언트 서버 구조


1. 클라이언트(웹 브라우저 또는 애플리케이션)에서 서버에 요청을 보낸다.
2. 서버는 요청에 대한 응답을 클라이언트에게 보낸다.

HTTP는 위와같은 구조를 기반으로 하고있다.

ps

옛날에는 클라이언트와 서버와 같은 개념이 없었다고 한다.

시간이 지날수록 클라이언트와 서버를 개념적으로 구분하기 시작했고, 이를 통해 각자 독립적으로 기술이 발전할 수 있었다고 한다!

무상태 프로토콜

이게 무슨말인가 싶지만, 제일 중요한 것은 서버가 클라이언트의 상태를 보존하지 않는다는 것이다.

그래도 저 말이 와닿지가 않았다.

그러나 여기서 김영한 강사님의 아아아아아아아아주 좋은 예시가 있다.

무상태(Stateless)를 와닿게 설명하기 위해 상태 유지(Stateful)한 예부터 말해보도록 하겠다.

Stateful Example

고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다.

고객 : 2개 구매하겠습니다.
점원 : 200만원 입니다. 신용카드나 현금 중 어떻게 결제하시겠어요?

고객 : 신용카드로 결제하겠습니다.
점원 : 200만원 결제되었습니다.

정말 일상적인 대화스럽다!

여기서 Stateless한 예제를 보면 확 와닿을 것이다.

Stateless Example

고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다.

고객 : 2개 구매하겠습니다.
점원 : ??? 무엇을 2개 구매하시겠다는건가요??

고객 : 신용카드로 결제하겠습니다.
점원 : 엥 무엇을 몇 개 신용카드로 결제한다는건가요..??

이상태가 되어버린다. 그러니까 점원은 고객의 상태를 모른다.

즉, 저 가게는 너무나도 바빠서 점원1, 점원2, 점원3이 각각을 대답하고 있는 것이다.

이를 해결하기 위해서, 고객이 말을 조금 더 할 필요가 있다.

고객 : 이 노트북 얼마인가요?
점원1 : 100만원 입니다.

고객 : 노트북 2개 구매하겠습니다.
점원2 : 노트북 2개는 200만원입니다. 결제는 신용카드나 현금중 어떻게 도와드릴까요?

고객 : 이 노트북 2개를 신용카드로 결제하겠습니다.
점원3 : 200만원 결제 완료되었습니다.

자! 이렇게 되면, 점원이 바뀐다 하더라도 고객의 요구사항이 점차 자세해져서 결제를 할 수 있다.

이것이 Stateless, 무상태 프로토콜의 메커니즘이다.

이렇게되면 어떤 점원이 와도 요청에 응대할 수 있는 것은 장점이지만

고객이 말을 더 많이해야하는 것, 즉 클라이언트가 추가적으로 데이터를 전송해야한다는 것은 단점이 된다.

비연결성

또한, HTTP는 기본적으로 연결을 유지하지 않는다.

그러니까 한번 요청이 들어오면, 응답을 준 후 연결을 끊어버린다.

연결을 유지하게 되면 그림 예시가 다음과 같다.

이런식으로, 서버는 연결을 계에에에속 유지하면서 서버의 자원을 소모하게 된다.

1번 2번이 놀고있을때에도 연결을 유지해야하고 등등!

이제 비연결성이란, TCP/IP 연결을 하고나서 응답과 동시에 연결을 끊어버리는 것인데

이렇게 되면 서버의 자원을 효율적으로 사용할 수 있다는 장점이 있다.

그러나 매 요청마다 TCP/IP 연결(3 way handshake)을 새로 맺어야 한다는 단점이 있고, 속도적인 면에서 단점이 부각되게 된다.

그래도 HTTP는 기본적으로 연결을 유지하는 모델!

HTTP 메세지

HTTP 메세지는 기본적으로 다음과 같은 구조를 가진다.

  1. Start-line
  2. Header (헤더)
  3. 공백
  4. 메세지 바디

이제 여기서 요청 메세지냐, 응답 메세지냐로 나뉘게 되는데

1.요청 메세지

다음 요청 메세지를 해부해보자!

GET /search?q=hello&hl=ko HTTP/1.1
HOST:www.google.com

1-1.Start-line

요청 메세지의 Start-line의 예시!

GET /search?q=hello&hl=ko HTTP/1.1

(HTTP Method)(/path)?(query) (HTTP version)

이렇게 총 네 부분으로 나뉜다.

1-2.헤더

HOST:www.google.com

음.. 간단하다 그냥 호스트명이 들어간다.

1-3.공백

공백은 요청 응답 할 것없이 그냥 HTTP 메세지 스펙 상 필수다.

1-4.메세지 바디

예시에는 비워져있지만, 요청 메세지에도 메세지 바디가 있을 수 있다! (POST 요청)

2.응답 메세지

다음의 응답 메세지를 해부해보자.

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
(공백)
<<메세지 바디>>

2-1.Start-line

HTTP/1.1 200 OK

HTTP version과 HTTP 상태코드
로 이루어져있다.

곧 포스팅에 HTTP 상태코드를 정리할 것이지만 200은 그냥 응답이 잘 됐다는 뜻이다.

2-2.헤더

Content-Type: text/html;charset=UTF-8
Content-Length: 3423

여기에는 HTTP 전송에 필요한 모든 부가정보가 들어간다.

예를 들어, 메세지 바디 내용, 메세지 바디 크기, 압축, 인증 등등 더 많은 정보가 들어간다.

2-3.공백

아까 말했듯이 공백은 필수

2-4.메세지 바디

<<메세지 바디>>

라고 표기해두었지만, html이 들어갈 수도 있고 이미지 영상 JSON 등등 Byte로 표현할 수 있는 모든 데이터가 들어갈 수 있다고 한다.

정말 단순한 HTTP

내가 포스팅에 재주가 없어서 가독성이 잘 없지만, 그냥 공부하면서 느낀것은 정말 단순하다.

이 정도만 알아도 뭔가 백엔드 개발중에 생기는 오류 다수를 해결할 수 있을 것 같은 자신감이 생긴다 ㅋㅋ

profile
부지런히 살자!!

0개의 댓글