많이 들어보고 나름 많이 써보기도 한 것 같은 HTTP
자세히 알아보기 위해 공부했고, 내용을 정리한다.
HTTP란?
HTML문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
웹에서 이루어지는 모든 데이터 교환의 기초이며, 애플리케이션 계층의 클라이언트 - 서버 프로토콜이기도 하다.
HTTP 요청 및 응답의 올바른 형식은 클라이언트와 서버에서 사용하는 HTTP 프로토콜(또는 HTTP 사양)의 버전에 따라 다르기 때문에 요청은 Reqeust Line, 응답은 Status Line에 명시해야한다.
읽기 간단하다
HTTP는 쉽게 읽을 수 있게 고안되었고 프레임별로 캡슐화하여 간결함을 유지한다.
읽기 간편한 HTTP의 장점에 따라 REST 아키텍쳐의 설게로 이어진다.
확장 가능하다
클라이언트와 서버가 새로운 헤더의 시멘틱에 대해 간단한 합의만 한다면, 추가가 용이하다
상태는 없지만 세션을 만들 수 있다.
HTTP는 Stateless Protocol이기 때문에 상태를 저장하지 않는다.
하지만 클라이언트와 상호작용하길 원할 때 HTTP 쿠키로 상태가 있는 세션을 만들도록 해준다.
HTTP 흐름
1. TCP 연결
2. 클라이언트가 HTTP Request 전송
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
HTTP/2 이전에는 메시지가 프레임 속으로 캡슐화 되어 직접 읽는게 불가능하지만 원칙은 동일
3. 서버로부터 받은 HTTP Response 읽기
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
4. 연결 닫거나, 다른 요청을 위해 재사용
HTTP 구조
HTTP Request
클라이언트에서 서버에 있는 명명된 호스트로 이루어지고, 요청의 목적은 서버의 리소스에 접근하는 것이다.
1. Request Line
GET /software/htp/cics/index.html HTTP/1.1
- GET : HTTP Method 리소스로 수행해야하는 작업을 서버에 알려주는 명령
- /software/htp/cics/index.html : URL로 리소스를 식별한다.
- HTTP/1.1 : 클라이언트가 메시지를 작성한 HTTP 버젼을 표시
요청 라인에 추가 될 수 있는 추가 항목으로는
- 쿼리 스트링 : 리소스를 어떤 목적으로 사용할 수 있는 일련의 정보 제공
- 경로 외에 URL Scheme, 호스트 구성 요소 : 이러한 방식은 absolute URI 방식이라고 하고 HTTP/1.1 요청의 경우 프록시 서버를 통과할 때 이 형식이 사용된다.
2. HTTP Request Header
수신자에게 메시지, 발신자 및 발신자가 수신자와 통신하려는 방식에 대한 정보를 제공하기 위해 사용한다.
각 HTTP 헤더는 이름과 값으로 구성된다.
3. Message Body
모든 HTTP 의 본문이라고 할 수 있다.
GET Method의 Body가 없다고 하는 것은 HTTP Request에 없는 것이다.
HTTP Response
서버에서 클라이언트로 전송된다.
응답의 목적은 클라이언트에게 요청한 리소스를 제공하거나 요청한 작업이 수행되었거나 오류가 발생했음을 알린다.
1. Status Line
HTTP/1.1 200 OK
- HTTP Version, HTTP STATUS code, reason phrase로구성된다.
2. HTTP Response Header
서버 응답의 HTTP 헤더엔 클라이언트가 응답 및 응답을 보낸 서버를 사용할 수 있는 정보가 포함되어 있다.이 정보를 클라이언트가 사용자에게 응답을 표시하고, 나중에 사용할 수 있도록 저장 또는 캐싱하고, 추가 요청을 하는데 도움을 준다.실패한 요청의 경우는 헤더를 사용해 요청을 성공적으로 완료하기 위해 수행해야하는 작업을 클라이언트에게 알릴 수 있다.
3. Message Body
응답본문은 HEAD Method를 제외하곤 대부분의 응답에 사용된다.
HTTP 1.0 과 1.1의 차이점
1. 커넥션 유지(Persistent Connection)
1.0은 요청 컨텐츠마다 TCP 세션을 맺어야 하지만 1.1은 Persistent 기능을 이용해 한 개의 TCP 세션으로 여러번의 요청이 가능하다
1-1. Pipelining
Persistent와 함께 파이프 라이닝을 통해 다음 응답 전에 요청을 처리할 수 있게하고 이는 응답속도를 높혀준다.
2. 호스트 헤더
Host 헤더의 추가로 하나의 IP에 여러개의 도메인을 운영할 수 있다. 이를 이용한 대표적인 예시로 같은 아이피에서 다른 호스트명, 다른 포트로 운영하는 버츄얼 호스트가 있다.
3. 강력한 인증 절차
proxy-authentication, proxy-authorization 헤더의 추가로 프록시가 사용자의 인증을 요구할 수 있다.
참조
https://www.ibm.com/docs/en/cics-ts/5.2?topic=concepts-http-protocol
https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x
https://www.informit.com/articles/article.aspx?p=169578
https://withbundo.blogspot.com/2021/02/http-http-10-http-11.html