MIME 타입 개요
- MIME : Multipurpose Internet Mail Extension
- 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘
- 웹에서는 파일의 확장자가 별 의미가 없다. 그래서 각 문서와 함께 MIME 타입을 전송하도록 서버가
정확히 설정하는 것이 중요하다.
- 브라우저들은 리소스를 내려받았을 때 해야 할 기본 동작이 무엇인지 결정하기 위해 MIME 타입을 사용
- 수 많은 종류의 문서가 있으므로 많은 MIME 타입들이 존재 (MIME 타입의 전체)
- MIME 타입이 문서 타입 정보를 실어나르는 유일한 방법은 아니지만, 모든 타입들이 공통점을
가지는 것은 아니다.
- 이름의 접미사를 사용 (Microsoft Windows System),
- 매직 넘버 (파일의 문법은 구조 상 보여지는 타입 결정)
- 예를 들어, 각 GIF 파일들은 47 49 46 38 16 진수 값 [G189]로 시작된다.
문법
- 일반적인 구조
type/subtype
type/subtype
- MIME 타입은 '/'로 구분된 두 개의 문자열인 타입과 서브타입으로 구성
- 스페이스는 허용되지 않고, type은 카테고리를 나타내며 개별(discrete) 혹은 멀티파트 타입이 될 수 있다.
- subtype은 각각의 타입에 한정된다.
- MIME 타입은 대소문자를 구분하지 않지만, 전통적으로 소문자로 쓰인다.
- 개별 타입
text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/octet-stream
- 개별 타입은 문서의 카테고리를 가리키며, 다음 중 하나가 될 수 있다.
타입 |
설명 |
일반적인 서브타입 예시 |
text |
텍스트를 포함하는 모든 문서를 나타내며 이론상으로는 인간이 읽을 수 있어야 합니다 |
text/plain, text/html, text/css, text/javascript |
image |
모든 종류의 이미지를 나타냅니다. (animated gif처럼) 애니메이션되는 이미지가 이미지 타입에 포함되긴 하지만, 비디오는 포함되지 않습니다. |
image/gif, image/png, image/jpeg, image/bmp, image/webp |
audio |
모든 종류의 오디오 파일들을 나타냅니다. |
audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav |
video |
모든 종류의 비디오 파일들을 나타냅니다. |
video/webm, video/ogg |
application |
모든 종류의 이진 데이터를 나타냅니다. |
application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf |
- 특정 서브타입이 없는 텍스트 문서들에 대해서는 'text/plain'가 사용되어야 하고, 특정 혹은 알려진
서브 타입이 없는 이진 문서에 대해서는 유사하게 'application/octet-stream'이 사용되어야 한다.
- 멀티파트 타입
multipart/form-data
multipart/byteranges
- 멀티파트 타입은 일반적으로 다른 MIME 타입들을 지닌 개별적인 파트들로 나누어지는 문서의
카테고리를 가리킨다.
- 이 타입은 합성된 문서를 나타내는 방법이다.
- HTML Forms과 POST 메서드의 관계 속에서 사용되는 'multipart/form-data' 그리고 전체 문서의 하위
집합만 전송하기 위한 206 Partial Content 상태 메시지와 함께 사용되는 'multipart/byteranges''를
제외하고는, HTTP가 멀티파트를 다룰 수 있는 특정한 방법은 존재하지 않는다.
- 메시지는 브라우저에게 간단히 전달된다. (문서를 인라인에 어떻게 디스플레이할지 모르게 '다른
이름으로 저장' 윈도우를 제시할 것이다)
웹 개발자들을 위한 중요한 MIME 타입
- application/octet-stream
- 이진 파일을 위한 기본 값, 실제로 잘 알려지지 않은 이진 파일을 의미하므로, 브라우저는
보통 자동으로 실행되지 않거나 실행해야 할지를 묻기도 한다.
- Content-Disposition 헤더가 값 attachment와 함께 설정되었고 'Save As' 파일을 제안하는지 여부에
따라 브라우저가 그것을 다루게 한다.
- text/plain
- 텍스트 파일에 대한 기본 값, 실제로 알려지지 않은 텍스트 파일일지라도 브라우저들은 그것을
디스플레이 할 수 있다고 가정한다.
- text/plain이 모든 종류의 텍스트 데이터를 의미하지는 않는다.
- 브라우저가 특정 종류의 텍스트 데이터를 예상한 경우, 반드시 일치한다고 간주하지 않음.
- 특히 CSS 파일을 선언한 <link> 엘리먼트로부터 'text/plain' 파일을 다운로드 할 경우,
'text/plain'으로 표현된다면 브라우저는 그것을 유효한 CSS 파일로 감지하지 않을 것이다.
CSS MIME 타입인 'text/css'이 사용되어야 한다.
- text/css
- 웹 페이지 내에서 인터프리터되어야 하는 모든 CSS 파일들은 'text/css' 파일이 되어야 한다.
- 서버들은 '.css' 접미사를 가진 파일들을 css파일이라고 인식하지 못해 'text/plain' 혹은
'application/otect-stream' MIME 타입으로 전송한다.
이런 경우 대부분의 브라우저들이 CSS 파일이라고 인식하지 못하기에 올바른 타입으로 CSS
파일을 서브하는 것에 특별한 주의가 필요하다.
- text/html
- 모든 HTML 컨텐츠는 이 타입과 함께 서브되어야 한다. 'application/xml+html과 같은
XHTML을 위한 MIME 타입들은 HTML5가 이 포맷을 흡수하였기에 대부분 쓸모가 없다.
- 이미지 타입
- 널리 알려지고 웹에 안전하다고 취급되는 소수의 이미지 타입만이 웹 페이지 내에서 사용 가능
MIME 타입 |
이미지 타입 |
image/gif |
GIF 이미지 (무손실 압축, PNG에 의해 대체됨) |
image/jpeg |
JPEG 이미지 |
image/png |
PNG 이미지 |
image/svg+xml |
SVG 이미지 (벡터 이미지) |
- 다른 종류의 이미지들은 웹 문서 내에서 찾아볼 수 있다.
- 많은 브라우저들은 파비콘 혹은 그와 비슷한 아이콘 이미지 타입을 지원한다.
- 개별적으로 컨텍스트 내에서 'image/x-icon' MIME 타입을 이용해 지원되고 있다.
- 오디오와 비디오 타입
- 이미지처럼 HTML은 '<audio>'와 '<video>' 엘리먼트에 사용하기 위한 지원 타입셋을 정의하지 않는다.
- 그래서 그것들 중 비교적 작은 그룹만이 웹에서 사용된다.
- HTML audio, video 엘리먼트에 의해 지원되는 미디어 포맷에서 사용될 수 있는 코덱과 컨테이너 모두를
설명하고 있다.
- 이런 파일들의 MIME 타입은 대부분 컨테이너 포맷을 나타내며 웹 컨텍스트에서 대부분의 타입들은
다음과 같다.
MIME 타입 |
오디오 혹은 비디오 타입 |
audio/wave audio/wav audio/x-wav audio/x-pn-wav |
WAVE 컨테이너 포맷 내 오디오 파일. PCM 오디오 코덱 (WAVE codec "1")이 자주 지원되며, 다른 코덱들이 좀 더 제한된 상태로 지원됩니다(PCM 오디오 코덱이 없는 경우). |
audio/webm |
WebM 컨테이너 포맷 내 오디오 파일. 가장 일반적인 오디오 코덱인 Vorbis 그리고 Opus이 사용됩니다. |
video/webm |
WebM 컨테이너 포맷 내, 오디오를 지원 가능한 비디오 파일. VP8 그리고 VP9이 이 안에서 가장 일반적으로 사용되는 비디오 코덱입니다; 가장 일반적인 오디오 코덱인 Vorbis 그리고 Opus가 사용됩니다. |
audio/ogg |
OGG 컨테이너 포맷 내 오디오 파일. 이 컨텐이너 내에서는 Vorbis가 가장 일반적으로 사용되는 오디오 코덱입니다. |
video/ogg |
OGG 컨테이너 포맷 내, 오디오를 지원 가능한 비디오 파일. 이 안에서 가장 흔한 비디오 코덱은 Theora 입니다; 흔한 오디오 코덱은 Vorbis입니다. |
application/ogg |
OGG 컨테이너 포맷을 사용하는 오디오 혹은 비디오 파일. 이 안에서 가장 흔한 비디오 코덱은 Theora 입니다; 흔한 오디오 코덱은 Vorbis입니다. |
- multipart/form-data
- 브라우저에서 서버로 HTML Form내용을 전송 할 때 사용 가능하다.
- 멀티 파트 문서 형식으로써, 경계(이중 대시 '--'로 시작되는 문자열)로 구분되어지는 다른 파트들로 구성
- 각 파트는 그 자체로 개체이며, 자신만의 HTTP 헤더를 가지는데 파일 업로드 필드를 위한 헤드로는
'Content-Dispostion', 그리고 가장 일반적인 것 중 하나인 'Content-Type'이 있다.
- 'Content-Length'는 경계선이 구분자로 사용되므로 무시한다.
Content-Type: multipart/form-data; boundary=aBoundaryString
(other headers associated with the multipart document as a whole)
--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg
(data)
--aBoundaryString
Content-Disposition: form-data; name="myField"
(data)
--aBoundaryString
(more subparts)
--aBoundaryString--
<form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
<input type="text" name="myTextField">
<input type="checkbox" name="myCheckBox">Check</input>
<input type="file" name="myFile">
<button>Send the file</button>
</form>
- HTML Form은 다음 메시지를 전송하게 된다.
POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"
Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"
on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain
Simple file.
-----------------------------8721656041911415653955004498--
- multipart/byteranges
- 브라우저로 회신하는 부분적인 응답 전송의 컨텍스트 내에서 사용된다.
- 206 Partial Content 상태 코드가 전송된 경우, MIME 타입은 문서가 각각의 요청된 범위들 중 하나인
몇 가지 파트들로 구성되어 있을을 알려주기 위해 사용된다.
- 'Content-Type'은 경계선 문자열을 정의하기 위해 'boundary' 디렉티브를 사용한다.
- 다른 파트들은 문서의 실제 타입을 가진 'Content-Type' 헤더와 그들이 나타내는 범위를 가진
'Content-Range'를 지니고 있다.
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 타입 설정의 중요성
- 대부분의 웹 서버들은 기본 타입 중 하나인 'application/octet-stream' MIME 타입을 사용해 알려지지 않은
타입의 리소스를 전송한다.
- 보안상의 이유로 대부분의 브라우저들은 리소스에 대한 사용자화된 기본 동작 설정을 허용하지 않으며
그것을 사용하려면 디스크에 저장할 것을 사용자에게 강제한다.
- 정확하지 않게 구성된 서버들이 몇 가지 사례
- 인코딩된 RAR 파일 : 이상적인 것은 인코딩된 파일 실제 타입을 설정 가능한 것이지만 이런 일은
대부분 불가능하다(서버가 모르는 타입이거나, 이런 파일들은 다른 타입의 몇몇 리소스들을 포함할
가능성이 존재하기에)
이런 경우, 'application/x-rar-compressed' MIME 타입을 전송하도록 서버를 구성하여 사용자가 그에
대한 유용한 기본적인 동작을 정의하지 않게 될 것이다.
- 오디오와 비디오 파일 : 적합한 MIME 타입을 가진 리소스만이 <video>, <audio> 엘리먼트 내에서
인식되어 재생 가능. (오디오와 비디오를 위한 정확한 타입 사용)
- 개별적인 파일 타입 : 개인적인 파일 타입을 서브한 경우 특별한 주의를 기울여야 한다. 특별한
처리가 불가능하므로 간으하면 'application/octet-stream' 사용을 피하는게 좋다.
대부분의 브라우저들은 이런 포괄적인 MIME 타입에 대한 ("워드에서 열기"와 같은) 기본적인 동작의
정의를 허용하지 않는다.
MIME 스니핑
- MIME 타입이 없거나 클라이언트가 타입이 잘못 선정되었다고 판단한 경우에, 브라우저들은
MIME 스니핑 시도를 할 수 있다. 이는 리소스를 흝어보고 정확한 MIME 타입을 추출해나가는 과정이다.
- 각각의 브라우저들은 이런 과정을 다른 방식으로 다른 환경 속에서 처리해 낸다.
- 이런 과정에 대한 몇 가지 보안 관련 사항들이 있는데, 몇몇 MIME 타입들은 실행 가능한 컨텐츠를
나타내고, 다른 타입들은 그렇지 않기 때문에 'Content-Type' 중 'X-Content-Type-Options'를 전송하여
MIME 스니핑 차단이 가능하다.
'WEB > HTTP' 카테고리의 다른 글
[HTTP] 개요, 구성요소, 클라이언트, 서버, 특징, 제어 가능한 것들, 흐름, 헤더, 메시지, API (0) | 2020.12.15 |
---|