📌 현재는 HTTP 시대! HTTP 메세지에 모든 것을 전송
• HTTP/0.9 1991년: GET 메서드만 지원, HTTP 헤더X
• HTTP/1.0 1996년: 메서드, 헤더 추가
• HTTP/1.1 1997년: 가장 많이 사용, 우리에게 가장 중요한 버전
• RFC2068 (1997) -> RFC2616 (1999) -> RFC7230~7235 (2014)
• HTTP/2 2015년: 성능 개선
• HTTP/3 진행중: TCP 대신에 UDP 사용, 성능 개선
HTTP/2와 HTTP/3은 성능이 개선일 뿐이므로 HTTP/1.1스펙을 잘 알아야함.
• TCP: HTTP/1.1, HTTP/2
• UDP: HTTP/3
• 현재 HTTP/1.1 주로 사용
• HTTP/2, HTTP/3 도 점점 증가


✔️ 클라이언트와 서버를 분리하는 것이 중요!
서버가 클라이언트의 상태를 보존하지 않음
장점 : 서버 확장성 높음(스케일 아웃)
단점 : 클라이언트가 추가 데이터 전송(보내야할 데이터 양이 많음)
점원 1명
고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다.(노트북 상태 유지)
고객 : 2개 구매하겠습니다.
점원 : 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?(노트북, 2개 상태유지)
고객 : 신용카드로 구매하겠습니다.
점원 : 200만원 결제 완료되었습니다.(노트북, 2개, 신용카드 상태유지)
점원이 중간에 바뀐다면?
고객 : 이 노트북 얼마인가요?
점원A : 100만원 입니다.
고객 : 2개 구매하겠습니다.
점원B : ? 무엇을 2개 구매하시겠어요?
고객 : 신용카드로 구매하겠습니다.
점원C : ? 무슨 제품을 몇 개 신용카드로 구매하시겠어요?
점원이 원하는 고객의 데이터가 없음
Stateless (무상태) 예시 - 점원이 중간에 바뀐다면?
- 고객의 데이터를 그때그때 넘겨줌
점원 1명
고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다.
고객 : 노트북 2개 구매하겠습니다.
점원 : 노트북 2개는 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?
고객 : 노트북 2개를 신용카드로 구매하겠습니다.
점원 : 200만원 결제 완료되었습니다.
점원이 중간에 바뀐다면?
고객 : 이 노트북 얼마인가요?
점원A : 100만원 입니다.
고객 : 노트북 2개 구매하겠습니다.
점원B : 노트북 2개는 200만원 입니다. 신용카드, 현금중에 어떤 걸로 구매 하시겠어요?
고객 : 노트북 2개를 신용카드로 구매하겠습니다.
점원C : 200만원 결제 완료되었습니다.
상태 유지(Stateful) : 중간에 다른 점원으로 바뀌면 안됨.
(중간에 다른 점원을 바뀐다면 고객 상태 정보를 다른 직원에게 미리 알려야함.)
상태를 보존하기 때문에 항상 같은 서버가 유지되어야함.



: 여러 개의 클라이언트의 요청에 응답해도 연결이 종료되지 않고 서버와 연결을 계속 유지. → 서버 자원 소모
ex) 클라이언트 3과 통신해도 클라이언트1,2와 지속 연결중

: 클라이언트의 요청에 응답하면 즉시 TCP/IP 연결을 종료 → 최소한의 자원 사용

한계

극복

: 시작 라인, 헤더, 공백 라인(필수), 본문

공식 스펙
HTTP-message = start-line
*( header-field CRLF )
CRLF
[ message-body ]
📌 요청 메시지도 message-body를 가질 수 있음

: request-line
request-line = method SP request-targat SP HTTP-version CRLF
- SP(공백), CRLF(엔터)
method : HTTP 메소드 (GET : 조회)
- 서버가 수행해야 할 동작 지정
- 종류 : GET(리소스 조회), POST(요청 내역 처리), PUT(수정), DELETE(삭제)
request-targat : 요청 대상, path, query (/search?q=hello&hl=ko)
- absolute-path[?query] (절대경로[?쿼리])
HTTP Version : HTTP 버전(HTTP/1.1)
header-field = field-name":" OWS field-value OWS
- OWS(띄어쓰기 허용)

: status-line
status-line = HTTP-version SP status-code SP reason-phrase CRLF
HTTP-version : HTTP 버전(HTTP/1.1)
status-code : HTTP 상태 코드 - 요청 성공, 실패를 나타냄
- 200 : 성공
- 400 : 클라이언트 요청 오류
- 500 : 서버 내부 오류
reason-phrase : 이유 문구 - 사람이 이해할 수 있는 짧은 상태 코드 설명 글
header-field = field-name":" OWS field-value OWS
- OWS(띄어쓰기 허용)
