https://surrealcode.tistory.com/112
HTTP의 기본 구조를 파악하기 전 이전 포스팅을 참고하도록 하자.
- 모든 것이 HTTP
HTTP(HyperTextTransferProtocol)
최근엔 HTTP 메시지에 모든 것을 담아서 전송한다.
1.HTML, TEXT
2, Image, 음성, 영상, 파일
3. JSON, XML (API)
위처럼 거의 모든 형태의 데이터 전송이 가능하다.
또한 서버간 데이터를 주고 받을때도 대부분 HTTP를 사용한다.
HTTP의 역사는 다음과 같다.
HTTP/1.1, HTTP/2 -> TCP 기반으로 동작을 한다.
HTTP/3 -> UDP 기반으로 동작하고 있다.
-현재는 HTTP/1.1을 주로 사용하고 있으나, HTTP/2, HTTP/3도 점점 증가하는 추세이다.
HTTP 특징은 다음과 같다.
1. 클라이언트 서버 구조
2. 무상태 프로토콜(스테이트리스), 비연결성
3. HTTP 메시지
4. 단순함, 확장 가능
- 클라이언트 서버 구조
HTTP는 클라이언트와 서버 구조로 이루어져 있다.
HTTP는 클라이언트가 서버에 요청을 보내고, 응답을 대기한다. 서버가 요청에 대한 결과를 만들어서 응답 하는 구조이다.
비즈니스 로직, 데이터 등은 전부 서버에 일임한다.
UI를 그리고 사용성 관련 부분은 클라이언트가 집중한다.
이렇게 되면 클라이언트와 서버가 각각 독립적으로 진화할 수 있다.
하는 일을 분리해서 정해놓았기 때문이다.
- Stateful, Stateless
HTTP의 중요한 특징 중 하나는 무상태 프로토콜을 지향한다는 점이다.
즉 서버가 클라이언트의 상태를 보존하지 않는다는 것이다.
다음과 같은 예시는 Stateful예시이다
다음과 같은 예시는 stateless의 예시이다.
즉 stateful.은 서버(점원)가 클라이언트(고객)의 상태를 보존하는 것이고
stateless는 서버(점원)가 클라이언트(고객)의 상태를 보존하지 않는 것이다.
stateful(상태유지) : 중간에 다른 점원으로 바뀌게 되면 장애가 발생한다. 상태가 보존되지 않기 때문이다.
stateless(무상태) : 무상태에서는 고객이 필요한 데이터를 그때마다 다 점원에게 넘겨주기 때문에 문제가 발생하지 않는다.
stateful, stateless 차이 정리
- 상태 유지(stateful) : 중간에 다른 점원으로 바뀌면 안된다(중간에 다른 점원으로 바뀔 떄 상태 정보를 다른 점원에게 미리 알려주어야 한다) == 항상 같은 서버가 유지되어야 한다.
- 무상태(stateless) : 중간에 다른 점원으로 바뀌어도 된다.
- 갑자기 고객이 증가해도 점원을 대거 투입할 수 있다.
- 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.
- 무상태는 응답 서버를 쉽게 바꿀 수 있다. -> 무한한 서버 증설이 가능하다.
Stateless의 실무적 한계
- 모든 것을 무상태로 설계할 수 있는 경우도 있고, 없는 경우도 있다.
- 무상태 ex) 로그인이 필요없는 단순한 서비스 소개화면
- 상태 유지 ex) 로그인
- 로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지해야한다.
- 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지하고, 상태 유지는 최소한만 사용해야한다.
**결론 : 웹 애플리케이션의 상태는 최대한 무상태로 설계해야 한다.**
- 비 연결성(Connectionless)
TCP/IP 같은 연결은 기본적으로 연결을 유지한다.
클라이언트1이 서버에 연결된 채 클라이언트2가 서버에 요청을 하고 응답을 받았다.
위처럼 클라이언트2를 연결하였음에도 클라이언트1은 계속 연결이 되고 있기에 연결을 유지하는 서버의 자원이 계속 소모가 된다.
클라이언트1이 놀고 있어도 계속 유지해야한다는 단점이 있다.
만약 요청 주고 받을때만 연결을 하고 연결을 끊어버리면 어떻게 될까?
서버의 자원 소모를 최소화 시키면서 요청과 응답을 주고 받을 수 있게 된다.
== 최소한의 자원으로 서버를 유지할 수 있게 된다.
- HTTP는 기본이 연결을 유지하지 않는 모델이다.
- 일반적으로 초 단위의 이하의 빠른 속도로 응답한다.
- 1수천명이 서비스를 사용해도, 실제 서버에 동시에 처리하는 요청은 수십개 이하로 매우 작다.
ex) 웹 브라우제엇 계속 연속해서 검색 버튼을 누르지는 않는다.
- 서버 자원을 매우 효율적으로 사용할 수 있게 된다.
비연결성의 단점
1. TCP/IP 연결을 새로 맺어야 한다. -3way handshake 시간이 추가된다.
2. 웹 브라우저로 사이트를 요청하면 HTML뿐만 아니라 자바 스크립트, CSS, 추가 이미지 등 수 많은 자원이 함께 다운로드 된다.
--> 지금은 HTTP 지속 연결(Persistent Connections)로 문제를 해결하였고, HTTP/2, HTTP/3에서 더 많은 최적화가 이루어지고 있다.
**스테이트리스를 기억하자(서버 개발자들이 어려워하는 업무)
- 정말 같은 시간에 딱 맞추어 발생하는 대용량 트래픽
ex) 선착순 이벤트, 명절 KTX 예약, 학과 수업 등록 등 -> 수천~수만명이 동시 요청을 하는 경우
- HTTP 메시지
1.HTML, TEXT
2, Image, 음성, 영상, 파일
3. JSON, XML (API)
위처럼 거의 모든 형태의 바이너리 데이터 전송이 가능하다.
또한 서버간 데이터를 주고 받을때도 대부분 HTTP를 사용한다.
앞서 보았듯 HTTP 메시지는 요청 메시지와 응답 메시지 두개가 있고, 두 메시지의 구조는 약간 다르다.
HTTP 메시지의 구조는 다음과 같다.
시작라인
헤더
공백라인
메시지 바디
구조로 이루어져 있다.
이렇듯 HTTP 메시지는 요청 메시지와 응답 메시지 두개가 있고, 두 메시지의 구조는 약간 다르다.
1.1 시작 라인 (요청 메시지)
시작 라인은 크게 2가지로 구분된다. request-line / status-line이다.
요청 메시지는 request-line이다.
request-line은 다음과 같은 구조이다.
구조 : method SP(공백) request-target SP HTTP-version CRLF(엔터)
HTTP 메서드(GET: 조회)
- 종류 : GET, POST, PUT, DELETE
- 서버가 수행해야 할 동작을 지정한다. ex) GET : 리소스 조회, POST : 요청 내역 처리
요청 대상 (/search?q=hello&hl=ko)
- absolute-path[?query] (절대경로[?쿼리])
- 절대경로= "/"로 시작하는 경로
HTTP Version
-HTTP Vesio첨부
1.2 시작 라인(응답 메시지)
응답 메시지는 status-line이다.
status-line은 다음과 같은 구조이다.
HTTP-version SP status-code SP reason-phrase CRLF
HTTP 버전
HTTP 상태 코드 : 요청 성공, 실패를 나타냄
- 200 : 성공
- 400 : 클라이언트 요청 오류
- 500 : 서버 내부 오류
이유 문구 : 사람이 이해할 수 있는 짧은 상태 코드 설명 글
2. HTTP 헤더
- header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 허용
- field-name은 대소문자 구분이 없다.
요청 메시지 응답 메시지
HTTP 헤더의 용도는 다음과 같다.
1. HTTP 전송에 필요한 모든 부가 정보
ex) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 등등
--> 메시지 바디를 제외하고 필요한 메타정보가 헤더에 들어있다고 생각하면 된다.
HTTP 정리
HTTP는 단순한 구조로 이루어져 있다. 따라서 HTTP 메시지도 매우 단순하다
*참조 : 크게 성공하는 표준 기술을 단순하지만 확장 가능한 기술이다.
1. HTTP 메시지에 모든것을 전송한다.
2. 클라이언트와 서버 구조로 이루어져있고, 무상태 프로토콜이다.
3. HTTP 메시지는 시작라인, 헤더, 공백라인, 메시지 바디로 이루어져있다.
'공부 > HTTP' 카테고리의 다른 글
HTTP 상태 코드 (0) | 2025.01.20 |
---|---|
HTTP 메서드 활용 (0) | 2025.01.17 |
HTTP 메서드 (0) | 2025.01.16 |
URI와 웹 브라우저 요청 흐름 (0) | 2025.01.14 |
인터넷 네트워크 (0) | 2025.01.14 |