Post

MIME(Multipurpose Internet Mail Extensions)

MIME(Multipurpose Internet Mail Extensions)

MIME는 ASCII가 아닌 character set의 텍스트와 오디오, 비디오, 이미지 및 애플리케이션 프로그램의 첨부 파일을 지원하도록 이메일 메시지의 형식을 확장하는 표준이다. 메시지 본문은 여러 부분으로 구성될 수 있으며 헤더 정보는 ASCII가 아닌 character set으로 지정할 수 있다. MIME 형식의 이메일 메시지는 일반적으로 SMTP, POP, IMAP과 같은 표준 프로토콜을 사용하여 전송된다.

MIME 형식주의는 주로 SMTP를 위해 설계되었지만, 이 콘텐츠 유형 개념은 다른 통신 프로토콜 에서도 중요하다. 특히 World Wide Web의 HyperText Transfer Protocol(HTTP)에서 서버는 모든 웹 전송의 시작 부분에 MIME 헤더 필드를 삽입한다. 클라이언트는 콘텐츠 유형 또는 미디어 유형 헤더를 사용하여 표시된 데이터 유형에 적합한 뷰어 애플리케이션을 선택한다.

Warning: 브라우저는 파일 확장자가 아닌 MIME 유형을 사용하여 URL을 처리하는 방법을 결정하므로 웹 서버가 응답 Content-Type 헤더에 올바른 MIME 유형을 보내는 것이 중요하다. 이것이 올바르게 구성되지 않으면 브라우저가 파일 내용을 잘못 해석할 가능성이 높고 사이트가 제대로 작동하지 않으며 다운로드한 파일이 잘못 처리될 수 있다.

MIME 유형의 구조

MIME 유형은 일반적으로 type과 subtype이라는 두 부분으로 구성되며 슬래시( /)로 구분되며 공백은 없다.

1
type/subtype

type은 데이터 유형이 속하는 일반적인 범주를 나타낸다. (예: video 또는 text)

subtype은 MIME 유형이 나타내는 지정된 유형의 정확한 데이터 종류를 식별합니다. 예를 들어, text의 하위 유형은 plain(일반 텍스트), html( HTML 소스 코드) 또는 calendar(iCalendar/의 경우 .ics) 파일일 수 있다. 참고로, MIME 유형은 항상 type과 subtype을 쌍으로 갖고 있다.

추가 세부 정보를 제공하기 위해 선택적 매개변수를 추가할 수 있다.

1
type/subtype;parameter=value

예를 들어, 기본 유형이 인 모든 MIME 유형의 경우 text선택적 charset매개변수를 추가하여 데이터의 문자에 사용되는 문자 집합을 지정할 수 있다. no가 지정되지 않으면 사용자 에이전트charset 설정에 의해 재정의되지 않는 한 기본값은 ASCII(US-ASCII)이다. UTF-8 텍스트 파일을 지정하려면 MIME 유형이 사용된다. text/plain;charset=UTF-8

MIME 유형은 대소문자를 구분하지 않지만 전통적으로 소문자로 작성된다. 매개변수 값은 대소문자를 구분할 수 있다.

Types

type에는 discrete, multipart 두 가지가 있다. discrete 유형은 단일 텍스트나 음악 파일 또는 단일 비디오와 같이 단일 파일이나 매체를 나타내는 유형이다. multipart 유형은 여러 구성 요소로 구성된 문서를 나타내며, 각각은 고유한 MIME 유형을 가질 수 있다. 또는 multipart 유형은 하나의 트랜잭션에서 함께 전송되는 여러 파일을 캡슐화할 수 있습니다. 예를 들어, multipart MIME 유형은 여러 파일을 이메일에 첨부할 때 사용됩니다.

Discrete types

application 다른 유형 중 하나에 명확하게 속하지 않는 모든 종류의 이진 데이터. 어떤 방식으로든 실행되거나 해석되는 데이터이거나 특정 애플리케이션이나 애플리케이션 범주를 사용해야 하는 이진 데이터. 일반 이진 데이터(또는 실제 유형이 알려지지 않은 이진 데이터)는 application/octet-stream. 다른 일반적인 예로는 application/pdf, application/pkcs8, application/zip가 있다. -> See application type registry at IANA

audio 오디오 또는 음악 데이터. 예로는 audio/mpeg, audio/vorbis

