본문 바로가기

Deprecated/HTTP

[Web/HTTP] MIME 타입과 MIME 스니핑

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 스니핑을 차단 할 수도 있습니다.