HTTP 메시지

DevSeong2·2021년 7월 21일
0

HTTP

목록 보기
3/7
post-thumbnail
『HTTP 완벽 가이드』 교재와 다른 레퍼런스를 참고하여 작성하였습니다.

HTTP 메시지

HTTP 메시지는 HTTP 애플리케이션 간에 주고받은 데이터의 블록들입니다. 이 데이터의 블록들은 메시지의 내용과 의미를 설명하는 텍스트 메타 정보로 시작하고 그 다음에 선택적으로 데이터가 올 수 있습니다.

메시지는 원 서버 방향을 인바운드로 하여 송신됩니다.
HTTP는 인바운드와 아웃바운드라는 용어를 트랜잭션 방향을 표현하기 위해 사용합니다.

  • 인바운드
    • 서버 또는 네트워크 내부로 진입
    • 클라이언트 ➡ 서버
  • 아웃바운드
    • 서버 또는 네트워크 영역 외부로 송출
    • 서버 ➡ 클라이언트
      HTTP 메시지는 항상 다운스트림으로 흐릅니다.

메시지의 각 부분

각 메시지는 클라이언트로부터의 요청이나 서버로부터의 응답 중 하나를 포함합니다. 메시지는 시작줄 헤더 블록, 본문 이렇게 세 부분으로 이루어집니다.

  • 시작줄: 어떤 메시지인지
  • 헤더 블록: 속성
  • 본문: 데이터

메시지 문법

요청 메시지는 웹 서버에 어떤 동작을 요구하고 응답 메시지는 요청의 결과를 클라이언트에게 돌려줍니다.

시작줄

모든 HTTP 메시지는 시작줄로 시작합니다. 요청 메시지의 시작줄은 무엇을 해야 하는지, 응답 메시지의 시작줄은 무슨 일이 일어났는지 말해줍니다.

요청줄

요청 메시지의 시작줄, 혹은 요청줄에는 서버에서 어떤 동작이 일어나야 하는지 설명해주는 메서드와 그 동작에 대한 대상을 지칭하는 요청 URL이 들어있습니다. 또한 요청줄은 클라이언트가 어떤 HTTP 버전으로 말하고 있는지 서버에게 알려주는 HTTP 버전도 포함하고 있습니다.

  • 메서드
    클라이언트 측에서 서버가 리소스에 대해 수행해주길 바라는 동작

    메서드설명메시지 본문
    GET서버에서 어떤 문서를 가져옵니다.없음
    HEAD서버에서 어떤 문서에 대해 헤더만 가져옵니다.없음
    POST서버가 처리해야 할 데이터를 보냅니다.있음
    PUT서버에 요청 메시지의 본문을 저장합니다.있음
    TRACE메시지가 프락시를 거쳐 서버에 도달하는 과정을 추적합니다.없음
    OPTIONS서버가 어떤 메서드를 수행할 수 있는지 확인합니다.없음
    DELETE서버에서 문서를 제거합니다.없음
  • 요청 URL
    요청 대상이 되는 리소스를 지칭하는 완전한 URL혹은 URL의 경로 구성요소

  • 버전
    이 메시지에서 사용 중인 HTTP 버전
    버전 번호는 HTTP/x.y 형식으로 요청과 응답 메시지 양쪽 모두에 기술됩니다. 이것은 HTTP 애플리케이션들이 자신이 따르는 프로토콜의 버전을 상대방에게 말해주기 위한 수단이 됩니다.

응답줄

