HTTP 메시지

연어는결국강으로·2023년 3월 13일
0

HTTP 완벽 가이드

목록 보기
2/3

학습목표

  • 메시지가 어떻게 흘러가는가
  • HTTP 메시지의 세 부분(시작줄, 헤더, 개체 본문)
  • 요청과 응답 메시지의 차이
  • 요청 메시지가 지원하는 여러 메서드들
  • 응답 메시지가 반환하는 여러 상태 코드들
  • 여러 HTTP 헤더들은 무슨 일을 하는가

1. 메시지의 흐름

HTTP 메시지는 HTTP 애플리케이션 간에 주고받은 데이터의 블록들이다. 이 데이터의 블록들은 텍스트 메타 정보로 시작하고 그 다음에 선택적으로 데이터가 올 수 있다. 이 메시지는 클라이언트, 서버, 프록시 사이를 흐른다. 인바운드, 업스트림, 다운스트림은 메시지의 방향을 의미한다.

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

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

HTTP 메시지는 모두 다운스트림으로 흐른다.


2. 메시지의 각 부분

   메시지는 요청이나 응답 중 하나를 포함한다. 메시지는 시작줄, 헤더 블록, 본문 이렇게 세 부분으로 이루어진다.

  • 시작줄 : 어떤 메시지인지 서술한다.
  • 헤더 블록 : 속성을 담는다.
  • 본문 : 데이터를 담는다. 없을 수도 있다.

   시작줄과 헤더는 그냥 줄 단위로 분리된 아스키 문자열이다. 각 줄은 캐리지 리턴(ASCII 13)과 개행문자(ASCII 10)로 구성된 두 글자의 줄바꿈 문자열(CRLF)로 끝난다.
   HTTP 명세에 따른다면 줄바꿈 문자열은 CRLF이지만 견고한 애플리케이션이라면 그냥 개행 문자도 받아들일 수 있어야 한다. 오래되거나 잘못된 어플리케이션들 중에서는 캐리지 리턴과 개행 문자 모두를 항상 전송하지는 않는 것들도 있다.

1) 메시지 문법

  • 요청 메시지의 형식

  • 응답 메시지의 형식

2) 시작줄

   모든 HTTP 메시지는 시작줄로 시작한다.

😸요청줄

  • 요청 메시지의 시작줄이다.
  • 서버에서 어떤 동작이 일어나야 하는지 설명해주는 메서드와 요청 URL, HTTP 버전을 포함한다.

🐰응답줄

  • 수행 결과에 대한 상태 정보와 결과 데이터를 클라이언트에게 돌려 준다.
  • HTTP 버전, 상태 코드, 사유 구절이 들어 있다.

3) 헤더

  • 일반, 요청, 응답, Entity, 확장 헤더로 분류된다.
  • Entity 헤더 : 본문 크기와 콘텐츠, 혹은 리소스 그 자체를 서술
  • 확장 헤더 : 명세에 정의되지 않은 헤더

3. 메서드

1) Safe Method

  • GET과 HEAD는 안전하다고 할 수 있다.
  • 두 메서드는 요청의 결과로 서버에 어떤 작용도 없기 때문이다.

2) GET

  • 주로 서버에게 리소스를 달라고 요청하기 위해 쓰인다.
  • HTTP/1.1은 서버가 이 메서드를 구현할 것을 요구한다.

3) HEAD

  • 정확히 GET처럼 행동하지만, 서버는 응답으로 헤더만을 돌려준다.

🎅HEAD를 사용하면....

  • 리소스를 가져오지 않고도 그에 대해 무엇인가를 알아낼 수 있다.
  • 응답의 상태 코드를 통해, 개체가 존재하는지 확인할 수 있다.
  • 헤더를 확인하여 리소스가 변경되었는지 검사할 수 있다.
  • 반환되는 헤더가 GET으로 얻는 것과 정확히 일치함을 보장해야 한다.
  • HTTP/1.1 준수를 위해서는 HEAD 메서드가 반드시 구현되어 있어야 한다.

4) PUT

  • 서버에 문서를 쓴다.
  • 서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 교체한다.
  • 많은 웹 서버가 PUT을 수행하기 전에 로그인을 요구할 것이다.

5) POST

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

6) TRACE

  • 클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이게 되는지 알려준다.
  • 목적지 서버에서 루프백(loopback) 진단을 시작한다. 요청 전송의 마지막 단계에 있는 서버는 자신이 받은 요청 메시지를 본문에 넣어 TRACE 응답을 되돌려준다.
  • 진단을 위해 사용할 때는 괜찮지만, 메서드를 구별하는 메커니즘을 제공하지 않는다는 문제가 있다.

7) OPTIONS

  • 웹 서버에게 여러 가지 종류의 지원 범위에 대해 물어본다. 즉, 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는지 물어볼 수 있다.

8) DELETE

9) 확장 메서드

  • 필요에 따라 확장해도 문제가 없도록 설계되어 있으므로, 새로 기능을 추가해도 과거에 구현된 소프트웨어들의 오동작을 유발하지 않는다.
  • HTTP/1.1 명세에 정의되지 않은 메서드다.
  • 어떤 확장 메서드를 정의한다면, 대부분의 HTTP 애플리케이션이 이해할 수 없을 것이다. 반대의 상황도 마찬가지이다.
  • 이런 상황에서는 관용적으로 대처하는 것이 최고다.
  • 프록시는 종단 간(end-to-end) 행위를 망가뜨리지 않을 수 있다면, 알려지지 않은 메서드가 담긴 메시지를 다운스트림 서버로 전달하려고 시도한다.
  • 그렇지 않다면 프락시는 501 Not Implemented 상태 코드로 응답해야 한다.
  • 확장 메서드를 다룰 때는 "엄격하게 보내고 관대하게 받아들여라"라는 오랜 규칙에 따르는 것이 가장 좋다.

0개의 댓글