요즘은 HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON 등 모든 것들을 HTTP로 전송한다. 많이 쓰이는 만큼 중요한 HTTP의 기본적인 흐름과 특징들에 대해 알아보겠다.
웹 브라우저에서 HTTP request를 생성 후 socket을 통해 os계층으로 전달한다. 이를 TCP/IP 패킷으로 감싼 후 서버로 전송하게 된다. 클라이언트는 요청을 보낸 후 응답을 받을 때까지 대기하였다가 응답을 받으면 그에 대한 실행을 한다.
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/1.1을 가장 많이 사용하지만 HTTP/2, HTTP/3 도 점점 증가하는 추세이다.
서버가 클라이언트의 상태를 보존하지 않는 특성을 말한다. Stateful(상태유지)와 Stateless 차이를 생각하면 이해가 더 쉽다.
예를 들어, 가게에서 물건에 대해 문의하기 위해 점원과 대화 중이다. '상태 유지'는 물건에 대해 대화를 할 때 같은 점원과 대화를 이어가는 것이고, '무상태'는 말을 한 마디 할 때 마다 점원이 바뀌는 것이다.
이런 경우에 '상태 유지'에서는 기존에 대화하던 점원이 내가 이전에 말했던 정보를 알고 있으므로 문의가 끝날 때까지 점원이 바뀌면 안된다. 그러나 '무상태'에서는 점원이 내가 말한 정보를 모르기 때문에 바뀌어도 된다. 다만 말할 때 마다 계속 정보를 말해야 할 것이다.
이러한 예시를 통해 정리하자면 stateless는 상태를 유지하지 않으므로 응답 서버를 바꿀 수 있다. 이는 클라이언트 요청이 증가할 경우 서버를 대거 투입할 수 있고, 기존에 요청을 보냈던 서버에 error가 발생해도 다른 서버가 쉽게 대체할 수 있다는 장점이 있다. 즉, 서버 확장성이 높다는 의미이다.
물론 단점도 있는데 클라이언트가 계속해서 추가 데이터를 전송해야 하고, 로그인 유지와 같이 모든 경우에서 무상태로 설계가 가능한 것이 아니라는 것이다. 상태 유지를 위해 일반적으로 브라우저 쿠키와 서버 세션등을 사용하나 상태 유지를 최소화해야 한다.
HTTP는 기본이 연결을 유지하지 않는 모델로 요청에 대한 응답을 보내고 나면 연결을 종료한다. 일반적으로 초 단위의 이하의 빠른 속도로 응답하며 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작아 빠르게 응답할 수 있다.
연결을 유지할 경우 서버의 자원이 소모되나, 연결을 유지하지 않을 경우 서버 자원을 매우 효율적으로 사용할 수 있다.
하지만 이는 TCP/IP 연결을 새로 맺어야 하기 때문에 3 way handshake에 대한 시간이 추가된다. 이를 해결하기 위해 지금은 HTTP 지속 연결(Persistent Connections)을 사용한다.
웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등
등 수 많은 자원이 함께 다운로드되는데 매 요청 마다 연결을 새로 하는 것이 아니라 얼마간 연결을 유지하여 위의 다운로드 작업을 한 번에 할 수 있게 된다. HTTP/2, HTTP/3에서는 더 많은 최적화가 이루어졌다.
HTTP message는 start-line, header, 공백 line, body로 구성되어 있다. 요청과 응답 메세지의 구성은 다음과 같다.
start line
HTTP method : GET, POST, PUT, DELETE 등
Request target : HTTP Request가 전송되는 목표 주소
HTTP version : version에 따라 메시지 구조/데이터 구조 등이 다를 수 있어 명시
headers : HTTP 전송에 필요한 모든 부가정보
body
: 전송하는 데이터를 담고 있는 부분으로 전송하는 데이터가 없다면 비어있다. HTML 문서, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 데이터를 전송할 수 있다.
status line
HTTP version
Status Code & Status Text : https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
headers
: request headers와 동일하나 response에서만 사용되는 값들이 있음. ex) User-Agent → Server
표현 헤더는 전송, 응답 둘 다 사용
클라이언트가 선호하는 표현 요청
Accept-Languagea: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
각각에 우선순위를 줄 수 있고
Accept: text/*, text/plain, text/plain; format=flowed,*/*
구체적인 것이 우선한다!
Content-Length
로 길이를 명시하고 그대로 전송하는 것Content-Encoding
으로 압축 방식 명시Transfer-Encoding: chunked
Content-Range
HTTP/2 - 병렬 요청이 동일한 커넥션 상에서 다루어질 수 있는 다중화 프로토콜
HTTP/3 - QUIC, 구글이 만들었음.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard