HTTP 완벽 가이드
3. HTTP 메시지
- HTTP가 인터넷의 배달원이라면 HTTP 메시지는 무언가 담아 보내는 소포와 같다.
3.1 메시지의 흐름
- HTTP 메시지는 HTTP 애플리케이션 간에 주고 받는 데이터의 블록이다.
- 메시지의 내용과 의미를 설명하는 텍스트 메타 정보로 시작하고 그 다음에 선택적으로 데이터가 올 수 있다.
- 이 메시지는 클라이언트, 서버, 프락시 사이를 흐르며 인바운드, 아웃바운드, 업스트림, 다운스트림은 메시지의 방향을
의미하는 용어이다.
3.1.1 메시지는 원 서버 방향을 인바운드로 하여 송신된다.
- HTTP는 인바운드와 아웃바운드라는 용어를 트랜잭션 방향을 표현하기 위해 사용한다.
메시지 ------ 인바운드 ( GET / index.html HTTP/1.0 )-------> 서버
메시지<----- 아웃바운드 ( HTTP/1.0 200 ok .... ) -------- 서버
- 메시지가 원 서버로 향하는 것은 인바운드로 이동하는 것이고 모든 처리가 끝난 뒤에 메시지가 사용자 에이전트로
돌아오는 것은 아웃바운드로 이동하는 것이다.
3.1.2 다운 스트림으로 흐르는 메시지
- HTTP 메시지는 강물과 같이 흐른다.
- 요청 메시지냐 응답 메시지냐 관계 없이 메시지는 다운스트림으로 흐른다.
클라이언트 --- 프락시1 --- 프락시2 --- 프락시3 ---> 서버
메시지는 결코 업스트림으로 흐르지 않는다.
서버 --- 프락시3 --- 프락시2 --- 프락시1 ---> 클라이언트
- 요청에서는 프락시1이 프락시3의 업스트림이지만 응답에서는 프락시 3의 다운스트림이다.
3.2 메시지의 각 부분
- HTTP 메시지는 단순한, 데이터의 구조화된 블록이다.
- 메시지는 시작줄, 헤더 블록, 본문으로 이루어진다.
- 시작줄은 이것이 어떤 메시지인지 서술하며, 헤더 블록은 속성을, 본문은 데이터를 담고 있다. 본문은 없을 수도 있다.
- 시작줄과 헤더는 줄 단위로 분리된 아스키 문자열이다. 각 줄은 캐리지 리턴과 개행문자로 이루어진 두 글자의
줄바꿈 문자열( CRLF )로 끝난다.
- 엔터티 본문, 메시지 본문은 단순히 선택적인 데이터 덩어리이다. 시작줄이나 헤더와 달리 텍스트나 이진 데이터를 포함
할 수도 비어 있을 수도 있다.
3.2.1 메시지 문법
- 요청 메시지는 웹 서버에 어떤 동작은 요구하며 응답 메시지는 요청의 결과를 클라이언트에게 돌려준다.
요청 메시지 형식
< 메서드 > < 요청 URL > < 버전 >
< 헤더 >
< 엔터티 본문 >
응답 메시지 형식
< 버전 > < 상태 코드 > < 사유 구절 >
< 헤더 >
< 엔터티 본문 >
3.2.2 시작줄
- 모든 HTTP 메서드는 시작줄로 시작한다.
- 요청 메시지의 시작줄은 무엇을 해야 하는 지 말해주며 응답 메시지의 시작줄은 무슨 일이 일어났는지 말해준다.
※ 요청줄
- 요청 메시지는 리소스에 대해 무언가를 해달라고 부탁한다.
< 메서드 > < 요청 URL> < 버전 >
GET /test/hi-there.txt HTTP/1.0
- 이 모든 필드는 공백으로 구분된다.
- 메서드는 GET이고, 요청 URL은 /test/hi-there.txt이며 버전은 HTTP/1.1이다.
※ 응답줄
- 응답 메시지는 수행 결과에 대한 상태 정보와 결과 데이터를 클라이언트에게 돌려준다.
< 버전 > < 응답 코드 > < 사유 구절 >
HTTP/1.0 200 OK
- 이 모든 플드는 공백으로 구분된다.
- 버전은 HTTP/1.0이고, 상태 코드는 200, 사유 구절은 OKK로 문서가 성공적으로 반환됨을 의미한다.
※ 메서드
- 요청 시작줄은 메서드로 시작하며, 서버에게 무엇을 해야 하는지 말해준다.
- HTTP 명세는 공통 요청 메서드의 집합을 정의한다.
메서드 설명 본문의 유무
GET 서버에서 어떤 문서를 가져온다. 없음
HEAD 서버에서 어떤 문서에 대한 해더만 가져온다. 없음
POST 서버가 처리해야 할 데이터를 보낸다. 있음
PUT 서버에 요청 메세지의 본문을 저장한다. 있음
TRACE 메시지가 프락시를 거쳐 서버에 도달하는 과정을 추적 없음
OPTIONS서버가 어떤 메서드를 수행할 수 있는지 확인한다. 없음
DELETE 서버에서 문서를 제거한다. 없음
- 모든 서버가 메서드를 모두 구현한 것은 아니며 다른 서버는 그들만의 메서드( 확장 메서드 )를 추가로 구현했을
수도 있다.
※ 상태 코드
- 메서드가 서버에게 무엇을 해야 하는 지 말해주는 것처럼, 상태 코드는 클라이언트에게 무슨 일이 일어났는지 말해 준다.
- 상태 코드는 응답의 시작줄에 위치한다. 숫자로 된 코드와, 문자 열로 되어 있어 사람이 이해하기 쉬운 메시지 두 형태를
모두 반환한다.
- 사유 구절이 사람에게 쉽게 읽히는 반면 숫자로 된 코드는 프로그램이 에러 처리를 하기 유용하다.
전체 범위 정의된 범위 분류
100 - 199 100 - 101 정보
200 - 299 200 - 206 성공
300 - 399 303 - 305 리다이렉션 => 리소스가 옮겨짐
400 - 499 400 - 415 클라이언트 에러 => 클라이언트가 뭔가 잘 못 요청함
500 - 599 500 - 505 서버 에러 => 서버에서 뭔가 실패했음
- 현재 버전의 HTTP는 각 상태 분류에 대해 적은 수의 코드만을 정의했다. 프로토콜이 진화하며 더 많은 상태 코드가
HTTP 명세에 공식적으로 등록될 것이다.
- 우리가 인식할 수 없는 상태 코드 ( Ex 515 )를 받게 되면 다른 메시지 ( Ex 5XX ) 와 마찬가지로 의미를 간주할 수 있어야
한다.
※ 사유 구절
- 응답 시작줄의 마지막 구성요소로 상태 코드에 대해 글로 된 설명을 제공한다.
- 사유 구절은 상태 코드와 일대일로 대응된다.
※ 버전 번호
- 버전 번호는 HTTP / x.y 형식으로 요청과 응답 메시지 양쪽 모두에 기술된다.
- HTTP 애플리케이션이 자신이 따르는 프로토콜의 버전을 상대방에게 말해주기 위한 수단이 된다.
- 버전 번호는 HTTP로 대화하는 애플리케이션들에게 대화 상대의 능력과 메시지의 형식에 대한 단서를 제공하기 위한
것이다. HTTP 버전 1.1 애플리케이션과 대화하는 HTTP 1.2 버전은 1.2 버전의 새로운 기능을 사용 할 수 없다.
- 응답 프로토콜 버전이 HTTP/1.1 이라는 것은 응답을 보낸 애플리케이션이 HTTP/1.1까지 이해할 수 있음을 의미한다.
- 버전 번호는 분수로 다루어지지 않는다. HTTP/1.0의 1과 0은 따로 다루어진다.
Ex HTTP/2.22는 HTTP/2.3보다 크다 22 > 3
3.2.3 헤더
- 시작줄 다음에는 0개, 1개 혹은 여러개의 HTTP 헤더가 온다.
- HTTP 헤더 필드는 요청과 응답 메시지에 추가 정보를 더한다.
- 헤더는 기본적으로 이름 / 값 쌍의 목록이다.
Content-length : 19
- HTTP 헤더는 이름, 쉼표, 공백 ( 없어도 된다. ), 필드 값, CRLF ( 줄바꿈 )가 순서대로 온다.
3.2.4 엔터티 본문
- HTTP 메시지의 세 번째 부분은 엔터티 본문이다.
- 엔터티 본문은 메시지의 화물이라고 할 수 있으며 HTTP가 수송하도록 설계된 것들이다.
- HTTP 메시지는 이미지, 비디오, HTML 문서, 소프트웨어 애플리케이션, 신용카드 트랜젝션, 전자우편 등 여러 종류의
데이터를 실어 나를 수 있다.
3.3 메서드
※ 모든 서버가 모든 메서드를 구현하지 않는다는 것에 주의하자!!
3.3.1 안전한 메서드 ( Safe Method )
- HTTP는 안전한 메서드라 불리는 메서드의 집합을 정의한다.
- GET, HEAD 메서드는 안전하다고 할 수 있는데, 이는 GET이나 HEAD 메서드를 사용하는 HTTP의 결과로 서버에 어떤
작용도 없음을 의미한다.
=> 작용이 없다는 것은 HTTP 요청의 결과로 서버에서 일어나는 일은 아무것도 없다는 것이다.
- 안전한 메서드가 서버에 작용을 유발하지 않는다는 보장은 없다.
=> GET 메서드로 데이터를 보내는 것이 가능하다! ( 웹 개발자에게 달려있다. )
3.3.2 GET
- GET은 주로 서버에게 리소스를 달라고 요청하기 위해 쓰인다.
요청 메시지
GET /seasonal/index-fall.html HTTP/1.1
Host: www.joes-hardware.com
Accept: *
응답 메시지
HTTP/1.1 200 OK
Content-Type: text/html
Context-length: 617
<HTML>
...
3.3.3 HEAD
- HEAD 메서드는 GET처럼 행동하지만 서버는 응답으로 헤더만을 돌려준다.
- 엔터티 본문은 반환되지 않는다.
HEAD를 사용하면
리소스를 가져오지 않고도 그에 대해 무엇인가 ( 타입이라거나 )를 알아낼 수 있다.
응답의 상태 코드를 통해, 개체가 존재하는지 확인할 수 있다.
헤더를 확인하여 리소스가 변경되었는지 검사할 수 있다.
요청 메시지
HEAD /seasonal/index-fall.html HTTP/1.1
Host: www.joes-hardware.com
Accept: *
응답 메시지
HTTP/1.1 200 OK
Content-Type: text/html
Context-Length: 617
- 서버 개발자들은 반드시 반환되는 헤더가 GET으로 얻는 것과 정확히 일치함을 보장해야 한다.
- 또한 HTTP/1.1 준수를 위해서는 HEAD 메서드가 반드시 구현되어 있어야 한다.
3.3.4 PUT
- GET 메서드가 서버로부터 문서를 읽어 들이는 데 반해 PUT 메서드는 서버에 문서를 쓴다.
- PUT 메서드는 서버가 요청의 본문을 가지고 요청 URL의 이름대로 새 문서를 만들거나, 이미 URL이 존재한다면
본문을 사용해서 교체하는 것이다.
- PUT은 콘텐츠를 변경할 수 있게 해주기 때문에, 많은 웹 서버가 PUT을 수행하기 전에 사용자에게 비밀번호를
입력해 로그인을 요구할 것이다.
요청 메시지
PUT /product-list.txt HTTP/1.1
Host: www.joes-hardware.com
Content-Type: text/plain
Content-length: 34
Updated product list coming soon!
응답 메시지
HTTP/1.1 201 Created
Location: http://www.joes-hardware.com/product-list.txt
Content-Type: text/plain
Context-Length: 47
http://www.joes-hardware.com/product-list.txt
3.3.5 POST
- POST 메서드는 서버에 입력 데이터를 전송하기 위해 설계되었다.
- POST는 서버에 데이터를 보내기 위해 사용한다. PUT은 서버에 있는 리소스 ( Ex : 파일 )에 데이터를 입력하기 위해
사용한다.
브라우저는 메시지의 엔터티 본문에 데이터를 집어 넣는다.
요청 메시지
POST /inventory-check.cgi HTTP/1.1
Host: www.joes-hardware.com
Content-type: text/plain
Context-length: 18
item=bandsaw 2647
응답 메시지
HTTP/1.1 200 OK
Content-type: text/plain
Context-length: 37
The bandsaw model 2647 is in stock!
3.3.6 TRACE
- 클라이언트가 어떤 요청을 할 때, 요청은 방화벽, 프락시, 게이트웨이 등의애플리케이션을 통과할 수 있다.
- 이들에게는 HTTP요청을 수정할 수 있는 기회가 있다. TRACE 메서드는 자신의 요청이 서버에 도달했을 때 어떻게
보이게 되는지 알려준다.
3.3.7 OPTIONS
- OPTIONS 메소드는 웹 서버에게 특정 리소스에 대해 어떤 메서드가 지원되는지 물어볼 수 있다.
=> 몇몇 서버는 특정 종류의 객체에 대해 특정 동작만을 지원한다.
요청 메시지
OPTIONS * HTTP/1.1
HOST: www.joes-hardware.com
Accept: *
응답 메시지
HTTP/1.1 200 OK
Allow: GET, POST, PUT, OPTIONS
Context-length: 0
OPTIONS 요청이 모든 리소스에 대한 것이므로, 서버는 자신의 리소스에 대해 지원하는 메서드의
목록을 반환한다.
- OPTIONS 메서드는 리소스에 대해 실제로 접근하지 않고도 그것들을 어떻게 접근하는 것이 최선인지 확인할 수 있는
수단을 클라이언트 애플리케이션에게 제공한다.
3.3.8 DELETE
- 서버에게 요청 URL로 지정한 리소스를 삭제할 것을 요청한다.
- 그러나 클라이언트는 삭제가 수행되는 것을 보장하지 못한다. 왜냐하면 HTTP 명세는 서버가 클라이언트에게
알리지 않고 요청을 무시하는 것을 허용하기 때문이다.
요청 메시지
DELETE /product-list.txt HTTP/1.1
Host: www.joes-hardware.com
응답 메시지
HTTP/1.1 200 OK
Content-type: text/plain
Content-Length: 54
I have your delete request, will take time to process
클라이언트는 리소스가 지워졌다고 생각한다.
HTTP 완벽 가이드 : 네이버 도서
네이버 도서 상세정보를 제공합니다.
search.shopping.naver.com