MIME TYPE 이란 무엇인가 !
http 헤더들을 공부하던 중, accept와 content-Type에 지정되는 타입이 MIME-TYPE 기반으로 표현된다는 말에,
MIME-TYPE이 뭔지 궁금하여 공부하게 되었다.
1. MIME이 나타나게된 배경
컴퓨터는 0과 1 이진수만 이해할 수 있기 때문에, a,b,c와 같은 문자를 이해하기 위해서는 문자를 숫자로 변환해 주어야 했다.
이 때 문자를 숫자로 표현하기 위한 규칙을 만들었는데 이것이 아스키 (ASCII)!
이 아스키를 가지고 문자들을 전송할 수 있었지만 바이너리 파일의 경우(이미지, 동영상, 음악 등)과 같은 파일의 경우는 그렇지 못했다.
아스키는 7비트, 바이너리 파일은 8비트를 사용하기 때문이다. (아스키의 첫번째 자리수는 제어문자를 위한 공백)
이전에는 아스키 문자를 통해서만 데이터를 전송할 수 있었기 때문에 이 바이너리 파일을 아스키로 인코딩 한 후에 전송해야 했고,
이 때 표준으로 사용했던 것이 UUEncode (Unix to Unix Encode)이다.
하지만 이 방식은 단점이 많았다. (공백을 무시하는 시스템일 경우에 파일을 그대로 전달 받을 수 없다는 것 등)
그래서 등장한 것이 MIME !
2. MIME 이란?
MIME TYPE 이란 Multipurpose Internet Mail Extensions 의 약자로 이메일과 함께 보낼 파일을 텍스트 문자로 변환하기 위해 만들어 졌다. 지금은 메일에 포함된 파일에만 사용하는 것이 아니라 웹을 통해 여러 타입의 파일을 보낼 때 표준처럼 사용하고 있다.
마임의 특징 중 하나는 파일을 보낼 때 이 파일이 어떤 타입인지를 알려 주는 정보를 담을 수 있다는 것이다. 이 파일은 gif야! 이 파일은 mp3야! 이렇게. 인코딩하는 방식은 base64로 8비트 3개를 6비트 4개로 바꾸는 방식이라고한다.
3. MIME TYPE이란?
마임타입을 통해 타입을 텍스트로 표현해서 알려줄 수 있다. media-type, 때로는 content-type 이라고도 불린다.
ex) audio/ogg, image/png
문서의 타입을 알려주는 다른 방법도 있긴 하다.
- 이름의 접미사. 즉 filename.jpg에서 파일명 뒤에 붙은 'jpg'확장자를 통해 가능할 수 있다. 다만 이것은 윈도우즈 시스템에서는 동작할 수 있지만, Linux나 OS X 의 경우 이 확장자를 의미있게 생각하지 않는다. 그 확장자가 파일의 타입과 정확하다는 보장도 없다.
- 매직 넘버. 다른 종류의 파일의 경우 문법 상 다른 구조를 가진다. (ex) gif - 47 49 46 48 / [GIF89]로 시작) 하지만 모든 파일의 타입들이 매직 넘버를 가지고 있는 것이 아니기 때문에 이 또한 100% 신뢰가 어렵다.
그렇기 때문에 현재 웹에서는 MIME 타입이 가장 적절하다 !
브라우저가 URL을 처리할 때, 브라우저들은 리소스를 내려받고 나서 어떤 동작을 해야할 지 보통 이 MIME 타입을 보고 결정한다.
그렇기 때문에 서버가 헤더의 Content-Type을 통해 올바른 타입을 보내는 것은 중요하다. 이것이 제대로 되지 않으면 브라우저가 파일을 잘못 해석하여 사이트가 올바르게 작동하지 않을 수 있다.
3. MIME TYPE의 구조
text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/octet-stream
- 두개의 문자열이 '/'로 구분되어 타입과 서브타입을 나타낸다. 대소문자는 구분하지 않지만 대체로 소문자로 쓴다.
4. 맞는 타입이 없을 경우와 MIME 스니핑
- 대부분의 웹서버들은 알려지지 않은 타입의 리소스를 전송할 때 기본 타입 중 하나인 application/octet-stream 를 이용한다.
브라우저에서는 보안상의 이유로 해당 타입으로 온 리소스에 대하여 기본 동작을 허용하지 않고 사용하려면 디스크에 저장할 것을 사용자에게 강제한다.
- MIME타입 자체가 없거나, 혹은 클라이언트가 이 타입이 잘못 설정되었다고 판단한 경우에 브라우저들은 MIME 스니핑(Content sniffing)을 시도할 수 있다. 리소스를 훑어보고 MIME 타입을 추측해 내는 것 ! 브라우저마다 다른 과정을 통해 진행한다. (safafi의 경우 URL에 있는 파일 익스텐션을 확인한다.)
서버는 이를 원하지 않을 때 X-Content-Type-Option을 전송해서 MIME Sniffing을 차단할 수 있다.
참고사이트
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types
https://developer.mozilla.org/en-US/docs/Glossary/MIME
https://kim-dragon.tistory.com/221