응답 메시지는 수행 결과에 대한 상태 정보와 결과 데이터를 클라이언트에게 돌려줍니다. 응답 메시지의 시작줄 혹은 응답줄에는 응답 메시지에서 쓰인 HTTP 버전, 숫자로 된 상태 코드, 수행 상태에 대해 설명해주는 텍스트로 된 사유 구절이 들어있습니다.

  • 버전
    요청 메시지에서 쓰인 HTTP 버전
  • 상태 코드
    요청 중에 무엇이 일어났는지 설명하는 세 자리의 숫자
    클라이언트가 HTTP 서버에게 요청 메시지를 보낼 때, 많은 일이 발생하기 때문에 클라이언트에게 무슨 일이 일어났는지 상태 코드를 통해 알려줍니다.
  • 사유 구절(reason-phrase)📜
    숫자로 된 상태 코드의 의미를 사람이 이해할 수 있게 설명해주는 짧은 문구
    사유 구절은 상태 코드와 일대일로 대응되며, 애플리케이션 개발자들이 사용자에게 요청 중에 무슨 일이 일어났는지 알려주기 위해 남겨줄 수 있는 상태 코드의 사람이 이해하기 쉬운 버전!

헤더

시작줄 다음에는 0개, 1개 혹은 여러 개의 HTTP 헤더가 옵니다. HTTP 헤더 필드는 요청과 응답 메시지에 이름/값 쌍의 목록으로 추가 정보를 더합니다.

헤더 분류

  • 일반 헤더: 요청과 응답 양쪽에 모두 나타날 수 있음
  • 요청 헤더: 요청에 대한 부가 정보를 제공
  • 응답 헤더: 응답에 대한 부가 정보를 제공
  • Entity 헤더: 본문 크기와 콘텐츠, 혹은 리소스 그 자체를 서술
  • 확장 헤더: 명세에 정의되지 않은 새로운 헤더

각 HTTP 헤더는 이름, 쉼표, 공백, 필드 값, CLRF가 순서대로.

엔터티 본문

엔터티 본문은 선택적이며 이미지, 비디오, HTML 문서, 소프트웨어 애플리케이션, 신용카드 트랜잭션, 전자우편 등 여러 종류의 디지털 데이터를 엔터티 본문에 담아 보냅니다.

메서드

모든 서버가 모든 메서드를 구현하지는 않습니다. HTTP 버전 1.1과 호환되고자 한다면, 서버는 자신의 리소스에 대해 GET과 HEAD 메서드만을 구현하는 것으로 충분합니다.
비록 서버가 모든 메서드를 구현하지 않았다 하더라도 메서드는 대부분 제한적으로 사용될 것입니다.

안전한 메서드(Safe Method)

HTTP는 안전한 메서드라 불리는 메서드의 집합을 정의합니다. GET과 HEAD 메서드는 안전하다고 할 수 있는데, 이는 GET이나 HEAD 메서드를 사용하는 HTTP 요청의 결과로 서버에 어떤 작용도 없기 때문입니다. HTTP 요청의 결과로 인해 서버에서 일어나는 일이 아무것도 없다는 의미.

안전한 메서드가 서버에 작용을 유발하지 않는다는 보장은 없습니다. 안전한 메서드의 목적은, 서버에 어떤 영향을 줄 수 있는 안전하지 않은 메서드가 사용될 때 사용자들에게 그 사실을 알려주는 HTTP 애플리케이션을 만들 수 있도록 하는 것에 있습니다.

GET

서버에게 리소스를 달라고 요청하기 위해 쓰입니다.

HEAD 메서드는 정확히 GET처럼 행동하지만, 서버는 응답으로 엔터티 본문을 포함하지 않은 헤더만을 돌려줍니다.
HEAD를 사용하면

  • 리소스를 가져오지 않고도 그에 대해 무엇인가를 알아낼 수 있습니다.
  • 응답의 상태 코드를 통해, 개체가 존재하는지 확인할 수 있습니다.
  • 헤더를 확인하여 리소스가 변경되었는지 검사할 수 있습니다.

PUT

PUT 메서드는 서버에 문서를 씁니다. 서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL이 존재한다면 본문을 사용해서 교체하는 것입니다.

POST

서버에 입력 데이터를 전송하기 위해 설계되었습니다. 실제로, HTML 폼을 지원하기 위해 흔히 사용됩니다. 채워진 폼에 담긴 데이터는 서버로 전송되며, 서버는 이를 모아서 필요로 하는 곳에 보냅니다.

TRACE

