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과 mulitpart/
다른 MIME 타입은 대략적으로 무엇을 의미하는지 유추하기 쉽지만 위 두 가지 타입에 대해서는 부가적인 설명이 필요할 것 같습니다.
application/octet-stream
옥텟 스트림은 이름에서처럼 8비트 단위의 바이너리 데이터를 의미합니다.
특별히 표현할 수 있는 프로그램이 존재하지 않는 데이터의 경우 기본값으로 octet-stream을 사용합니다.
Content-Disposition 헤더를 attachment 로 줌으로써 해당 데이터를 수신받은 브라우저가 파일을 저장 또는 다른이름으로 저장 여부를 설정하게 할 수 있습니다.
그러나 모든 데이터에 대해 octet-stream 타입을 남용하는 것은 권장하지 않습니다.
multipart/form-data
멀티파트 form-data의 경우 다음과 같이 HTML의 form 태그 안에서 post 와 같은 방식으로 여러가지 데이터를 함께 묶어 전송하는 경우 사용합니다.
다음은 예를 들기 위한 form 태그입니다.
1
2
3
4
5
6
7 |
<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> |
cs |
만약 이름 input에 kim chul soo를 넣고 성별 남에 체크 한 후 사진 첨부파일에 이미지 파일을 첨부한 후 전송을 하게 되면 다음과 같은 식으로 본문이 구성됩니다. Content-Type이 multipart/form-data 라는것이 명시되며 서브파드를 구분할 수 있는 구분자 문자열이 boundary 의 값으로 주어집니다.
boundary 앞에는 --를 주어 경계라는 것을 알려주고 마지막 boundary 에는 --boundary-- 와 같이 뒤에 -- 를 붙여주어 데이터의 끝이라는 것을 알려줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
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--
|
cs |
multipart/byteranges
바이트 레인지의 경우 요청이 아닌 http 응답 메시지에 대한 멀티파트 타입 입니다.
브라우저 측에서 Range Request(범위 요청)을 한 경우에 서버는 응답메세지 상태코드 206 Partial Content 와 함께 범위 응답을 하게 됩니다.
Range Request(범위 요청)란 데이터를 부분적으로 요청하는 것입니다.
예를 들어 고용량 이미지가 웹문서에 삽입되어야 하는 경우 브라우저는 서버측으로 여러번에 걸려 이미지 파일을 리턴해줄 것을 요청할 수 있습니다.
예를들어 하나의 이미지 파일이 1부터 100이라고 가정할 때 1 ~ 50까지만 요청하여 받은 후 51 ~ 100까지 두번에 걸쳐 응답 받을 수 있습니다.
또한 이를 응용하면 이미지 파일을 50까지 받다가 네트워크 오류가 난 경우에 다시 1부터 요청하는 것이 아닌 51부터 요청하여 이어받을 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
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-- |
cs |
추가적인 MIME TYPE
MIME TYPE은 파일 확장자 만큼 많기 때문에 이외의 타입을 확인하고 싶은 경우 다음의 공식 문서를 참고 합니다.
참고글
참고 할만한 글
'웹[Web]' 카테고리의 다른 글
[HTTP] HTTP 쿠키란(Cookie)? 쿠키 등장 배경 그리고 쿠키와 세션의 차이점. (3) | 2018.09.11 |
---|---|
JSON이란? JSON 규칙 (0) | 2018.03.24 |
[HTTP] 리다이렉트(Redirect)란? (2) | 2018.02.15 |
[WEB] 웹에서의 정적 자원과 동적 자원 (1) | 2017.12.20 |
[HTTP] URL Encoding (0) | 2017.10.30 |