📌 김영한 님의 "모든 개발자를 위한 HTTP 웹 기본 지식" 강의 듣고 정리
📍HTTP (Hyper Text Transfer Protocol)
'HTTP'는 다양한 환경에서 여러 기기가 서로 통신을 주고 받을 수 있게 만든 일종의 규칙이다.
예를 들어 내(가 이런 데이터를 요청하면 너는 이런 데이터를 반환하라는 식의 통신 규칙인 것이다.
* 문서간의 링크를 통해 연결할 수 있는 html을 전송하는 프로토콜로 시작했다. 그러나 현재는!
- HTML, TEXT
- 이미지, 음성, 영상, 파일
- JSON, XML (API)
거의 모든 형태의 데이터를 전송 가능해졌고, 서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용하고 있다.
* HTTP 역사
- HTTP/0.9 : 1991년 / GET 메서드만 지원, HTTP 헤더 없음
- HTTP/1.0 : 1996년 / 메서드와 헤더 추가
- HTTP/1.1 : 1997년 / 현재에 가장 많이 사용하는 버전 (RFC문서 : 2068 > 2616 > 7230~7235)
- HTTP/2 : 2015년 / 성능 개선
- HTTP/3 : 진행중 / TCP대신 UDP 사용, 성능개선
* 기반 프로토콜
- TCP : HTTP/1.1 , HTTP/2
- UDP : HTTP/3
HTTP/2 , HTTP/3 도 사용이 점점 증가하고 있다.

📍클라이언트 서버 구조
- HTTP는 Request 와 Response의 구조
- 클라이언트는 요청을 보내고 서버의 응답 대기
- 서버는 요청에 대한 결과를 응답
* 왜 이렇게 분리할까?
개념적으로 분리함으로써 비지니스 로직과 데이터는 서버에게 UI, 사용성 등은 클라이언트에게 집중시켜 독립적으로 진화가 가능해진다.
📍Stateful, Stateless
HTTP의 중요한 특징 중 하나는 무상태 프로토콜을 지향한다.
* 무상태성(Stateless)이란?
클라이언트가 하는 요청에 대해 서버는 응답만 할 뿐 이전 상태에 대한 정보를 보존하지 않는다.
이전에 무엇을 요청했는 지에 따라 결과 값이 달라지는 등의 변화는 없다. 철저하게 매번 요청 값에 대한 것만을 응답한다.
상태 유지는 응답 서버가 바뀌게 되면 다른 서버에도 알려야 하며, 중간에 서버가 장애가 나면 처음부터 해야한다.
무상태는 응답 서버를 바꿔도 응답이 가능하며 이는 중간에 서버가 장애가 나도 다른 응답 서버가 계속할 수 있다. 이는 무한한 서버 증설이 가능케 한다. (서버의 수평 확장(Scale Out)이 높다 )
하지만 이것도 한계가 있다. 모든 것을 무상태로 설계하는 것은 힘들기 때문이다.
그래서 상태 유지는 최소한 만으로 사용하며 최대한 무상태 성을 유지하기 위해 노력한다.
보통 상태 유지 가장 대표적인 예는 로그인한 사용자의 경우 로그인 상태를 서버에 유지하는 것이다. 일반적으로 이는 브라우저 쿠키와 서버 세션등을 사용한다.
그리고 한가지 단점이 상태를 유지하지 않기 때문에 매번 보내야 하는 정보량이 더 많다는 단점이 있다.
📍비 연결성 (Connectionless)
연결을 유지하는 동안 서버는 이를 유지하기 위해 서버 자원을 소모하게 된다.
연결을 유지하지 않으면 필요한 것만을 요청하고 응답받고 나면 연결을 끊어 최소한의 자원을 사용할 수 있다.
* HTTP는?
- HTTP는 기본이 연결을 유지하지 않는 모델
- 일반적으로 초 단위의 이하의 빠른 속도로 응답
- 서버 자원을 매우 효율적으로 사용
* 비 연결성의 한계는?
- TCP/IP 연결을 계속 새로 맺어야한다. 연결시 3 way handshake 단계가 반복되므로 그만큼 시간이 추가된다
- 웹 브라우저로 사이트 요청하면 수 많은 자원들이 한꺼번에 다운받아지는 데, 중간에 끊기면 처음부터 다시 다 다운받아야한다.
- 지금은 HTTP 지속 연결(Persistent Connections)로 문제 해결 (연결 유지 될때
- HTTP/2와 HTTP/3에서 최적화
**** HTTP 지속 연결
자원 하나를 요청했을 때 이와 묶여있는 모든 자원을 요청하기 위해 연결을 유지한 상태
클라이언트의 요청 또는 TimeOut 전까지는 연결이 열려있어 클라이언트가 자원을 연속적으로 요청할 수 있고 이에 서버는 연속적으로 응답할 수 있다 (파이프 라이닝)
연결 시도 횟수가 줄어들어 효율적이다.
HTTP/1.1 기준 달리 명시 되어있지 않으면 모든 연결은 지속 연결로 간주된다. 서버마다 Timout이 존재한다.
📍HTTP 메시지
* HTTP 메시지 구조 설명
- HTTP 시작라인
| 요청 |
|
| 응답 |
|
- HTTP 헤더
- HTTP 전송에 필요한 모든 부가정보를 담는다.
- 표준 헤더가 존재한다.
- 필요시 임의 헤더가 추가 가능하다.
- HTTP 메시지 바디
- 실제 전송할 데이터
- byte로 표현할 수 있는 모든 데이터 전송 가능
* HTTP 요청 메시지 예제
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
* HTTP 응답 메시지 예제
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
<html>
<body>...</body>
</html>
* HTTP 메시지 구조로 예시 파악
- 요청 메시지
| start-line 시작 라인 | GET /search?q=hello&hl=ko HTTP/1.1 |
| header 헤더 | Host: www.google.com |
| empty line 공백 라인 (CRLF) | |
| message body |
시작 라인 :
| method | SP(공백) | request-target | SP(공백) | HTTP-version | CRLF(엔터) |
| GET | /search?q=hello&hl=ko | HTTP/1.1 |
HTTP 헤더 :
| field-name: | OWS(띄어쓰기 허용) | field-value | OWS(띄어쓰기 허용) |
| Host: | www.google.com |
- 응답 메시지
| start-line 시작 라인 | HTTP/1.1 200 OK |
| header 헤더 | Content-Type: text/html;charset=UTF-8 Content-Length: 3423 |
| empty line 공백 라인 (CRLF) | |
| message body | <html> <body>...</body> </html> |
시작 라인 :
| HTTP-version | SP(공백) | status-code | SP(공백) | reason-phrase | CRLF |
| HTTP/1.1 | 200 | OK |
HTTP 헤더 :
| field-name: | OWS(띄어쓰기 허용) | field-value | OWS(띄어쓰기 허용) |
| Content-Type: Content-Length: |
text/html;charset=UTF-8 3423 |
'Computer Science > Web' 카테고리의 다른 글
| HTTP 웹 지식 - HTTP 메서드 활용 (0) | 2023.03.08 |
|---|---|
| HTTP 웹 지식 - HTTP API를 만들어보자 (0) | 2023.03.07 |
| HTTP 웹 지식 - URI와 웹 브라우저 요청 흐름 (0) | 2023.03.06 |
| HTTP 웹 지식 - 인터넷 네트워크 (0) | 2023.03.06 |
| HTTPS (0) | 2023.01.14 |















