연관된 글
https://pro-gramm-ing.tistory.com/471
인코딩에 대해 다룰 때 MIME 이라는 것을 언급한적이 있었다. 대충 이런내용이다.
태초에 아스키코드가 있었다. 그리고 컴퓨터와 인터넷에서는 아스키코드를 이용한 텍스트를 사용하였다. 하지만 인터넷에서 이메일을 사용하면서 이메일에 텍스트 이외의 이미지, 영상등을 첨부할 일이 생겨났고, 이런 첨부파일들은 아스키코드로 인코딩하기에는 부적합했다.
그래서 사진, 영상과 같은 바이너리 파일들을 아스키코드로 변환하기 위한 인코딩 방법으로 UUEncoding(Unix -to-Unix Encoding)을 사용하게 되었다. 이 인코딩 방식의 단점은 시스템에 따라 파일의 인코딩이 제대로 안되는 문제가 발생한다는 것이었다. 때문에 이를 개선하기 위해 MIME 이라는 것이 개발되었다.
1.MIME이란?
MIME 은 Multipart Internet Mail Extensions 의 약자이다. 현재는 웹을 통해 여러 형태의 파일을 전달할때 쓰이고 있다.
MIME은 표준화된 인코딩 방식의 일종이다. (사용하는 인코딩 유형은 base64 이다. )전자 우편을 위한 인터넷 표준 포맷MIME도 결과적으로 8비트 바이너리 파일을 아스키 문자로 변환한다. 때문에 웹에서 파일의 확장자는 의미가 없다. 어차피 다 아스키 문자로 변환이 되고 변환이 된 후 어떤 MIME Type이냐에 따라 파일의 형식이 결정되기 때문이다. MIME 형식으로 변환이 이루어지는 것은 전자 우편 프로그램이나 서버상에서 자동적으로 이루어진다.
1993년에 모자익 웹 브라우저라는게 나왔는데, 이것이 나오기 이전에는 .jpg, .gif에 대한 MIME type 을 지원을 하지 않아서 외부 그래픽 프로그램이 구동되면서 이미지를 보여줬다고 한다. MIME 타입은 www 가 보급화 되면서 Media Type 이라는 이름으로 확장되었다. 그리고 현재 대부분의 파일 타입은 웹 브라우저 내에서 구동되고 있다.
현재의 웹 브라우저는 웹 서버에 접속해서 html 문서를 요청하면서 html 에 담긴 이미지도 가져온다. 이때 이미지 파일이 웹 브라우져에 지원되는 MIME type 이면 브라우저 내에서 열 수 있다. 그래서 .jgp 나 .gif 파일은 브라우져 내에서 바로 뜬다.
여담으로 파일의 종류는 계속해서 증가하고 있기 때문에 MIME 타입도 계속해서 증가하고 있다. IANA(Internet Assigned Numbers Authority) 라는 인터넷 할당 번호 관리기관에서 파일 타입을 표준화와 추가를 관리하고 있다고 한다.
2.Content-Type 이란?
MIME 과 Content-Type 브라우저의 개발자 도구에서 한번쯤은 봤을것이다. Content-Type 은 Type과 subType으로 나뉜다.
MIME-Type == Contet-Type == Type + subType
위처럼 생각할 수도 있다. MIME 을 통해 파일이 변환되면 변환된 파일의 앞부분에는 Content-Type의 정보가 붙여진다.
그리고 Content-Type 은 MIME 타입중 하나이다. 때문에 정확히는MIME-Type이 Content-Type 보다 더 큰 개념이라 할 수 있다.
서버에서 클라이언트 브라우저로 영상이나 사진같은 어떤 파일을 보낼때, 웹 서버는 http 헤더로 파일의 정보를 담은바이트 Stream을 보낸다. 이 바이트 스트림에는 MIME 방식의 인코딩의 결과로 생긴 Content-type 정보도 포함되어 있다. Content-Type 이 어떤 MIME-Type 중 하나인지 살펴보고 브라우저는 이 바이트 스트림이 어떤 종류에 대한 스트림 바이트 스트림인지 파악한다.
예를 들어 html 페이지에서 기본 MIME-Type 은 text/html 이다. 그리고 텍스트 파일에 대한 stream에 대한 MIME-Type은 text/text이다. 파일의 유형이 많은 만큼 MIME-Type도 많다. 예시로 든 text/html 에서 앞의 부분 text 가 위에서 말한 Type 이고 뒷부분 html 부분이 subType 부분이다. Type 과 subType 은 슬래시(/) 로 구분한다.
원래 MIME은 메일을 주고받는 프로토콜인 SMTP 에서 쓰이도록 만들어진 것이었지만 www를 쓰는 환경이 보편화되면서 MIME-Type 은 Media Type 이라는 이름으로 확장이 되게 되었다.
아래의 링크는 앞서말한 IANA의 페이지이다. 모든 MIME type을 아래의 링크에서 확인할 수 있다.
https://www.iana.org/assignments/media-types/media-types.xhtml
3. 어떤 MIME Type을 써야할까?
POST /comment/create HTTP/1.1
Host: localhost:8080
...
Content-Type: application/x-www-form-urlencoded
...
articleID=52&writer=writer&password=password&content=new+comment
출처 - HTML 폼의 인코딩(enctype), MIME Type(Media Type)
application/x-www-form-urlencode 는 HTTP의 GET 방식에서 사용되는 쿼리 스트링처럼 key와 value 로 이루어진 쌍들을 & 로 묶어서 요청의 바디로 전송을 한다. 인코딩 타입은 url인코딩 방식을 쓰며 url 인코딩을 하여 16진수의 값으로 변환이 된다. form 에서 submit을 할 때 사용되는 MIME TYPE이다.
하지만 파일을 보낼때에는 multipart/form-data 를 사용해야 된다. 인코딩의 효율 자체는 urlencode 방식이 더 좋다. 하지만 파일의 바이트를 인코딩할때는 적합하지 않다. 예를 들어 urlencoded 방식에서는 특수문자나 알파벳이 아닌 문자들을 '%3A'처럼 인코딩해야 한다. 이때 '%3A'가 ':'이 URL 인코딩된 것인지 실제 파일의 '\x3A' 16진수 바이트가 전달된 것인지 구분할 수 없다.
POST /board/write HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykZUO6ei4rflEsHOK
...
------WebKitFormBoundarykZUO6ei4rflEsHOK
Content-Disposition: form-data; name="writer"
writer
------WebKitFormBoundarykZUO6ei4rflEsHOK
Content-Disposition: form-data; name="password"
password
------WebKitFormBoundarykZUO6ei4rflEsHOK
Content-Disposition: form-data; name="title"
check me
------WebKitFormBoundarykZUO6ei4rflEsHOK
Content-Disposition: form-data; name="content"
check my mime type
------WebKitFormBoundarykZUO6ei4rflEsHOK
Content-Disposition: form-data; name="uploadedFiles"; filename="1618976872.png"
Content-Type: image/png
출처 - HTML 폼의 인코딩(enctype), MIME Type(Media Type)
multipart 라는 것은 여러가지 part로 나누어서 데이터를 보낸다는것이다. 각 태그에서 전송된 값들은 "------WebKitFormBoundarykZUO6ei4rflEsHOK" 라는 문자열로 구분이 되어있다. boundary라고 불리는 이 구분자에 대한 정보도 http 헤더에 존재하는데 이 boundary들은 무작위적인 UUID를 통해 클라이언트 쪽에서 이름을 정한다. 이렇게 하는 이유는 메세지의 본문과 충돌을 피하기 위해서이다. 이 구분(= part )들에 개별 파일의 정보를 담아서 보내지게 되고 하나의 복합 메세지로서 요청을 보내게 된다.
HTTP form을 채워서 제출하면, 텍스트 필드와 업로드 될 객체는 각각 멀티파트 본문을 구성하는 하나의 파트가 되어 보내진다. 멀티 파트 분몬은 여러 다른 종류와 길이의 값으로 채워진 form을 허용한다고 한다.
4. 해야할 일
파일형식에 따라서 MIME-TYPE이 뭔지 알고 알맞게 써야할 것 같다. 개인 프로젝트를 할 때 MIME-TYPE으로 인해 파일업로드가 되지 않았었던 기억이 있다. 파일도 영상, 이미지, 오디오등 다양한 파일이 있고 이에 따른 다양한 Content-Type 이 있어 나중에라도 파일에 대한 응답이나 요청시에 나오는 오류를 해결할때 도움이 될것 같다는 생각이 들었다.
참고
HTML 폼의 인코딩(enctype), MIME Type(Media Type)
HTTP multipart/form-data raw 데이터는 어떤 형태일까?
https://lng1982.tistory.com/209
마임 타입 (MIME Type), 미디어 타입(Media Type) 개괄
https://server-talk.tistory.com/183
MIME이란 무엇인가 ?
https://velog.io/@ragnarok_code/MIME%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
ASCII란? UUEncode란? MIME Type이란? MEDIA Type이란?
https://kim-dragon.tistory.com/221
MIME type은 뭐고, Content-type은 뭔데?
'참고자료' 카테고리의 다른 글
nosql 이란? (0) | 2023.10.15 |
---|---|
SOAP란 무엇일까? - 웹서비스와 SOAP (1) | 2023.10.11 |
인코딩은 무엇이며 BASE 64 인코딩이란 무엇일까? (0) | 2023.09.15 |
API와 SDK (0) | 2022.04.14 |
blocking 과 non blocking (0) | 2022.01.27 |