티스토리 뷰
HTTP Header중에 Content-Type 필드가 있는데, 이는 엔터티 본문의 MIME 타입을 기술한다.
(여기서 '엔터티'란, HTTP 메시지에 들어가는 실질적인 본문이라고 볼 수 있다.)
(HTTP 메시지에는 요청/응답 라인, 헤더, 엔터티 본문 크게 3가지로 나뉜다 )
(MIME 타입은 HTTP가 웹에서 전송되는 객체 각각에 붙이는 데이터 포맷 라벨로써, Multipurpose Internet Mail Extensions의 약자이다. 이는 원래 각기 다른 전자메일 시스템 사이에서 메시지가 오갈 때 겪는 문제점을 해결하기 위해 설계되었다. 이는 이메일에서 워낙 잘 동작했기 때문에 HTTP에서도 멀티미디어 콘텐츠를 기술하고 라벨을 붙이기 위해 채택되었다. 웹 서버는 모든 HTTP 객체 데이터에 MIME 타입을 붙인다. 웹 브라우저는 서버로부터 객체를 돌려받을 때, 다룰 수 있는 객체인지 MIME 타입을 통해 확인한다.)
(Content-Type 헤더는 원본 엔터티 본문의 미디어 타입을 명시한다. 엔터티가 인코딩을 거친 경우에도 Content-Type 헤더는 여전히 인코딩 전의 엔터티 본문 유형을 명시한다.)
MIME의 멀티파트 이메일 메시지는 서로 붙어있는 여러 개의 메시지를 포함하며 하나의 복합 메시지로 보내진다. 이 붙어있는 여러 개의 구성요소들은 각각 자신에 대해 서술하는 헤더를 포함한다. 각각의 구성요소들은 이어져 있고, 문자열 하나로 서로의 경계가 식별된다.
HTTP는 멀티파트 본문도 지원한다. 그러나 일반적으로는 폼을 채워서 제출할 때와 문서의 일부분을 실어나르는 범위 응답을 할 때의 두가지 경우에만 사용된다.
(multipart/* 는 멀티파트 MIME 타입은 다른 객체들을 포함하는 복합 객체들이다. 하위 타입은 멀티파트 패키징을 구현하는 방법과 컴포넌트를 어떻게 처리하는지 설명한다.)
멀티파트 폼 제출
HTTP 폼을 채워서 제출하면, 가변 길이 텍스트 필드와 업로드 될 객체는 각각이 멀티파트 본문을 구성하는 하나의 파트가 되어 보내진다. 멀티파트 본문은 여러 다른 종류와 길이의 값으로 채워진 폼을 허용한다.
(multipart/form-data: 사용자가 양식을 작성한 결과 값의 집합을 번들로 만드는 데 사용된다.)
(multipart/mixed: 객체들의 집합)
이러한 요청을
Content-Type: multipart/form-data 나
Content-Type: multiplart/mixed 헤더에 멀티파트 본문을 함께 보낼 수 있다.
Content-Type: multipart/form-data; boundary=[abcdefghijklmnopqrstuvwxyz]
이때 boundary는 본문의 서로 다른 부분을 구분하기 위한 구분자로 쓰인다.
-multipart/form-data 인코딩 예시-
클라이언트에서 아래와 같은 폼을 가지고 있다고 할 때,
<FORM action="http://server.com/cgi/handle"
enctype="multipart/form-data"
method="post">
<P>
What is your name? <INPUT type="text" name="submit-name"><BR>
What files are you sending? <INPUT type="file" name="files"><BR>
<INPUT type="submit" value="Send"> <INPUT type="reset">
</FORM>
사용자가 텍스트 필드에 "Sally"라고 입력하고, "essayfile.txt"를 선택했다면 user agent는 아래와 같은 데이터를 돌려보낼 것이다.
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Sally
--AaB03x
Content-Disposition: form-data; name="files"; filename="essayfile.txt" Content-Type: text/plain
...contents of essayfile.txt...
--AaB03x--
사용자가 두번째 파일로 "imagefile.gif"를 선택했다면 user agent는 그 부분을 아래와 같이 생성할 것이다.
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="submit-name"
Sally
--AaB03x
Content-Disposition: form-data; name="files"
Content-Type: multipart/mixed; boundary=BbC04y
--BbC04y
Content-Disposition: file; filename="essayfile.txt" Content-Type: text/plain
...contents of essayfile.txt...
--BbC04y
Content-Disposition: file; filename="imagefile.gif" Content-Type: image/gif
Content-Transfer-Encoding: binary
...contents of imagefile.gif...
--BbC04y--
--AaB03x--
범위 요청
HTTP는 클라이언트가 문서의 일부분이나 특정 범위만 요청할 수 있도록 할 수 있다.
이게 필요한 이유에 대해 설명하자면, HTTP를 통해서 용량이 큰 파일을 다운받고 있는데, 네트워크 문제로 연결이 끊겼다고 생각해보자.
그렇다면 보통의 생각으론 다시 연결을 시도하고 처음부터 대용량의 파일을 처음부터 받아야 할 것이다.
그런데 범위 요청을 이용하면 HTTP Client는 받다가 실패한 엔터티를 일부나 범위로 요청하여서 다운로드가 중단된 시점에서부터 다시 시작할 수 있다. (오리진 서버에서 객체를 처음 요청했을 때와 범위 요청을 했을 때 사이에 아무 변경이 없었다면)
예시
GET /bigfile.html HTTP/1.1
Host: www.joes-hardware.com
Range: bytes=4000-
User-Agent: Mozilla/4.61 [en] (WinNT; I)
...
이 예제에선, 클라이언트가 처음 4,000바이트 이후의 부분을 요청하고 있다. (몇바이트까지인지는 언급하지 않는데, 클라이언트가 문서의 크기가 정확히 얼마인지를 모르기 떄문이다.)
서버는 클라이언트에게 자신의 범위를 받아들일 수 있는지 응답에 Accept-Range 헤더를 포함시키는 방법으로 알려줄 수 있다. 이 헤더의 값은 측정의 단위로 주로 바이트이다.
HTTP/1.1 200 OK
Date: Fri, 05 Nov 1999 22:35:15 GMT
Server: Apache/1.2.4
Accept-Ranges: bytes
...
또한 Range 헤더는 P2P 파일 공유 클라이언트가 멀티미디어 파일의 다른 부분을 여러 다른 피어로부터 동시에 다운로드 받을 때도 널리 사용된다.
범위 요청은 객체의 특정 인스턴스를 클라이언트와 서버 사이에서 교환하는 것이기 때문에, 인스턴스 조작의 일종이라는 것에 주의해야 한다. 이는 클라이언트의 범위 요청은 오직 클라이언트와 서버가 같은 버전의 문서를 갖고 있을 때만 의미가 있음을 의미한다.
멀티파트 범위 응답
(multipart/byteranges: HTTP 메시지가 복수 영역의 내용을 포함하는 경우, 이는 "multipart/byteranges" 객체에 담겨 전송된다. 이 미대어 타입은 MIME 경계로 구분된 두 개 이상의 부분을 포함하며, 각각은 자신의 Content-Type과 Content-Range 필드를 가진다. )
범위 요청에 대한 HTTP 응답 또한 멀티파트가 될 수도 있다. 그러한 응답은 Content-Type: multipart/byteranges 헤더 및 각각 다른 범위를 담고 있는 멀티파트 본문이 함께 온다. 아래는 멀티파트 응답의 예이다.
HTTP/1.0 206 Partial content
Server: Microsoft-IIS/5.0
Date: Sun, 10 Dec 2000 19:11:20 GMT
Content-Location: http://www.joes-hardware.com/gettysburg.txt
Content-Type: multipart/x-byteranges; boundary=--[abcdefghijklmnopqrstuvwxyz]--
Last-Modified: Sat, 09 Dec 2000 00:38:47 GMT
--[abcdefghijklmnopqrstuvwxyz]--
Content-Type: text/plain
Content-Range: bytes 0-174/1441
Fourscore and seven years ago our fathers brough forth on this continent
a new nation, conceived in liberty and dedicated to the proposition that
all men are created equal.
--[abcdefghijklmnopqrstuvwxyz]--
Content-Type: text/plain
Content-Range: bytes 552-761/1441
But in a larger sense, we can not dedicate, we can not consecrate,
we can not hallow this ground. The brave men, living and dead who
struggled here have consecrated it far above our poor power to add
or detract.
--[abcdefghijklmnopqrstuvwxyz]--
Content-Type: text/plain
Content-Range: bytes 1344-1441/1441
and that government of the people, by the people, for the people shall
not perish from the earth.
--[abcdefghijklmnopqrstuvwxyz]--
'Web' 카테고리의 다른 글
HTTP의 keep-Alive와 TCP의 keepalive (0) | 2016.09.21 |
---|---|
콘텐츠 인코딩과 전송 인코딩/청크 인코딩(Contents-Encoding and Transfer-Encoding/Chunked Encoding) (0) | 2016.09.16 |
가상 호스팅 그리고 Host 헤더(Virtual Hosting and Host Header) (0) | 2016.09.12 |
HTTP 헤더 및 요청/응답 과정 (HTTP Headers And the Process of Request/Response) (0) | 2016.09.12 |
웹서버의 이름기반 가상 호스트(Name-based Virtual Host of Web Server like Apache/nginx) (0) | 2016.09.12 |
- Total
- Today
- Yesterday
- object
- TaskExecutor
- runtime data areas
- linux
- JVM
- logging facade
- Apache
- lood
- slf4j
- async
- logback
- logging
- Spring
- good practice
- log
- NGINX
- java
- log level
- webserver
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |