WEB/HTTP

[HTTP] MIME 타입(개요,문법,웹 개발자들을 위한 MIME 타입)

Tree_Park 2020. 12. 15. 16:31
728x90
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/xmlapplication/pdf

  - 특정 서브타입이 없는 텍스트 문서들에 대해서는 'text/plain'가 사용되어야 하고, 특정 혹은 알려진

    서브 타입이 없는 이진 문서에 대해서는 유사하게 'application/octet-stream'이 사용되어야 한다.

 

 - 멀티파트 타입

multipart/form-data
multipart/byteranges

  - 멀티파트 타입은 일반적으로 다른 MIME 타입들을 지닌 개별적인 파트들로 나누어지는 문서의

    카테고리를 가리킨다.

  - 이 타입은 합성된 문서를 나타내는 방법이다.

  - HTML FormsPOST 메서드의 관계 속에서 사용되는 '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 스니핑 차단이 가능하다.