본문 바로가기
네트워크

(4) HTTP 메시지 포맷, 쿠키와 웹 캐시, HTTP/2

by fortissimo 2024. 3. 5.

HTTP 메시지에는 크게 요청 메시지와 응답 메시지가 있다.

요청 메시지 (request message)


방식 URL HTTP 버전 CR LF
헤더 필드 이름: 값 CR LF
헤더 필드 이름: 값 CR LF
...
CR LF
개체 몸체(entity body)

 

요청 메시지의 첫번째 줄을 요청 라인(request line), 그 뒤의 헤더 필드의 값을 알리는 줄들은 헤더 라인(Header Line)이라 부른다.

요청 라인의 첫번째에 적혀 있는 방식은 GET, POST, HEAD, PUT, DELETE 등의 method를 나타내며, HTTP에서는 주로 GET 방식을 주로 사용한다. 개체 몸체의 경우 POST 방식에서 사용되며, GET 방식에서는 비워져 있다.

 

  • POST 방식: 유저가 입력한 값들이 개체 몸체에 포함된다.
  • GET 방식: 유저가 입력한 값들이 URL 주소에 포함되어 문자열 형태로 전달되는 방식이다.
  • HEAD 방식: 응답 메시지의 헤더 부분만 요청하는 방식이다.
  • PUT 방식: 서버에 새로운 객체를 업로드한다.
  • DELETE 방식: 객체를 삭제한다.

 

응답 메시지 (response message)


HTTP 버전 상태 코드 문장 CR LF
헤더 필드 이름: 값 CR LF
헤더 필드 이름: 값 CR LF
...
CR LF
개체 몸체(entity body)

 

응답 메시지의 첫번째 줄을 상태 라인 (state line)이라 한다.

 

상태 코드(state code)와 문장: 요청 결과를 나타낸다.

  • 200 OK: 요청이 성공하여 정보가 응답으로 보내졌음을 나타낸다.
  • 301 Moved Permanently: 요청 객체가 이동되었음을 나타낸다. 새로운 URL은 응답 메시지의 Location 헤더에 나와있으며, 클라이언트는 자동으로 이 URL을 추출한다.
  • 400 Bad Request: 서버가 요청을 이해할 수 없음을 나타낸다.
  • 404 Not Found: 요청 문서가 서버에 존재하지 않음을 나타낸다.
  • 505 HTTP Version Not Supported: 서버가 해당 HTTP 버전을 지원하지 않음을 나타낸다.

 

쿠키(Cookie)


HTTP 서버는 상태를 유지하지 않는 stateless 성질을 가지고 있다. 따라서 상태를 저장하기 위해 쿠키나 세션을 사용한다.

쿠키는 상태를 저장하기 위해 사용되는 클라이언트와 서버에 설치되는 작은 기록 정보 파일이다.

 

1. 클라이언트가 한 사이트에 대해 http 요청 메시지를 보낸다.

2. 서버는 클라이언트를 식별하는 번호를 부여한 후 백엔드 데이터베이스 안에 저장한다.

3. 서버는 http 응답과 함께 Set-cookie 필드에 식별번호를 담는다.

4. 클라이언트가 다음으로 http 요청 메시지를 보낼 때, 클라이언트는 헤더 라인에 Cookie 필드에 해당 식별번호를 담아 보내며, 서버는 각 쿠키에 해당하는 동작(최근 본 상품 등, 방문한 사이트 기반 추천 등)을 한다.

 

웹 캐시(Web cache)


웹 캐시(혹은 프록시 서버)는 객체를 요청하는 클라이언트와 객체를 제공하는 서버의 중간에 위치한 서버 어플리케이션이다. 웹 캐시는 가지고 있는 저장 디스크에 최근 호출된 객체의 사본을 저장해두며, 클라이언트가 해당 객체를 요청했을 시 HTTP 응답 메시지와 객체를 반환한다. 만약 웹 캐시가 객체를 가지고 있지 않다면 웹 캐시는 원래의 서버에 HTTP 요청을 보내 전송된 객체를 클라이언트에 HTTP 응답 메시지와 함께 보낸다.

 

웹 캐시는 클라이언트로부터 객체를 요청 받아 응답을 보내는 서버이자, 원래의 서버에 객체를 요청하는 클라이언트이다.

 

웹 캐시의 장점

  • 클라이언트의 요구에 대한 응답 시간을 줄일 수 있다.
  • 한 기관에서 인터넷으로 접속하는 웹 트래픽을 줄일 수 있다. 

조건부 GET(conditional GET)

웹 캐시에 존재하는 객체가 최신 버전이 아닌 상황을 방지하기 위해 객체가 최신임을 확인하는 조건부 GET을 사용한다.

HTTP 요청 메시지가 GET 방식을 사용하고, 헤더 필드에 If-Modified-Since가 있다면 조건부 GET이다.

 

1. 웹 캐시가 서버에게 요청 메시지를 보내면 서버는 객체와 함께 응답 메시지를 보낸다.

2.캐시는 클라이언트에게 객체와 응답 메시지를 보내고 객체가 마지막으로 수정된 날짜와 객체를 저장한다.

3. 클라이언트가 같은 객체를 요청하면 웹 캐시는 조건부 GET으로 객체가 갱신되었는지 확인한다. 해당 요청의 헤더 필드에는 If-Modified-Since가 있으며, 이 필드의 값은 서버로부터 얻어낸 객체가 마지막으로 수정된 날짜이다.

4. 객체가 해당 날짜 이후로 수정되었다면 서버는 객체와 함께 응답 메시지를 보낸다. 객체가 수정되지 않았다면 응답 메시지만 보내며, 상태 라인의 상태 코드와 문장에는 304 Not Modified가 들어간다.

 

HTTP/2


하나의 TCP 연결을 사용하여 여러개의 객체를 보내게 되면 앞쪽의 큰 객체 때문에 뒤쪽에 요청한 작은 객체들의 전달에 지연이 생기게 된다. 이를 HOL(Head Of Line) 블로킹이라 한다. HTTP/1.1에서는 이 문제를 해결하기 위해 여러개의 병렬 TCP 연결을 연다.

HTTP/2에서는 이러한 병렬 TCP 연결의 수를 줄이는 것이 주요 목표 중 하나이다.

 

HTTP/2의 특징

  • 객체의 분할: 객체를 프레임(frame)이라는 단위로 쪼갠 후 각 프레임을 인터리빙하여 전송한다. 즉, 첫번째 객체의 첫 프레임을 보내고, 두번째 객체의 첫 프레임을 보내는 형식으로 이루어진다.
  • 메시지 우선순위화(message priorization): FCFS로 객체를 전송하는 HTTP/1.1과 달리 HTTP/2에서는 각 요청들의 우선순위를 조정할 수 있다. 
  • 서버 푸싱: 서버는 클라이언트의 요청 없이도 추가적인 객체를 클라이언트에게 보낼 수 있다. 이를 통해 해당 요청들을 기다리는 지연을 없앤다.

'네트워크' 카테고리의 다른 글

(8) Reliable Data Transfer Protocol(rdt)  (0) 2024.04.12
(6) DNS  (0) 2024.04.02
(5) E-mail  (0) 2024.03.31
(3) TCP와 UDP, HTTP  (0) 2024.02.21
(1) 네트워크 용어 및 패킷  (0) 2024.02.18