HTTP
HTTP는 Hypertext Transfer Protocol의 약자이고, 주로 HTML 문서같은 데이터를 요청하여 가져올 수 있도록하는 프로토콜을 말한다.
프로토콜(Protocol)은 A와 B사이에서 데이터를 주고 받기위한 일종의 통신상 약속을 말한다. 미리 어떻게 주고, 어떻게 받는다고 약속을 해둔다는 말이다.
웹에서는 클라이언트(보통 웹 브라우저)와 서버(데이터 요청에 대해 응답)간에 데이터를 주고 받기위해 HTTP 프로토콜을 사용한다. 여기서 데이터는 보통 문서를 말하는데 문서안에 포함되는 텍스트, 이미지, 비디오, 스크립트 등을 포함한다.
클라이언트는 브라우저를 통해 어떤 사이트에 접속하게 되면 서버에다가 해당 페이지를 '요청'하게 되는 것이다. 그러면 서버는 요청을 받아서 클라이언트가 요구한 페이지를 '응답'으로 보내게 된다.
HTTP의 특징
- HTTP의 경우 보통 TCP/IP 통신 위에서 동작하고, 80포트를 사용한다. (HTTPS는 443 포트)
HTTP에서는 기본적으로 TCP 연결이 필수는 아니지만 신뢰할 수 있거나 메시지 손실이 없는 연결을 원하기 때문에 신뢰할 수 있는 연결 기반인 TCP 표준에 의존한다.
웹에서 모든 데이터 교환의 기초가 되고, 클라이언트-서버 프로토콜이라고도 한다.
- HTTP는 연결을 유지하지 않기 때문에 요청, 응답을 주고 받는 방식으로 동작한다.
연결을 유지하지 않는 다는 것은 요청, 응답 등 실제 요청을 주고 받을때만 연결을 유지한다는 것이다. 이후엔 연결을 끊는다.
연결을 유지하지 않으면 연결을 지속했을때 낭비되는 자원을 줄일 수 있지만, 클라이언트의 상태를 유지시켜 줄 수 없다.
따라서 HTTP를 Connectionless(비연결성) 하다고 표현한다.
- 연결이 유지 되지 않으므로, HTTP는 상태를 저장하지 않는다(Stateless). 따라서 동일한 연결(작동 순서: 연결 - 요청 - 응답)에서 서로 다른 요청은 연관이 없다고 할 수 있다.
상태가 없다는 특징은 유저가 같은 페이지에서 머물면서 상호작용을 할 때 문제가 생길 수 있다.
예를 들면 이커머스 샵에서 장바구니의 상태를 유지하고 싶어한다.
HTTP 쿠키는 상태가 있는 세션을 사용할 수 있도록한다.
HTTP 요청에서 같은 컨텍스트, 상태를 공유하기위해 HTTP 쿠키가 추가되어 세션 생성이 허용된다.
세션에서 현재 클라이언트의 상태를 유지할 수 있도록한다.
HTTP 메시지
HTTP 메시지는 human-readable하고 요청(request), 응답(response)의 타입을 갖고 있다.
HTTP 요청 메시지의 예:
- Method : 클라이언트에서 수행하고자 하는 동작. GET, POST, PUT, DELETE, OPTIONS 등이 각각 조회, 생성, 수정, 삭제 등의 역할을 하고 OPTIONS의 경우에는 서버에서 지원하는 메서드를 알아볼 때 사용하고 보통 CORS 에서 사용한다.
- Path : 서버의 url에서 프로토콜(http://), 도메인(developer.mozilla.org), 포트(80)등을 제거한 부분을 말한다.
- Version of the protocol : HTTP 프로토콜의 버전
- Headers : 서버에 추가정보를 전달하는 헤더
- Body : POST http 메서드같이 정보 전송을 위한 리소스를 포함한 요청을 위한 본문.
HTTP 응답 메시지의 예:
- Status code : 요청의 상태를 나타내는 상태코드 (100, 200, 300, 400, 500 번대 등이 있다.)
- Headers : 응답에 대한 정보를 가진 헤더.
- Body : POST 메서드의 응답에 포함되는 본문
HTTP 연결 버전별 특징
1.0 버전 이전(HTTP / 1.0), 초기버전
- 클라이언트, 서버간의 연결을 수립하고
- 요청을 보내고
- 응답을 받고
- 연결을 끊는다.
1.0 버전 이전에는 요청을 보낼때마다 위 과정을 반복했었다. 즉 연결을 유지하지 않았다.
1.1 버전
- 클라이언트, 서버간의 연결을 수립하고
- 요청을 보내고
- 응답을 받고
- 요청 보내고
- 응답 받고
- ...
- 연결을 끊는다.
HTTP / 1.1 버전에는 keep-alive 기능이 추가되어서 데이터 교환을 마칠 때까지 유지하고 모두 끝내면 연결을 끊는 구조이다.
트래픽이 많은 사이트에서 데이터 요청을 할 때마다 연결을 수립하고 끊으면 비효율적이기 때문에 연결을 유지하는 방법이 추가되었다.
2 버전
- 클라이언트, 서버간의 연결을 수립하고
- 요청 1 보내고
- 요청 2 보내고
- 요청 3 보내고
- 응답 2 받고
- 응답 3 받고
- 응답 1 받고
- 연결을 끊는다.
이전에는 요청이 들어온 순서대로 응답을 반환해서 이전 요청에 대한 처리시간이 길어지면 다음 요청 처리가 늦어졌는데, HTTP / 2 버전에서는 요청이 들어온 순서대로 반환하지 않아도 된다.
현재는 HTTP 1.1, HTTP 2와 3버전이 다양하게 쓰이는 것으로 보인다.
HTTP의 차기 버전인 3버전은 구글에서 QUIC 프로토콜을 개발하면서 아직 표준이 정해지지는 않았지만, UDP를 사용하는 것이 특징인 프로토콜이다.
참조
https://developer.mozilla.org/ko/docs/Web/HTTP/Overview
https://joshua1988.github.io/web-development/http-part1/
https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/OPTIONS