example MIME 유형을 사용하는 방법을 보여주는 예제에서 플레이스홀더로 사용하도록 예약되어 있다. 샘플 코드 목록과 설명서 외의 용도로는 절대 사용해서는 안된다. example하위 유형으로도 사용할 수 있다. 예를 들어, 웹에서 오디오 작업과 관련된 예제에서 MIME 유형은 audio/example유형이 플레이스홀더이며 실제 세계에서 코드를 사용할 때 적절한 유형으로 대체해야 함을 나타내는 데 사용할 수 있다.

font Font/typeface 데이터. 일반적인 예로는 font/woff, font/ttf, font/otf가 있다.

image 비트맵과 벡터 정지 이미지, 애니메이션 GIF 또는 APNG 와 같은 정지 이미지 형식의 애니메이션 버전을 포함한 이미지 또는 그래픽 데이터. 일반적인 예로는 image/jpeg, image/png, 및 image/svg+xml.

model 3D 객체 또는 장면에 대한 모델 데이터. model/3mf, model/vrml 가 있다.

text 사람이 읽을 수 있는 콘텐츠, 소스 코드 또는 CSV형식의 데이터와 같은 텍스트 데이터를 포함한 텍스트 전용 데이터. 예로는 text/plain, text/csv, 및 text/html.

video 비디오 데이터 또는 파일, 예: MP4 영화(video/mp4).

특정 하위 유형이 없는 텍스트 문서의 경우 text/plain를 사용해야 한다. 마찬가지로 특정 또는 알려진 하위 유형이 없는 바이너리 문서의 경우 application/octet-stream사용해야 한다.

Multipart types

멀티파트 유형은 종종 다른 MIME 유형으로 조각난 문서 범주를 나타낸다. 또한 특히 이메일 시나리오에서 동일한 트랜잭션의 일부인 여러 개의 별도 파일을 나타내는 데 사용될 수도 있다. 이는 복합 문서를 나타낸다.

multipart/form-data를 제외하고, multipart/byteranges 또는 HTML FormsPOST 메서드 에서 사용되거나, 206(Partial Content)와 함께 사용하면서 문서의 일부를 보내는 데 사용할때, HTTP는 Partial ontent로 구성된 문서를 특별한 방식으로 처리하지 않는다: 메시지는 단순히 브라우저로 전송된다. (문서를 표시하는 방법을 모르는 경우 “다른 이름으로 저장” 창이 표시될 가능성이 높음).

멀티파트 유형은 두 가지가 있다.

message 다른 메시지를 캡슐화하는 메시지이다. 예를 들어, 전달된 메시지를 데이터의 일부로 포함하는 이메일을 나타내거나, 여러 메시지인 것처럼 매우 큰 메시지를 청크로 보낼 수 있도록 하는 데 사용할 수 있다. 예로는 message/rfc822, message/partial이 있다.

multipart 여러 구성 요소로 구성된 데이터로, 각 구성 요소는 개별적으로 다른 MIME 유형을 가질 수 있다. 예로는 multipart/form-data, multipart/byteranges이 있다.

웹 개발자를 위한 중요한 MIME 유형

application/octet-stream

이것은 바이너리 파일의 기본값이다. 알 수 없는 바이너리 파일을 의미하므로 브라우저는 일반적으로 이를 실행하지 않거나 실행해야 하는지 묻지도 않는다. Content-Disposition헤더가 attachment로 설정된 것처럼 취급하고 “다른 이름으로 저장” 대화 상자를 제안한다.

text/plain

이것은 텍스트 파일의 기본값이다. 실제로 “알 수 없는 텍스트 파일”을 의미하더라도 브라우저는 그것을 표시할 수 있다고 가정한다.

Note: text/plain “모든 종류의 텍스트 데이터”를 의미하지 않는다. 특정 종류의 텍스트 데이터를 기대하는 경우, 그들은 그것을 매치로 간주하지 않을 가능성이 크다. 특히, CSS 파일을 선언하는 요소 text/plain에서 파일을 다운로드하는 경우, text/plain으로 표시되면 유효한 CSS 파일로 인식하지 못할 것이다. CSS MIME 유형을 text/css사용해야 한다.

text/css

