1. 웹브라우저의 구조
2. HTTP 프로토콜이란?
3. HTTP 서버클라이언트 구조
4. HTTP 무상태성 Stateless
5. HTTP 메서드
6. HTTP 상태코드
7. HTTP 헤더
8. HTTP Keep-Alive
9. HTTP 파이프라이닝
10. HTTP/1.1, HTTP/2, HTTP/3 특징
HTTP는 웹 브라우저(클라이언트)와 웹 서버의 테이터 통신을 위한 하이퍼텍스트 전송 프로토콜이다.
일반적으로 웹 사이트는 하이퍼링크(임의의 그림이나 글자를 클릭하면 연결된 부분으로 바로 이동)로 연결된 문서의 집합이다.
하아퍼텍스트는 문서를 쉽게 검색하도록 문서 일부를 다른 문서와 하이퍼링크로 연결한 텍스이다.
이처럼 인터넷 사용자가 필요한 정보를 자유롭게 검색하게 해주는 하이퍼텍스트 방식의 정보를 교환하기 위한 규칙이 HTTP (Hyper Text Transfer Protocol)이다.
HTTP 처리과정은 서버/클라이언트 모델을 따른다.
클라이언트가 서버에 요청(request) 메시지를 보내면 서버는 응답(response) 메시지를 보낸다.
무상태에서는 고객이 자신의 주문을 기억하고 있다면 중간에 다른 점원으로 바뀌어도 주문을 할 수 있다.
고객: 사과 10개 사고 싶은데 얼마인가요?
점원A: 만원입니다.
고객: 신용카드로 결제할께요.
점원B: 결제완료 됐습니다.
그러나, Stateful 상태유지에는 점원이 A에서 B로 바꼈을 때 점원B는 "어떤 제품을 결제하실 건가요?" 라고 되물을 것이다. 왜냐하면 고객이 사고자 하는 사과10개에 대한 정보는 점원A에게 있기 때문이다.
따라서,
➕ Stateful 상태유지는 항상 같은 서버가 유지되어야 한다.
만약 서버에 장애가 상긴다면 유지되던 정보가 다 날라가므로 처음부터 다시 서버에 요청해야 한다.
무상태는 클라이언트가 요청할때 필요한 데이터를 모두 담아 보내기 때문에 아무 서버나 호출해도 되며, 서버 장애가 생기면 다른 서버에서 응답을 전달하면 되므로 클라이언트는 다시 요청할 필요가 없다.
갑자기 고객 증가해도 점원 대거 투입 가능
=갑자기 클라이언트 요청 증가해도 서버를 대거 투입할 수 있다.
=> 무상태는 응답 서버를 쉽게 바꿀 수 있다.
=> 무한한 서버 증설 가능 =수평확장 유리
➕ 연결성과 비연결성
연결성 모델 (Connection Oriented)
TCP/IP의 경우 기본적으로 연결을 유지한다. 클라이언트는 요청을 보내지 않아도 계속 연결을 유지해야 한다. 이러한 경우 연결을 유지하는 서버의 자원이 계속 소모가 된다.
비연결성 모델 (Connectionless)
클라이언트와 서버가 연결 되어있지 않다는 것.
비연결성을 가지는 HTTP에서는 실제로 요청을 주고받을 때만 연결을 유지하고 응답을 주고 나면 TCP/IP 연결을 끊는다. 최소한의 자원으로 서버를 유지한다.
- GET : 리소스 조회 (데이터 가져올 때)
- POST : 요청 데이터 처리, 주로 데이터(새로운 리소스) 등록에 사용
- PUT : 리소스를 대체(덮어쓰기), 해당 리소스가 없으면 새로운 리소스 생성
- PATCH : 리소스를 일부만 변경
- DELETE : 리소스 삭제
✅안전
멱등성이란❓
어떤 대상에 같은 연산을 여러번 적용해도 결과가 달라지지 않는 성질이다.
Ex) f(x)= x * 1 함수는 항상 x를 반환한다. (연산을 1번 적용하던 100번 적용하던 동일.)
✅멱등성을 HTTP 주요 메서드에 적용해보면,
멱등성 O
- GET: 단순히 조회만 하므로 여러번 호출해도 리소스 변화 X.
- PUT: 결과를 완전히 대체하는 것으로 여러번 호출해도 최종결과 동일
- DELETE: 결과를 삭제하는 것으로 여러번 호출해도 삭제된 결과 동일
⏩모두 멱등 => 재요청 해도 된다.
PUT은 지정한 데이터를 전부 수정(대체)하는 Method이지만 PATCH는 정보의 일부분이 변경되는 방법이다. 그래서 PUT은 멱등하지만, PATCH는 멱등하다고 볼 수 없다.
Put
기존 데이터가{name: ssohan, age: 20}
일 때{ age: 30 }
를 Put으로 보내면 name이 날아가고{ age:30 }
로 변경된다.
Patch
기존 데이터가{name: ssohan, age: 20}
일 때{ age: 30 }
를 Patch으로 보내면{ name: ssohan, age:30 }
와 같이 age만 변경된다.
HTTP는 클라이언트와 서버 간의 통신에서 상태코드(status code)를 사용하여 요청의 처리 결과를 나타내어, 웹 개발자들이 요청에 대한 처리를 할 수 있도록 돕는다.
100번대 (Informational) -> 정보성 응답
200번대 (Successful) -> 요청 정상 처리 성공 응답
300번대 (Redirection) -> 리다이렉션, 클라이언트의 추가 조치 필요하므로 다시 돌려보냄
400번대 (Client Error) -> 클라이언트 오류로 서버가 요청 수행 불가.
500번대 (Server Error) -> 서버 오류로 서버가 정상적인 요청 처리 못함.
요청에 들어가는 HTTP 헤더는 HTTP 헤더의 기본 구조를 따른다. 대소문자 구분없는 문자열 다음에 콜론(':')이 붙으며, 그 뒤에 오는 값은 헤더에 따라 달라진다.
HTTP keep-alive란, HTTP 프로토콜에서 클라이언트와 서버 간 여러 요청을 단일 TCP 연결을 재사용하는 방식을 말한다.
HTTP는 sateless이며 connectionless이므로, HTTP/1.1 이전에는 클라이언트와 서버 사이에 트랜잭션 한번이 일어나면 HTTP Connection 이 끊어졌었다.
(ex. 문의전화했을 때 질문 1번할때마다 대답을 듣고 전화가 끊어짐 -> 매우 불편)
- keep alive를 설정하면 지정한 시간 내에서 데이터를 계속 주고 받을 수 있다.
- 장점:
o 네트워크 지연시간이 줄어든다.
o 데이터를 빈번히 주고 받을 때 유용하다.- 단점:
o 사용자가 많다면 연결이 늘어나서 새로운 사용자를 받아들이지 못하는 경우가 생긴다.
o 성능 하락의 주범이 될 수 있다.
첫번째 요청에 대한 응답이 완전히 전송되기 이전에 두번째, 세번째 요청 전송을 가능하게 한다. (=요청 병렬처리)
(http 버전별 특징에서 추가 설명)
HTTP 1.0과 비교해보면,
그러나 파이프라이닝은 동시에 여러개의 요청을 처리해 응답보내진 않는다. 따라서, 먼저 받은 요청이 끝나지 않으면 뒤 요청이 끝나도 먼저 온 요청이 끝날때까지 순차적으로 기다려야 한다.
이를 HOLB(Head Of Line Blocking) 문제라고 한다.
레퍼런스
http 개념, 특징들 참고
http 메서드, 멱등성 참고
http 메서드 patch,put 참고
http 상태코드 참고
http 헤더 참고
keep-alive 참고
http 1.0 vs http 1.1 참고
http 버전별 특징 참고
http 3 참고