본문 바로가기

CS/HTTP

HTTP란? HTTP의 특징, 메시지의 구조

HTTP?

HTTP란 HyperText Transfer Protocol로 문서 간의 링크를 전송하는 프로토콜이다.

HTML 메시지에 HTML 뿐만 아니라 텍스트나 이미지, 음성, 영상 JSON 등 거의 모든 형태의 데이터가 전송이 가능하며 서버간의 데이터 전송 시에도 대부분 HTTP를 사용한다.

 

현재 주로 사용하는 HTTP/1.1과 HTTP/2는 TCP를 기반으로 하고 있다.

 

 

HTTP의 특징

1️⃣ 클라이언트 서버 구조

  • Request Response 구조
  • 클라이언트가 서버에 요청을 보내고 응답을 대기
  • 서버가 요청에 대한 결과를 만들어 응답
  • 비즈니스 로직과 데이터는 모두 서버가 처리하고 UI 등은 클라이언트가 처리한다
  • 클라이언트와 서버의 분리를 통해 클라이언트와 서버가 각각의 성장이 가능!

2️⃣ Stateless (무상태 프로토콜)

서버가 클라이언트의 상태를 보존하지 않기 때문에 클라이언트는 이어지는 요청이라도 반복해서 보내야 한다

예) 햄버거 주문 → 햄버거 세트 주문 → 햄버거 세트 2개 주문 → 햄버거 세트 2개, 신용카드로 결제

 

❓ Stateful(상태 유지)라면?
햄버거 주문 → 세트 → 2개 → 신용카드 결제

하지만 결제 진행 중 오류가 발생하면 클라이언트는 처음부터 다시 요청을 시작해야 한다
만약 중간에 서버가 변경된다면 다른 서버에게 상태 정보를 전달해야 한다

 

장점 : 데이터를 저장해두지 않아도 되기 때문에 응답 서버를 쉽게 바꿀 수 있으며 서버의 확장성이 높다

단점 : 클라이언트가 너무 많은 데이터를 보내게 된다

 

3️⃣ 비연결성(Connectionless)

  • HTTP는 기본이 연결을 유지하지 않는 모델
  • 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작다
    • 사람들이 연속적으로 검색 버튼을 누르지 않는다
  • 서버의 자원을 매우 효율적으로 사용할 수 있다
  • BUT, 요청마다 TCP/IP 연결을 새로 맺어야 하기 때문에 3 way handshake 시간이 추가된다
    • 웹 브라우저 사이트를 요청하면 HTML, JS, CSS, 이미지 등 수많은 자원이 함께 다운로드 된다
  • 현재는 HTTP 지속 연결(Persistent Connections)로 문제를 해결

 

 

연결을 계속 유지한다면?

서버의 자원이 계속 소모되고 한 번 연결을 해두면 클라이언트가 요청을 이어가지 않더라도 계속 연결을 유지해야 한다...

 

연결을 유지하지 않는다면?

요청이 완료되면 연결을 끊고 새로운 요청을 할 때마다 연결을 새로 맺는다

 

HTTP 메시지

요청 메시지

start-line

request-line(method SP(공백) request-target SP HTTP-version CRLF(공백 라인))

method(메소드)

GET, POST, PUT, DELETE 등으로 서버가 수행해야 할 동작을 지정한다

request-target(요청 메시지, 요청 대상)

absolute-path[?query] : 절대경로(/로 시작하는 경로)

 

응답 메시지

start-line

status-line(HTTP-version SP status-code SP reason-phrase CRLF)

header

header-field : field-name: OWS(공백 허용) field-name OWS

  • field-name은 대소문자 구분❌
  • Body를 제외하고 HTTP 전송에 필요한 모든 부가정보를 포함
    • 메시지 바디의 내용, 바디의 크기, 압축, 인증, 요청 클라이언트 정보 등
  • 필요시 임의의 헤더를 추가 가능하다

message-body

  • 실제 전송할 데이터
  • HTML 문서, 이미지, 영상 JSON 등 Byte로 표현 가능한 모든 데이터를 전송 가능

 


📚 Reference

[인프런] 모든 개발자를 위한 HTTP 웹 기본 지식

 

'CS > HTTP' 카테고리의 다른 글

🌐 TCP와 UDP 정리  (0) 2021.02.05
HTTP 메소드의 종류와 특징, 속성  (0) 2021.01.13
주소창에 URL을 입력하면 일어나는 일  (0) 2020.12.31
URI vs URL vs URN  (0) 2020.12.31