📕🐘 도로락 - 코끼리를 냉장고에 넣는 방법
웹[Web] | 2018. 1. 30. 22:50

[HTTP] MIME Type(Multipurpose Internet Mail Extensions)

MIME(Multipurpose Internet Mail Extensions) 이란

MIME은 다목적 인터넷 메일 확장이란 뜻으로 전자우편의 데이터 형식을 정의한 표준 포맷입니다.

전자우편은 7비트 ASCII 코드를 사용하여 전송되기 때문에 문자 데이터 이외의 바이너리 데이터(이미지, 동영상, MS 워드같은 문서 등)를 전송할 수 없었습니다.

때문에 여러 멀티미디어 데이터들의 바이너리 데이터를 ASCII 코드로 변환하는 방법(인코딩)과 미디어 종류를 MIME 타입 목록으로 정의하였고, MIME 사양에 따라 멀티미디어 파일의 데이터를 ASCII 데이터로 변환 후 전송하였습니다.

이때 송신측에서는 전송 ASCII 데이터가 원래는 어떤 형식의 파일이었는지 MIME 타입을 기록하여 전송하는데 수신측에서는 해당 MIME 타입을 참고하여 수신한 ASCII 데이터를 원래의 멀티미디어 바이너리로 변환하여 해석합니다.

이렇게 하면 ASCII 데이터만 전송할 수 있는 인터넷 메일의 한계를 극복함과 동시에 여러 가지 타입의 멀티미디어 데이터를 주고 받을 수 있는 것입니다.

추가) MIME의 이름에서도 알 수 있듯이 전자우편에서 사용하기 위해 등장했지만 지금은 HTTP 통신에서 전송 데이터를 표현하기 위해서도 사용하고 있습니다.

MIME 사용 예시

1 ~ 2) 송신자는 바이너리 데이터인 이미지 파일 aaa.png를 MIME 사양에 맞게 ASCII 코드로 인코딩합니다.

3) 인코딩된 이미지 데이터를 수신자에게 전송합니다.

4 ~ 5) 수신자는 인코딩된 이미지 데이터(ASCII)를 MIME TYPE image/png의 사양에 맞게 다시 aaa.png 바이너리 데이터로 디코딩합니다.

MIME TYPE

MIME는 /(슬래쉬)로 구분하여 메인 타입과 서브 타입으로 구성되어 있습니다.

이미지를 예로 들자면 image 메인 타입의 서브 타입으로 image/gif, image/jpeg과 같이 구성됩니다.

MIME 타입으로는 대표적으로 다음과 같은 타입들이 있는데, 서브 타입을 보면 대충 어떤 것을 의미하는지 알 수 있을 것입니다.

메인 타입 설명 서브 타입
text 텍스트를 표현합니다. text/plain, text/html, text/css, text/javascript
image 이미지를 표현합니다. image/gif, image/png, image/jpeg, image/bmp
video 동영상을 표현합니다. video/mp4, video/ogg, video/mpeg4-generic
application 모든 종류의 이진 데이터를 표현합니다. application/octet-stream, application/vnd.mspowerpoint, application/xml, application/pdf, application/json
multipart 여러 가지 타입의 데이터들을 동시에 전송할 때 사용합니다. multipart/form-data, multipart/byteranges

application/octet-stream과 multipart/

다른 MIME 타입은 대략적으로 무엇을 의미하는지 유추하기 쉽지만 위 두 가지 타입에 대해서는 부가적인 설명이 필요할 것 같습니다.

application/octet-stream

옥텟 스트림은 이름에서처럼 8비트 단위의 바이너리 데이터를 의미합니다.

특별히 표현할 수 있는 프로그램이 존재하지 않는 데이터의 경우 기본값으로 octet-stream을 사용합니다.

Content-Disposition 헤더를 attachment로 줌으로써 해당 데이터를 수신받은 브라우저가 파일을 저장 또는 다른 이름으로 저장 여부를 설정하게 할 수 있습니다.

그러나 모든 데이터에 대해 octet-stream 타입을 남용하는 것은 권장하지 않습니다.

multipart/form-data

멀티파트 form-data의 경우 다음과 같이 HTML의 <form> 태그 안에서 post와 같은 방식으로 여러 가지 데이터를 함께 묶어 전송하는 경우 사용합니다.

다음은 예를 들기 위한 <form> 태그입니다.

<form action="/inserProfile" method="post" enctype="multipart/form-data">
  이름 : <input type="text" name="userName"><br>
  성별 : <input type="checkbox" name="male">남</input>
         <input type="checkbox" name="female">여</input><br>
  사진 : <input type="file" name="profileImage"><br>
         <input type="submit" value="전송">
</form>

만약 이름 inputkim chul soo를 넣고 성별 남에 체크한 후 사진 첨부파일에 이미지 파일을 첨부한 후 전송을 하게 되면 다음과 같은 식으로 본문이 구성됩니다. Content-Typemultipart/form-data라는 것이 명시되며 서브파트를 구분할 수 있는 구분자 문자열이 boundary의 값으로 주어집니다.

boundary 앞에는 --를 주어 경계라는 것을 알려주고 마지막 boundary에는 --boundary--와 같이 뒤에 --를 붙여주어 데이터의 끝이라는 것을 알려줍니다.

Content-Type: multipart/form-data; boundary=Bjwo02D

--Bjwo02D
Content-Disposition: form-data; name="userName"
kim chul soo

--Bjwo02D
Content-Disposition: form-data; name="male"
true

--Bjwo02D
Content-Disposition: form-data; name="profileImage"; filename="img.jpg"
Content-Type: image/jpeg

(...이미지 바이너리 데이터...)
--Bjwo02D


(...서브파트가 더 있는경우...)
--Bjwo02D--

multipart/byteranges

바이트 레인지의 경우 요청이 아닌 HTTP 응답 메시지에 대한 멀티파트 타입입니다.

브라우저 측에서 Range Request(범위 요청)을 한 경우에 서버는 응답 메시지 상태 코드 206 Partial Content와 함께 범위 응답을 하게 됩니다.

Range Request(범위 요청)란 데이터를 부분적으로 요청하는 것입니다.

예를 들어 고용량 이미지가 웹 문서에 삽입되어야 하는 경우 브라우저는 서버측으로 여러 번에 걸쳐 이미지 파일을 리턴해줄 것을 요청할 수 있습니다.

예를 들어 하나의 이미지 파일이 1부터 100이라고 가정할 때 1 ~ 50까지만 요청하여 받은 후 51 ~ 100까지 두 번에 걸쳐 응답 받을 수 있습니다.

또한 이를 응용하면 이미지 파일을 50까지 받다가 네트워크 오류가 난 경우에 다시 1부터 요청하는 것이 아닌 51부터 요청하여 이어받을 수 있습니다.

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385

--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270

-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--

추가적인 MIME TYPE

MIME TYPE은 파일 확장자만큼 많기 때문에 이외의 타입을 확인하고 싶은 경우 다음의 공식 문서를 참고합니다.

http://www.iana.org/assignments/media-types/media-types.xhtml

참고글

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types

참고할만한 글

https://ko.wikipedia.org/wiki/%EB%AF%B8%EB%94%94%EC%96%B4_%ED%83%80%EC%9E%85

https://ko.wikipedia.org/wiki/MIME

도로락

도로락

Writer

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그