MIME
전자 우편(Mail) 전송을 위한 프로토콜 중 하나인 SMTP는 7비트 ASCII 문자만을 지원합니다. 따라서 ASCII 문자로 표현 할 수 있는 영어 이외의 언어로 작성된 전자 우편은 SMTP로 전송 할 수 없는 불편함이 있었습니다.
기존 방식으로는 전자 우편 사용에 한계가 있었고, 이를 해결하기 위해서 MIME(Multipurpose Internet Mail Extension)이라는 새로운 표준이 등장합니다.
- 문자 인코딩 방식을 사용하여 영어가 아닌 다른 언어로 작성된 전자 우편을 송수신 할 수 있도록 합니다.
- 텍스트 파일 외에도 8비트 이진 파일(그림, 음악, 엑셀 등)의 송수신이 가능하게 되었습니다.
- 지금은 본래의 의도에서 확장되어 HTTP와 같은 통신 프로토콜의 기본 구성으로 자리 잡았습니다.
이렇게 인코딩된 파일은 기존 바이너리 파일의 형태를 유추하기 어렵습니다. 따라서 MIME 타입을 Content-type 헤더에 추가하여 "전송된 텍스트 파일이 어떤 리소스 유형으로 해석해야하는지 알려주는 용도"로 사용합니다.
MIME 타입 표현식
MIME 타입을 표현하는 방법은 단순합니다.
Content-Type: type/subtype
- type과 subtype을 '/'로 구분하여 구성합니다.
- MIME 타입을 표현할 때 스페이스(공백)은 허용되지 않습니다.
- MIME 타입의 type은 개별 타입(Discrete)과 멀티파트 타입(Multi-Part)으로 구분됩니다.
- subtype은 각각의 type에 한정되어 사용됩니다.
사용 가능한 모든 MIME 타입을 확인하려면 다음 MDN 도큐먼트를 확인합니다.
개별 타입(Discrete)
개별 타입은 문서의 카테고리를 의미합니다. 사용 할 수 있는 타입은 다음 중 하나가 될 수 있습니다.
type | 비고 | subtype |
text | 사람이 읽을 수 있는 모든 종류의 텍스트 파일을 나타냅니다. | plain, html, css, javascript 등 |
image | 모든 종류의 이미지 파일을 나타냅니다. gif 확장자처럼 애니메이션을 포함하는 이미지도 image type에 포함 될 수 있으나, 비디오는 포함되지 않습니다. | jpg, jpeg, gif, bmp, webp 등 |
audio | 모든 종류의 오디오 파일을 나타냅니다. | midi, mpeg, webm, ogg, wav 등 |
video | 모든 종류의 비디오 파일을 나타냅니다. | webm, ogg 등 |
application | 모든 종류의 이진 데이터를 나타냅니다. | octet-stream, pkcs12, vnd.mspowerpoint, xml, xhtml+xml, pdf 등 |
특정 subtype이 없는 텍스트 파일들은 text/plain을 사용합니다. 마찬가지 상황에서 이진 데이터는 application/octet-stream을 사용합니다.
멀티파트 타입(Multi-Part)
서로 다른 MIME 타입을 지닌 개별적인 파트로 나누어지는 문서의 카테고리를 의미합니다. 사용 할 수 있는 타입은 다음 중 하나가 될 수 있습니다.
multipart/form-data
multipart/byteranges
- 예시의 multipart/form-data는 HTML Form과 POST 메서드의 관계 속에서 사용됩니다.
- multipart/byteranges는 전체 문서 중 하위 집합을 전송하기 위한 206-Partial Content 상태 메시지와 함께 사용됩니다.
MIME 스니핑(Sniffing)
컨텐츠 스니핑(Content Sniffing)이라고도 부릅니다. Content-type 헤더를 찾지 못했을 때 또는 MIME 타입이 잘못되었다고 판단되면 웹 브라우저는 MIME 스니핑을 시도 할 수 있습니다.
- 리소스 전반을 훑어보고 MIME 타입을 추측합니다.
- 각 웹 브라우저에 따라서 스니핑 방식을 차이가 있습니다.
- 헤더에 "X-Content-Type-Options: nosniff" 정보를 추가하여 MIME 스니핑을 차단 할 수도 있습니다.
'Deprecated > HTTP' 카테고리의 다른 글
[Web/HTTP] URI 문자들을 이스케이프하기 위한 URI Encoding (0) | 2023.03.01 |
---|---|
[Web/HTTP] URL 및 URI 구문 분석 (0) | 2022.04.19 |
[Web/HTTP] URL, URN 그리고 URI의 차이점과 Path Variable, Query Parameter (0) | 2022.04.19 |
[Web/HTTP] HTTP/0.9, HTTP/1.x 그리고 HTTP/2 (0) | 2022.04.19 |
[Web/HTTP] HTTP 간단 정리 (0) | 2022.04.18 |