[HTTP 완벽 가이드] 3. HTTP 메시지

Jinyongmin·2024년 7월 24일

HTTP 완벽 가이드

목록 보기
3/5
post-thumbnail

이 글은 'HTTP 완벽 가이드' 책을 읽고 정리한 내용입니다.

HTTP가 인터넷의 배달원이라면, HTTP 메시지는 무언가를 담아 보내는 소포와 같다.

메시지의 흐름

메시지는 클라이언트, 서버, 프락시 사이를 흐르며 메시지의 방향을 의미하는 용어는 다음과 같다.

  • 인바운드
  • 아웃바운드
  • 업스트림
  • 다운스트림

1. 메시지는 원 서버 방향을 인바운드로 하여 송신된다.

  • 인바운드 : 메시지가 원 서버로 향하는 것
  • 아웃바운드 : 모든 처리가 끝난 뒤에 메시지가 클라이언트로 돌아오는 것

2. 다운스트림으로 흐르는 메시지

HTTP 메시지는 강물과 같이 흐른다. 요청, 응답 메시지에 관계없이 모든 메시지는 다운스트림으로 흐른다.

메시지의 각 부분

메시지는 시작줄, 헤더 블록, 본문 이렇게 세 부분으로 이루어진다.

  • 시작줄과 헤더는 줄 단위로 분리된 아스키 문자열
  • 각 줄은 캐리지 리턴(ASCII 13), 개행 문자(ASCII 10)로 구성된 두 글자의 줄바꿈 문자열로 끝난다.
    • 이 줄바꿈 문자열은 CRLF라고 쓴다 \r\n

문법

모든 HTTP 메시지는 "요청 메시지" , "응답 메시지" 으로 분류된다.

요청 메시지 형식

<메서드> <요청 URL> <버전>
<헤더>

<엔터티 본문>

응답 메시지 형식

<버전> <상태코드> <사유 구절>
<헤더>

<엔터티 본문>

시작줄

모든 HTTP 메시지는 시작줄로 시작하며 이것이 어떤 메시지인지 서술한다.

  • 요청 메시지 : 무엇을 해야하는지
  • 응답 메시지 : 무슨일이 일어났는지

요청줄

해당 부분에서 서버에서 어떤 동작이 일어나야 하는지 설명해준다.

  • 메서드
  • 동작에 대한 대상을 지칭하는 요청 URL
  • HTTP 버전

응답줄

해당 부분에서 수행 결과에 대한 정보를 클라이언트에게 돌려준다.

  • 수행 결과에 대한 상태 정보
  • 결과 데이터
  • HTTP 버전
  • 상태 코드 및 사유 구절(수행상태에 대해 설명해주는 텍스트)

시작줄의 요소

메서드 : 서버에게 무엇을 해야하는지 말해주는 역할

  • 'GET/special/saw-blade.gif HTTP/1.0'
  • 여기서 'GET'이 메서드이다.

  • 'GET', 'HEAD' 메서드와 같은 경우, 서버에 어떤 작용(DB 서버의 예로 데이터 등록, 수정, 삭제 등)도 없는 안전한 메서드라고 불린다.

상태 코드 : 클라이언트에게 무엇이 일어났는지 말해주는 역할

  • 'HTTP/1.0 200 OK'
  • 여기서 '200이 상태 코드이다.

(상태 코드에 대한 자세한 설명은 생략)

사유 구절 : 상태 코드에 대한 글로 된 설명, 응답 시작줄의 마지막 구성요소

  • 'HTTP/1.0 200 OK'
  • 여기서 'OK'가 사유 구절이다.

버전 번호 : 'HTTP/x.y'형태로 요청, 응답 메세지 양쪽 모두에 기술된다.

  • 자신의 따르는 프로토콜의 버전을 상대방에게 말해주기 위한 수단
  • 'HTTP/1.1'의 버전을 가지고 있다면 해당 버전까지 이해할 수 있음을 의미한다.

헤더 블록

헤더와 메서드는 클라이언트와 서버가 무엇을 하는지 결정하기 위해 함께 사용된다.
헤더는 크게 다섯가지로 분류된다.

1. 일반 헤더(General Headers)

  • 기본적인 정보 제공
  • 예를 들어 요청 메시지, 응답 메시지 작성 시, 요청, 응답의 생성 일시 등
    일반 정보 헤더

일반 캐시 헤더
HTTP/1.0에 도입된 것으로 매번 원 서버로부터 객체를 가져오는 대신, 로컬 복사본으로 캐시할 수 있는 헤더이다.
(캐시에 대한 내용은 7장에서 자세히 설명)

2. 요청 헤더(Request Headers)

  • 요청 메시지에서만 의미를 가지는 헤더
    • 누가, 무엇이 요청을 보냈는지에 대한 정보
    • 클라이언트의 선호, 능력에 대한 정보

요청 정보 헤더


요청 헤더의 종류
요청 헤더에는 기능에 따라 4가지로 분류된다.
1. Accept 관련 헤더 : 클라이언트가 무엇을 원하고 할 수 있는지에 대한 정보를 알려줄 수 있다. 이는 사용할 수 없는 것을 전송하는데 시간과 대역폭을 낭비하지 않기 때문에 서버, 클라이언트 양쪽 모두에게 유익하다.
2. 조건부 요청 헤더 : 이 요청 헤더를 사용하여 클라이언트는 서버에게 요청에 응답하기 전 자신이 설정한 조건이 참인지 확인하게 하는 제약을 포함시킬 수 있다.( 예를 들어 클라이언트 문서 사본 요청 시, 자신이 가지고 있는 사본과 다를 경우에만 전송을 해라)
3. 요청 보안 헤더 : 자체적으로 요청을 위한 간단한 인증요구/응답 체계를 가지고 있다. 이는 인증을 통해 트랜잭션을 더 안전하게 만들 수 있다.
4. 프락시 요청 헤더 : 프락시 서버의 기능을 돕기 위한 헤더

3. 응답 헤더(Response Headers)

  • 클라이언트에게 부가 정보를 제공
  • 누가 응답을 보내는지, 응답자의 능력 등을 설명하여 클라이언트가 더 나은 요청을 할 수 있도록 도와준다.

응답 정보 헤더


4. 엔터티 헤더(Entity Headers)

  • 요청, 응답 양쪽 모두 포함할 수 있기 때문에, 양 타입의 메시지에 모두 나타날 수 있다.
  • 엔터티와 내용물에 대한, 개체의 타입 및 리소스를 요청할 수 있는 유효한 메서드 등 광범위한 정보 제공

엔터티 정보 헤더


1. 콘텐츠 헤더 : 엔터티의 콘텐츠에 대한 구체적인 정보를 제공한다. (종류, 크기 등)

  • 자주 보는 'Content-Type','Content-Length'가 여기 해당된다.

2. 엔터티 캐싱 헤더 : 리소스에 대해 키시된 사본이 아직 유효한지, 유효만료 시점이 언제인지 등

5. 확장 헤더(Extension Headers)

확장 헤더는 애플리케이션 개발자들에 의해 만들어졌지만 아직 승인된 HTTP 명세에는 추가되지 않는 비표준 헤더이다.

본문

엔터티 본문이라고도 불리는 해당 부분은 HTTP 메세지의 화물이라고 할 수 있다.

HTTP가 수송하도록 설계된 것들로 HTTP 메시지는 이미지, 비디오, HTML 문서, 소프트웨어 애플리케이션, 신용카드 트랜잭션, 전자우편 등 여러 종류의 디지털 데이터를 실어 나를 수 있다.

0개의 댓글