본 자료는 김영한님의 강의 모든 개발자를 위한 HTTP에서 내용을 정리한것입니다.
-> 지금은 HTTP에 거의 모든 데이터를 담아서 주고 받음. 서버간에 데이터를 주고 받을때도 HTTP를 대부분 사용.
RFC7230 ~ 7694, 현재는 RFC 9110
HTTP/1.1 => 1997년 : 기능이 대부분 여기서 나옴, 우리에게 가장 중요한 버전.
HTTP/2 => 2015년 : 성능 개선. 지연시간을 줄이고 응답시간을 빠르게함. 헤더압축, 멀티플렉싱, 서버푸시, 요청의 우선순위 처리를 지원.
HTTP/3 => 진행중, QUIC이라는 계층 위에서 돌아가며, TCP대신에 UDP 사용. "초기 연결 설정 시 지연 시간 감소"
기반 프로토콜
TCP : HTTP/1.1 , HTTP/2
UDP : HTTP/3
1.1주로 사용 => 2, 3도 점점 증가. (2,3는 성능 개선을 많이 이룬 것. 스펙과 관련해서는 1.1버전에서 거의 다 나옴.)
클라이언트와 서버가 개념적으로 분리 => 비즈니스 로직, 데이터 등은 서버에 , UI/UX 화면구조에 집중하는 클라이언트. -> 양쪽이 독립적으로 진화(백,프론트)
Stateful , Stateless 의 차이
상태 유지 (Stateful) : 그 전에 유저가 한 행동을 기억하고 계속해서 이어 나가는 것. 그 전 상태의 정보를 기억하고 있다. => 중간에 받는 사람이 바뀌면?
=> 그전에 한 행동을 기억하지 못하기에 혼동이 온다. (상태 정보를 다른 사람에게 미리 알려줘야 한다.)
=> 항상 같은 서버가 유지되어야 한다. 중간에 서버가 장애 나면? 처음부터 다시해야 된다. 서버의 확장이 어려움.
무상태 유지(Stateless) : 유저가 한 행동을 기억하지 못하기에 다음 단계에서 그 전 단계의 정보를 함께 받아야 된다. => 중간에 받는 사람이 바뀌면 ?
=> 고객이 필요한 데이터를 전부 다 넘기기 때문에 별 상관이 없다. (서버 상태의 무한한 확장성을 가져올 수 있다.)
=> 아무 서버나 호출해도 된다. 클라이언트의 응답이 순간 폭증해도 서버의 증설이 가능하다.
스케일 아웃 - 수평적 확장 유리.
비 연결성(Connectionless)
** 장점
** 단점
서버 개발자들이 어려워하는 업무 => 정말 같은 시간에 딱 맞추어 발생하는 대용량 트래픽. Ex) 선착순 이벤트, 학과수업, 명절 KTX 예약 등…
BUT => 어떻게든 Stateless를 기억하자. 최대한 스테이스리스하게 설계해야 한다.
공백라인(CRLF)은 무조건 있어야 한다.
*요청 메시지
- Request-line
- HTTP 메서드 (GET , POST, PUT , DELETE, PATCH 등등)
- 요청 대상 : 절대경로[쿼리]
- HTTP버전
*응답 메시지
- Status-line : HTTP-version , Status-Code(200, 400대, 500대 ), 이유 문구(사람이 이해할 수 있는 짧은 문구, "OK" 같은 것.)
field-name : field-value (filed-name은 대소문자 구분 x)
- HTTP 전송에 필요한 모든 부가 정보 ex) 메시지 바디의 타입 정보, 메시지 바디의 크기, 압축,인증, 요청 클라이언트 정보, 서버 애플리케이션 정보, 캐시 관리 정보 … , 메타 데이터가 거의 다 들어 있다.
- 표준 헤더가 너무 많음
- 필요시 임의의 헤더 추가 가능 ex) helloworld: hihi
-실제 전송할 데이터
-HTML 문서, 이미지, 영상, JSON 등등, byte로 표현할 수 있는 모든 데이터 전송 가능.
-> 확장 가능이 매우 강력한 무기.
-> HTTP는 단순하다, HTTP 메시지도 매우 단순. 확장성이 크다.