클라이언트가 어떤 요청을 할 때, 그 요청은 방화벽, 프락시, 게이트웨이 등의 애플리케이션을 통과할 수 있습니다. 이들에게는 원래의 HTTP 요청을 수정할 수 있는 기회가 있습니다. TRACE 메서드는 클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이게 되는지 알려줍니다.
따라서 주로 진단을 위해 사용됩니다. 요청이 의도한 요청/응답 연쇄를 거쳐가는지 혹은 프락시나 다른 애플리케이션들이 요청에 어떤 영향을 미치는지
TRACE는 진단을 위해 사용할 떄는 괜찮지만, 그 대신 중간 애플리케이션이 여러 다른 종류의 요청들을 일관되게 다룬다고 가정하는 문제가 있습니다. 많은 애플리케이션은 메서드에 따라 다르게 동작합니다. TRACE는 메서드를 구별하는 메커니즘을 제공하지 않으므로 어떻게 TRACE 요청을 처리할 것인지에 대해서는 일반적으로 중간 애플리케이션이 결정을 내립니다. TRACE 요청은 어떠한 엔터티 본문도 보낼 수 없습니다.

OPTIONS

OPTIONS 메서드는 웹 서버에게 여러 가지 종류의 지원 범위에 대해 물어봅니다. 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는지

DELETE

서버에게 요청 URL로 지정한 리소스를 삭제할 것을 요청합니다. 그러나 클라이언트는 삭제가 수행되는 것을 보장하지 못합니다. 왜냐하면 HTTP 명세는 서버가 클라이언트에게 알리지 않고 요청을 무시하는 것을 허용하기 때문입니다.

확장 메서드

HTTP는 필요에 따라 확장해도 문제가 없도록 설계되어 있으므로, 새로 기능을 추가해도 과거에 구현된 소프트웨어들의 오동작을 유발하지 않습니다.

상태 코드

HTTP 상태 코드는 크게 다섯 가지로 나뉩니다. 상태 코드는 클라이언트에게 그들의 트랜잭션을 이해할 수 있는 쉬운 방법을 제공합니다.

  • 100-199: 정보성 상태 코드
  • 200-299: 성공 상태 코드
  • 300-399: 리다이렉션 상태 코드
  • 400-499: 클라이언트 에러 상태 코드
  • 500-599: 서버 에러 상태 코드

HTTP 상태 코드

헤더

헤더와 메서드는 클라이언트와 서버가 무엇을 하는지 결정하기 위해 함께 사용됩니다. 헤더에는 특정 종류의 메시지에만 사용할 수 있는 헤더와 더 일반 목적으로 사용할 수 있는 헤더, 그리고 응답과 요청 메시지 양쪽 모두에서 정보를 제공하는 헤더가 있습니다.

일반 헤더(General Headers)

일반 헤더는 클라이언트와 서버 양쪽 모두가 사용합니다. 이들은 클라이언트, 서버, 그리고 어딘가에 메시지를 보내는 다른 애플리케이션들을 위해 다양한 목적으로 사용됩니다.

요청 헤더(Request Headers)

요청 헤더는 요청 메시지를 위한 헤더입니다. 서버에게 클라이언트가 받고자 하는 데이터의 타입이 무엇인지와 같은 부가 정보를 제공합니다.

응답 헤더(Response Headers)

응답 메시지는 클라이언트에게 정보를 제공하기 위한 자신만의 헤더를 갖고 있습니다.

엔터티 헤더(Entity Headers)

엔터티 헤더란 엔터티 본문에 대한 헤더를 말합니다. 예를 들어, 엔터티 헤더는 엔터티 본문에 들어있는 데이터의 타입이 무엇인지 말해줄 수 있습니다.

확장 헤더

확장 헤더는 애플리케이션 개발자들에 의해 만들어졌지만 아직 승인된 HTTP 명세에는 추가되지 않은 비표준 헤더입니다. HTTP 프로그램은 확장 헤더들에 대해 설령 그 의미를 모른다 할지라도 용인하고 전달해야 할 필요가 있습니다.

Reference

📗 Understand the Flow of a HTTP Request
📗 HTTP 메시지
📗 HTTP 헤더

profile
차근차근

0개의 댓글