HTTP Multipart
Multipart는 HTTP를 통해 File을 SERVER로 전송하기 위해 사용되는 Content-type이다
HTTP는 간단히 4개로 나눌 수 있다.
1. Request line
2. HTTP Header
3. Empty line
4. Message body
일반적으로 HTTP Request는 Body에 클라이언트가 전송하려고 하는 데이터를 넣을 수 있다. 그리고 Body에 들어가는 데이터 타입을 HTTP Header에 명시해 줌으로써 서버가 타입에 따라 알맞게 처리하게 한다. 이 Body의 타입을 명시하는 Header가 Content-type이다. 그리고 바로 이 Content-type 필드에 MIME 타입을 기술해줄 수 있는데 여러 MIME 타입 중 하나가 바로 Multipart이다.
그런데 보통 HTTP Request의 Body는 한 종류의 타입이 대부분이고, 그래서 Content-type도 타입을 하나만 명시할 수 있다. (예 text/plain, xml/plain. image/jpeg 등등) 그리고 일반적인 form의 submit에 의한 데이터들의 Content-type은 'application/x-www-form-urlencoded'이다.
그런데 만약 자신이 찍은 사진을 올리는 form의 경우, 사진에 대한 설명을 위한 input과 사진 파일을 위한 input 2개가 들어갈 것이다. 그런데 이 두 input 간에 Content-type이 전혀 다르다. 사진 설명은 application/x-www-form-urlencoded가 될 것이고, 사진 파일은 image/jpeg일 것이다. 이걸 동시에 HTTP Header의 Content-type에 명시할 수 없으면, 또한 두 종류의 데이터가 하나의 HTTP Request Body에 들어가야 하는데 한 Body에서 이 2 종류의 데이터를 구분해서 넣어주는 방법도 필요하다
그래서 등장한 것이 multipart 타입이다.
HTTP Request에서 multipart의 Body를 전송하는 규약이 있는데, 이를 이용하여 파일 업로드를 구현하는 것이다. 특히 form에서 파일과 함께 전송하는 경우 multipart/form-data가 된다.
MIME(Multipupose Internet Mail Extensions)
MIME의 유래와 정의
기본적으로 E-mail 전송 프로토콜인 SMTP는 7비트 ASCII 문자만을 지원한다. 그러나 ASCII 문자는 영어밖에 표현할 수 없기에 영어 이외의 언어로 쓰인 이메일은 제대로 전송될 수 없다. 이를 위해 탄생한 것이 MIME이다.
MIME은 ASCII가 아닌 문자 인코딩을 이용해 영어가 아닌 다른 언어로 된 이메일을 보낼 수 있는 방식을 정의한다. 또한 그림, 음악, 영화 같은 8비트짜리 이진 파일을 전자 우편으로 보낼 수 있도록 한다. 즉 이메일을 위한 인터넷 표준 포맷인 것이다.
MIME 타입은 본래 이메일을 위해 정의된 것이지만, HTTP, SIP와 같은 인터넷 프로토콜에서 함께 사용하고 있다.
MIME은 메세지의 종류를 나타내는 Content-type과 또는 다른 MIME 속성 값을 등록할 수 있는 방법을 정의하고 있다.
MIME의 구조
MIME 헤더
- MIME-Version
-MIME-Version:1.0
-해당 메세지가 MIME 형식임을 나타낸다.
- Content-Type
- Content-Type: text/plain
- HTTP Message body에 들어가는 데이터 타입과 서브 타입을 나타낸다.
- multipart 타입을 통해 MIME은 트리 구조의 메세지 형식을 정의할 수 있다.
Encoded-Word
- RFC 2822의 정의에 따르면, 메세지 헤더와 그 값은 항상 ASCII 문자를 사용해야 한다. ASCII가 아닌 헤터 값은 encoded-word 문법에 따라 인코딩 해야 한다.
Multipart메세지
- 서로 붙어있는 여러 개의 메세지를 포함하여 하나의 복합 메세지로 보내진다
- MIME multipart 메세지는 "Content-type:" 헤더에 boundary 파라미터를 포함한다
- boundary는 메세지 파트를 구분하는 역할을 하며, 메세지의 시작과 끝 부분에도 나타난다
- 첫 번째 boundary 전에 나오는 내용은 MIME을 지원하지 않는 클라이언트를 위해 제공한다
- boundary를 선택하는 것은 클라이언트 몫이다. 보통 무작위의 문자를 선택해서 메세지의 본문과 충돌을 피한다
- 멀티파트 폼 제출
- HTTP form을 채워서 제출하면, 가변 길이 텍스트 필드와 업로드 될 객체는 각각 멀티파트 본문을 구성하는 하나의 파트가 되어 보내진다. 멀티파트 본문은 여러 다른 종류의 길이의 값으로 채워진 form을 허용한다.
- multipart/form-data: 사용자가 양식을 작성한 결과 값의 집합을 번들로 만드는데 사용된다.