웹 페이지 스타일을 지정하는 데 사용되는 CSS 파일은 반드시 text/css와 함께 보내야한다. 서버가 CSS 파일의 접미사(.css)를 인식하지 못하는 경우, 보통 text/plain 또는 application/octet-stream MIME 유형으로 전송하게 된다. 이 경우, 대부분의 브라우저에서 CSS로 인식되지 않으며 무시된다.

text/html

모든 HTML 콘텐츠는 이 유형으로 제공되어야 한다. 대체 MIME 유형인 XHTML은 (예: application/xhtml+xml)은 요즘에는 거의 사용되지 않는다.

Note: HTML/SVG/MathML 네임스페이스에 속하지 않은 XML의 엄격한 구문 분석 규칙, <![CDATA[…]]> 섹션 또는 요소가 필요한 경우에는 application/xml 또는 application/xhtml+xml을 사용하는 것이 좋다.

text/javascript

IANA Media Types registry, RFC 9239 및 HTML specification에 따라 JavaScript 콘텐츠는 항상 MIME 유형 text/javascript을 사용해야한다. JavaScript에 유효한 다른 MIME 유형은 없으며, 다른 MIME 유형을 사용하면 text/javascript로드되지 않거나 일부 스크립트가 동작하지않을 수 있다.

일부 JavaScript 콘텐츠가 MIME 유형의 일부로 charset 매개변수와 함께 잘못 제공되는 경우가 있는데, 이는 스크립트 콘텐츠의 character set을 지정하려는 시도이다. 해당 charset 매개변수는 JavaScript 콘텐츠에 유효하지 않으며 대부분의 경우 스크립트가 로드되지 않는다.

Legacy JavaScript MIME types

text/javascript MIME 유형 외에도, 역사적인 이유로 MIME 스니핑 표준 (브라우저가 MIME 유형을 해석하고 유효한 MIME 유형이 없는 콘텐츠를 어떻게 처리할지 알아내는 방법에 대한 정의)은 다음 레거시 JavaScript MIME 유형을 사용하여 JavaScript를 제공하는 것을 허용한다.

application/javascript Deprecated application/ecmascript Deprecated application/x-ecmascript Non-standard application/x-javascript Non-standard text/ecmascript Deprecated text/javascript1.0 Non-standard text/javascript1.1 Non-standard text/javascript1.2 Non-standard text/javascript1.3 Non-standard text/javascript1.4 Non-standard text/javascript1.5 Non-standard text/jscript Non-standard text/livescript Non-standard text/x-ecmascript Non-standard text/x-javascript Non-standard

Image types

MIME 유형이 image인 파일은 이미지 데이터를 포함한다. 하위 유형은 데이터가 나타내는 특정 이미지 파일 형식을 지정한다. 다음은 일반적으로 사용되는 이미지 유형이다.

image/apng: 애니메이션 휴대용 네트워크 그래픽(APNG) image/avif: AV1 이미지 파일 형식(AVIF) image/gif: 그래픽 교환 포맷(GIF) image/jpeg: 공동사진전문가그룹 이미지(JPEG) image/png: 이동형 네트워크 그래픽(PNG) image/svg+xml: 확장 가능한 벡터 그래픽(SVG) image/webp: 웹 그림 형식(WEBP)

Audio and video types

이미지의 경우와 마찬가지로 HTML은 웹 브라우저가

오디오 코덱 및 비디오 코덱 가이드에는 웹 브라우저가 자주 지원하는 다양한 코덱이 나열되어 있으며, 지원하는 오디오 채널 수, 사용되는 압축 유형, 유용한 비트 전송률 등의 기술 정보와 함께 호환성 세부 정보를 제공한다. WebRTC 가이드에서 사용하는 코덱은 주요 웹 브라우저에서 지원하는 코덱을 구체적으로 다루면서 이 기능을 확장하므로, 지원하고자 하는 브라우저 범위를 가장 잘 다루는 코덱을 선택할 수 있다.

오디오 또는 비디오 파일의 MIME 유형은 일반적으로 컨테이너 형식(파일 유형)을 지정한다. 선택적 codecs 매개변수를 MIME 유형에 추가하여 사용할 코덱과 미디어를 인코딩하는 데 사용된 옵션(예: 코덱 프로필, 레벨 또는 기타 정보)을 추가로 지정할 수 있다.

multipart/form-data

multipart/form-data 유형은 브라우저에서 서버로 완성된 HTML form의 값을 전송할 때 사용할 수 있다.

