August 27, 2020
해당 글은 HTTP/1.1 - RFC7230 문서를 기준으로 작성되었습니다.
HTTP는 브라우저와 서버가 대화를 할 때 사용하는 것이다. HTTP를 이해하면 웹의 동작 원리를 이해한 다는 것이며, 웹 서버와 네트워크를 관리할 때 정확한 근거로 올바른 판단을 내릴 때 도움이 될 수 있다.
HTTP(HyperText Transfer Protocol)는 브라우저와 서버가 서로 소통을 할 수 있도록 만들어진 규약이다.
사용자는 주소창에 URL을 입력하면 원했던 화면이 뜬다.
이때 주소창에 URL을 입력하고 엔터를 누르는 행위가 HTTP 요청을 보내는 것이고, 웹 페이지가 뜨는 것이 응답을 받은 것이다.
구글에서 Network 탭을 보면 요청(Request)과 응답(Response) 내용을 확인할 수 있다.
HTTP는 IETF(인터넷국제표준화기구)에서 RFC 문서 채택을 통해 이루어진다.
IETF는 인터넷과 TCP/IP의 기술 표준을 정하는 국제적 기구이다. 어떤 사람이 기술 표준에 대한 초안을 작성해 배포하면, 서로 의견을 제시하며 토론하고 최종적으로 받아들여 지는 것을 인터넷 표준으로 채택한다. 이런 초안을 RFC(Request for Comments)라고 하며 ‘비평을 기다리는 문서’의 의미를 갖는다.
RFC 편집자는 매 문서에 일련번호와 함께 배포하며, 절대 폐지되거나 수정되지 않는다. 만약 어떤 RFC 문서의 수정이 필요하다면, 수정된 문서를 다시 출판해야 한다. 이런 덮어쓰는 방식을 통해 RFC는 인터넷 표준의 역사를 나타내기도 한다.
그렇다면 HTTP의 요청과 응답은 어떻게 생겼을까? 아래 그림과 같이 메세지 형태를 취하고 있다.
https://www.oreilly.com/library/view/http-the-definitive/1565925092/ch01s05.html
HTTP 메세지는 요청과 응답으로 나뉘고 모두 시작줄, 헤더, 본문으로 이루어져 있다.
Request Line: <메세드> <요청 URL> <버전>
Headers: <헤더>
Body: <본문>Status Line: <버전> <상태코드> <사유 구절>
Headers: <헤더>
Body: <본문>* 시작줄을 공통으로 Start Line이라 하는데, 요청은 Request Line으로, 응답은 Status Line이라 부를 수 있다.
요청은 무엇을 해야 하는지, 응답은 무슨 일이 일어났는지 알려 준다.
[ 요청 ]
GET /doc/test.html HTTP/1.1[ 응답 ]
HTTP/1.1 200 OK헤더는 크게 일반(General) 헤더, 요청(Request)/응답(Response) 헤더, 엔터티(Entity) 헤더로 나뉘며 모두 key: value 형식으로 작성한다.
a. 일반 헤더: 메세지에 대한 기본적인 정보 제공
Via: 1.1 proxy-62.irenes-sip.net
Connection: kepp-aliveb. 요청 헤더: 서버에게 요청의 세부 정보 제공
Accept: */*
User-Agent: Mozilla/5.0
Cookie: 쿠키 값c. 응답 헤더: 브라우저에게 응답의 세부 정보 제공
Server: gws
Age:
Set-Cookie:d. 엔터티 헤더: 바디의 컨텐츠를 나타냄
Content-Type: text/html, application/json; charset=UTF-8
Content-Length: 345선택 사항으로 이미지, 비디오, 텍스트 등 여러 종류의 데이터를 담을 수 있다.
GET, HEAD, DELETE, OPTIONS처럼 리소스를 가져오는 요청은 보통 본문이 비어 있다.
브라우저와 서버 간의 통신을 더 안전하고 효율적으로 하기 위해 중개자 역할을 하는 구성 요소가 나왔다. 대표적인 것으로 캐시, 프록시, 게이트웨이 등이 있다.
처음에 여는데 오래 걸렸던 사이트를 다시 들어가면 처음보다 빠르게 켜질 때가 있다. 이는 브라우저가 문서의 사본을 HTTP 헤더 지시에 따라 보관한 덕분이다. 캐시는 불필요한 데이터 전송을 줄여 시간과 비용을 줄여 준다.
(HTTP 캐시와 브라우저 캐시의 차이는 추후 작성)
프록시는 클라이언트와 서버의 중개자로 같은 프로토콜을 사용하는 둘 이상의 애플리케이션을 연결한다.
프록시는 실용적이고 유용한 일을 처리한다. 예를 들면 어린이에게 부적절한 사이트 필터, 문서 접근 제어, 보안 방화벽, 웹 캐시, 익명화 프록시 등이 있다.
프록시와 게이트웨이 차이점: 프록시와 밑에 설명하는 게이트웨이는 모두 중개자 역할을 한다. 하지만 프록시는 같은 프로토콜을 사용하는 애플리케이션을 연결한다면, 게이트웨이는 서로 다른 프로토콜을 사용하는 애플리케이션을 연결한다.
http://tlog.tammolo.com/blog/6-a52d91c3-232f-4b33-b9f3-4ef47fbbf973/
게이트웨이는 서로 다른 프로토콜과 애플리케이션을 연결해준다. 우리가 WiFi를 사용하여 인터넷을 하려 할때, PC가 공유기, 인터넷 회사 라우터를 거쳐 인터넷에 연결이 되는 것 역시 게이트웨이다.
http://tlog.tammolo.com/blog/8-c3068a1a-9ace-450d-a87e-e3cc6213955e/
HTTP/FTP와 HTTP/POP 등은 다른 프로토콜이란 걸 바로 알 수 있지만, HTTP/CGI는 이해가 잘 안돼서 찾아봤다.
(‘클라이언트 측 프로토콜/서버 측 프로토콜’로 작성한다.)
참고