[이번 장에서 배울 것]
- 메시지가 어떻게 흘러가는가
- HTTP 메시지의 세 부분(시작줄, 헤더, 개체 본문)
- 요청과 응답 메시지의 차이
- 요청 메시지가 지원하는 여러 기능(메서드)들
- 응답 메시지가 반환하는 여러 상태 코드들
- 여러 HTTP 헤더들은 무슨 일을 하는가
HTTP 메시지
란? HTTP 애플리ㅔ이션 간에 주고받은 데이터 블록들.
이 메시지는 클라이언트, 서버, 프락시 사이를 흐르며 인바운드
, 아웃바운드
, 업스트림
, 다운스트림
의 메시지 방향을 가진다.
인바운드와 아웃바운드는 트랜잭션 방향을 표현.
메시지가 원 서버로 이동하는 것을(서버 방향) 인바운드
로 이동, 사용자 에이전트로 돌아오는 것을 아웃바운드
로 이동한다고 표현한다.
HTTP 메시지는 마치 강물과 같이 항상 다운스트림으로 흐른다. 요청 메시지냐 응답 메시지냐에 따라 관계 없이 항상 메시지의 발송자는 수신자의 업스트림이 된다.
메시지는 시작줄
, 헤더 블록
, 본문
이렇게 세 부분으로 이뤄진다.
시작줄과 헤더는 CRLF(줄바꿈)으로 끝난다.
모든 HTTP 메시지는 요청 메시지
와 응답 메시지
로 분류된다.
<메서드> <요청 URL> <버전>
<헤더>
<엔터티본문>
<버전> <상태 코드> <사유 구절>
<헤더>
<엔터티 본문>
헤더나 엔터티 본문이 없어도 헤더 집합은 항상 빈 줄(CRLF)로 끝나야 한다. 잘 지켜지지 않는 경우 호환을 위해 CRLF 없이 끝나는 메시지도 받아들일 수 있어야 한다.
요청 메시지의 시작줄은 무엇을 해야하는지 말해주고, 응답 메시지의 시작줄은 무슨 일이 일어났는지 말해준다.
요청 메시지의 시작줄. 서버에게 어떤 동작이 일어나야 하는지 설명해주는 메서드
와 그 동작에 대한 대상을 지칭하는 요청 URL
이 들어 있고 HTTP 버전
도 포함된다.
응답 메시지에 쓰인 HTTP 의 버전
, 상태코드
, 사유구절
이 들어 있다.
요청줄은 메서드로 시작하고, 서버에게 무엇을 해야하는지 말해준다.
메서드 | 설명 | 메시지 본문 유무 |
---|---|---|
GET | 서버에서 어떤 문서를 가져온다. | 없음 |
HEAD | 서버에서 어떤 문서에 대해 헤더만 가져온다. | 없음 |
POST | 서버가 처리해야 할 데이터를 보낸다. | 있음 |
PUT | 서버에 요청 메시지의 본문을 저장한다. | 있음 |
TRACE | 메시지가 프락시를 거쳐 서버에 도달하는 과정을 추적 | 없음 |
OPTIONS | 서버가 어떤 메서드를 수행할 수 있는지 확인한다. | 없음 |
DELETE | 서버에서 문서를 제거한다. | 없음 |
HTTP는 쉽게 확장할 수 있기 때문에 서버에 따라 확장 메서드(메서드를 추가로 구현)를 구현할 수 있다.
응답 메시지의 시작줄에 위치한다.
공식적이지 않은, 프로토콜의 확장으로 인해 정의된 상태코드를 받게 되더라도 그것이 포함되는 범주의 상태코드로 가정하고 다루어야 한다.(ex. 515받으면 5XX, 즉 서버 에러로)
응답줄의 마지막 구성요소. 사람이 이해하기 쉬운 버전의 상태코드로, 규칙이 없다.
HTTP/x.y 형식. 요청과 응답 메시지 모두에 기술. HTTP 애플리케이션들이 자신이 따르는 프로토콜 버전을 상대방에게 말해주기 위한 수단이다.
HTTP/1.1은 HTTP/1.0을 포함한 HTTP/1.1까지 이해할 수 있다는 뜻
이름/값 쌍의 목록
HTTP 메시지의 세번째 부분. 선택적(없을수도 있다).
이미지, 비디오, HTML 문서, 소프트웨어 어플리케이션, 신용카드 트랜잭션, 전자우편 등 여러 종류의 디지털 데이터 실어 나를 수 있다.
GET, HEAD를 안전한 메서드라 부른다. 서버에 어떤 작용도 없음(HTTP 요청의 결과로 인해 서버에서 일어나는 일이 없다)을 의미한다.
안전한 메서드의 목적은, 안전하지 않은 메서드 사용 시 이를 사용자에게 알려줄 수 있도록 하기 위함이다. (ex. 온라인 쇼핑에서 구매 버튼을 눌러 POST 요청이 전송된 경우, 신용카드가 결제된다는 것을 알림)
주로 서버에게 리소스를 달라고 요청하기 위해 사용된다.
GET처럼 행동하지만, 서버는 응답으로 헤더만을 돌려주고 엔터티 본문을 돌려주지 않는다. 이를 사용하면
서버에 문서를 쓴다. 서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL이 존재한다면 본문을 사용해서 교체한다.
서버에 입력 데이터를 전송하기 위해 설계되었다. HTML 폼을 지원하기 위해 흔히 사용된다.
POST는 서버에 데이터를 보내기 위함, PUT은 서버에 있는 리소스(파일 등)에 데이터를 입력하기 위함
클라이언트가 어떤 요청을 할 때 방화벽, 프락시, 게이트웨이 등의 애플리케이션을 통과할 수 있는데 TRACE 메서드는 클라이언트에게 자신의 요청이 서버에 도달했을 때 어떻게 보이게 되는지를 알려준다.
TRACE는 주로 진단을 위해 사용되며, 프락시나 다른 애플리케이션들이 요청에 어떤 영향을 미치는지도 알 수 있다.
단, 메서드를 구별하는 메커니즘을 제공하지 않아 어떻게 TRACE 요청을 처리할 것인지에 대해선 일반적으로 중간 애플리케이션이 결정한다. (예를 들어, 프락시는 POST 요청은 바로 서버로 통과시키지만, GET은 웹캐시와 같은 다른 HTTP 애플리케이션으로 전송한다.)
웹 서버에게 여러 가지 종류의 지원 범위에 대해 물어본다. 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는지 물어볼 수 있다.
리소스에 실제로 접근하지 않아도 그것들에 어떻게 접근하는 것이 최선인지 확인할 수 있는 수단을 제공한다.
서버에게 요청 URL로 지정한 리소스를 삭제할 것을 요청한다. 그러나 서버가 클라이언트에게 알리지 않고 요청을 무시하는 것을 허용하기 때문에 삭제가 수행되는 것은 보장할 수 없다.
필요에 따라 확장해도 문제가 없다. 새로 기능을 추가해도 과거에 구현된 소프트웨어들의 오작동을 유발하지 않는다. 예를 들어 LOCK, MKCOL, COPY, MOVE와 같은 웹 배포 확장 메소드들이 있다. 확장 메서드는 관용적인 것이 좋다.
상태 코드는 클라이언트에게 그들의 트랜잭션을 이해할 수 있는 쉬운 방법을 제공한다.
HTTP/1.1에서 도입.
Continue. 요청의 시작 부분 일부가 받아들여지고, 클라이언트는 나머지를 계속 이어서 보내야 함을 의미한다. 이것을 보낸 후 서버는 반드시 요청을 받아 응답해야 한다.
100 Continue는 HTTP 클라이언트 애플리케이션이 서버에 엔티티 본문을 전송하기 전에 그 엔티티 본문을 서버가 받아들일 것인지 확인하려고 할 때 확인 작업을 최적하기 위한 의도로 도입되었다.
클라이언트가 관심있어 하는 리소스에 대해 다른 위치를 사용하라고 말해주거나 그 리소스의 내용 대신 다른 대안 응답을 제공한다.
만약 리소스가 옮겨졌으면 어디서 찾을 수 있는지 리다이렉션 상태코드와 Location 헤더를 선택적으로 보낼 수 있다.
리소스에 대한 애플리케이션의 로컬 복사본이 원래 서버와 비교했을 때 유효한지 확인하기 위해 사용되기도 한다. (304 Not Modified)
302, 303, 307 상태코드가 중복되는 부분이 있다. 이는 주로 HTTP/1.0과 HTTP/1.1이 이 상태 코드를 다루는 방식의 차이점에 기인한다.
결국 서버는 리다이렉트 응답에 들어갈 가장 적절한 리다이렉트 상태 코드를 선택하기 위해 클라이언트의 HTTP 버전을 검사할 필요가 있다.
클라이언트가 서버가 다룰 수 없는 무엇인가로 보내는 경우이다.
이외에 408 Request Timeout, 409 Conflict, 410 Gone, 411 Length Required, 412 Precondition Failed, 413 Request Entity Too Large, 414 Request URI Too Long, 415 Unsupported Media Type, 416 Requested Range Not Satisfiable, 417 Expectation Failed 등이 있다.
클라이언트가 올바른 요청을 보냈음에도 서버 자체에서 에러가 발생하는 경우가 있다.
헤더와 메서드는 클라이언트와 서버가 무엇을 하는지 결정하기 위해 함께 사용된다.
클라이언트와 서버 모두 사용. 다양한 목적으로 사용
Date 등이 있다.
요청 메시지를 위한 헤더. 서버에게 클라이언트가 받고자 하는 데이터 타입이 무엇인지와 같은 부가 정보를 제공.
Accept 등이 있다.
응답 메시지를 위한 헤더. 클라이언트에게 정보를 제공하기 위함. 예를 들어 클라이언트가 어떤 종류의 서버와 대화하고 있는가를 나타낸다.
예를 들어 Server 등이 있다.
엔터티 본문에 대한 헤더. 예를 들어 엔터티 헤더는 엔터티 본문에 있는 데이터 타입이 무엇인지 말해줄 수 있다.
Content-Type 등이 있다.
비표준 헤더