multipart 문서 형식은 다음과 같다. 우선, 경계(이중 대시로 시작하는 문자열 –)로 구분된 여러 부분으로 구성된다. 각 부분은 자체 HTTP 헤더, Content-Disposition, 그리고 파일 업로드 필드에 대한 Content-Type를 가진 고유한 엔터티이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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--
1
2
3
4
5
6
7
8
9
10
11
<form
  action="http://localhost:8000/"
  method="post"
  enctype="multipart/form-data">
  <label>Name: <input name="myTextField" value="Test" /></label>
  <label><input type="checkbox" name="myCheckBox" /> Check</label>
  <label>
    Upload file: <input type="file" name="myFile" value="test.txt" />
  </label>
  <button>Send the file</button>
</form>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

multipart/byteranges MIME 유형은 브라우저에 부분적인 응답을 보내는 데 사용된다.

206(Partial Content) 상태 코드가 전송되면 이 MIME 유형은 문서가 요청된 범위 각각에 대해 하나씩 여러 부분으로 구성되어 있음을 나타낸다. 다른 다중 부분 유형과 마찬가지로 콘텐츠 유형은 경계를 사용하여 조각을 분리한다. 각 조각에는 실제 유형의 콘텐츠 유형 헤더와 해당 범위의 콘텐츠 범위가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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="viewport" 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 유형을 설정하는 것의 중요성

일부 서버 구성에서는 관련 MIME 유형을 사용하여 파일 연결, 압축 또는 캐싱과 같은 최적화를 수행할 수 있다.

대부분의 웹 서버는 인식되지 않는 리소스를 application/octet-stream MIME 유형으로 전송한다. 보안상의 이유로 대부분의 브라우저는 이러한 리소스에 대한 사용자 지정 기본 작업(예: “Open in Word”)을 설정할 수 없으므로 사용자는 이 작업을 사용하기 위해 디스크에 저장해야 한다.

몇 가지 일반적인 잘못된 서버 구성:

  • RAR 압축 파일. 이 경우 가장 이상적인 것은 원본 파일의 실제 유형이며, .RAR 파일에는 다양한 유형의 리소스가 저장될 수 있기 때문에 불가능한 경우가 많습니다. 이 경우 응용 프로그램/x-rar 압축을 보내도록 서버를 구성한다.
  • 오디오 및 비디오. 올바른 MIME 유형을 가진 리소스만 <video> 또는 <audio> 요소로 재생된다. 단, 오디오 및 비디오에 대한 올바른 미디어 유형을 지정해야 한다.
  • 독자적인 파일 형식. application/vnd.mspowerpoint와 같은 특정 유형을 사용하면 사용자가 원하는 프레젠테이션 소프트웨어에서 해당 파일을 자동으로 열 수 있다.

MIME 스니핑

MIME 유형이 없거나 브라우저가 올바르지 않다고 판단하는 경우 브라우저는 리소스의 바이트를 보고 올바른 MIME 유형을 추측하는 MIME 스니핑을 수행할 수 있다.

각 브라우저는 상황에 따라 다르게 MIME 스니핑을 수행한다. (예를 들어, Safari는 전송된 MIME 유형이 부적합한 경우 URL의 파일 확장자를 확인한다.) 일부 MIME 유형은 실행 가능한 콘텐츠를 나타내기 때문에 보안 문제가 있다. 서버는 X-Content-Type-Options 헤더를 전송하여 MIME 스니핑을 방지할 수 있다.

문서 유형을 전달하는 다른 방법

MIME 유형이 문서 유형 정보를 전달하는 유일한 방법은 아니다:

  • 파일 이름 접미사는 가끔 사용되는 경우가 있는데, 특히 Microsoft Windows에서 사용된다. 모든 운영 체제에서 이러한 접미사가 의미 있다고 판단되는 것은 아니며(예: Linux 및 macOS), 정확하다는 보장도 없다.
  • 매직 넘버 다양한 형식의 구문을 사용하면 바이트 구조를 보고 파일 형식을 추론할 수 있다. 예를 들어, GIF 파일은 47 49 46 38 39 헥사값(GIF89)으로 시작하고 PNG 파일은 89 50 4E 47(.PNG)로 시작한다. 모든 파일 형식에 매직 넘버가 있는 것은 아니므로 이 역시 100% 신뢰할 수 있는 것은 아니다.

참고자료

This post is licensed under CC BY 4.0 by the author.