CS/네트워크

[inflearn] 모든 개발자를 위한 HTTP 웹 기본 지식 (2)

HYJJ 2022. 1. 21. 16:51

웹 브라우저 요청 흐름

웹 브라우저 -> 구글 서버 [예]

 

: 구글 서버를 찾기 위해 DNS를 조회. (https 경우 port 443 생략)

: HTTP 요청 메시지 존재 

 

1. 웹 브라우저가 HTTP 메시지 생성.

2. SOCKET 라이브러리 통해 전달

( OS의 TCP/IP 계층에 전달 )

3. TCP/IP 패킷 생성, HTTP 메시지 포함.

 

-> 수많은 인터넷 노드를 통해 해당 IP 주소로 전달.

서버에서 HTTP 메시지를 확인해서 HTTP 응답 메시지를 만들어냄.

 

-> 응답 패킷 전송

: HTTP 메시지를 렌더링 함. 결과를 보게 됨.

 

 

 HTTP (HyperText Transfer Protocol)

거의 모든 것을 HTTP에 담아서 전송. (JSON, XML, 이미지, 파일, HTML, 서버 간 데이터를 주고 받을 때 등...)

(TCP로 통신하는 경우 거의 없음.)

 

HTTP의 역사

- HTTP/1.1 : 가장 많이사용. 가장 중요한 버전. 

( 대부분의 기능 포함. 그 이후 버전은 성능 개선. )

 

특징

  • 클라이언트 서버 구조
  • Request(요청) Response(응답) 구조
  • 클라이언트는 서버에 요청을 보내고, 응답을 대기
  • 서버가 요청에 대한 결과를 만들어서 응답.

: 클라이언트와 서버를 분리.

 비즈니스 로직을 서버로 / uxui, 디자인은 클라이언트

 각 분야에 집중할 수 있음.

 

  • 무상태 프로토콜 (stateless ↔ stateful : 상태 유지)
  • 서버가 클라이언트 상태를 보존 X.
  • 장점 : 서버 확장성 높음 (스케일 아웃) : 수평 확장 유리
  • 단점 : 클라이언트가 추가 데이터 전송.

  : 모든 것을 무상태로 설계할 수 없는 경우도 있음. (ex 로그인)

    (단순 서비스 소개 화면 같은 경우는 무상태로 설계 가능)

 

비연결성

  • HTTP는 기본적으로 연결을 유지 하지 않은 모델
  • 초 단위 이하의 빠른 속도로 응답
  • 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음.

     (ex 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않는다.)

  • 서버 자원을 매우 효율적으로 사용할 수 있음.

: 연결이 유지 되지 않은 것이 서버의 가용성(자원)을 높일 수 있음.

 

비연결성의 한계와 극복

- TCP/IP 연결을 새로 맺어야 함. (3 way handshake 시간 추가)

- 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 JavaScript, CSS, 추가 이미지 등 많은 자원이 한꺼번에 다운로드

- 지속연결(persistent connections) 로 문제 해결

 : 하나 받을 때 까지는 지속 연결로 유지. 응답을 받고 나서 종료.

- http/2, http/3 (UDP 프로토콜을 사용하여서 더 빨라짐)에서 더 많은 최적화.

 

  • HTTP 메시지

요청 메시지와 응답 메시지는 조금 다름.

 

[메시지 구조]

시작 라인(start-line). 헤더(header). 공백 라인(empty line CRLF 무조건 있어야 함.). message-body.

요청 : body 본문 가질 수 있음.

응답 : header에서 조금 다름. 

 

- 시작 라인

start-line = request-line  / status-line

request-line = METHOD(GET, POST, PUT...) SP(공백) request-target SP(공백) HTTP-version CRLF(엔터)

request-target : 요청 대상, absolute-path (절대 경로) 로 시작

 

status line = HTTP-version SP status-code SP reason-phrase CRLF

HTTP 상태 코드 : 요청 성공, 실패

 

- HTTP 헤더

header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 허용)

field-name은 대소문자 구분 없음.

 

 용도 

 HTTP 전송에 필요한 모든 부가 정보 포함 (필요한 메타 데이터 거의 모두 포함 : 메시지 바디 내용, 크기, 압축, 클라이언트 정보, 서버 애플리케이션 정보 등..)

 표준 헤더가 너무 많음.

 필요시 임의 헤더 추가.

 

- HTTP 메시지 바디

 실제 전송할 데이터 

 HTML, 이미지, 영상, JSON 등..

 

  • 단순함, 확장 가능