
MIME(Multipurpose Internet Mail Extensions) 타입
MIME type은 인터넷상에서 전송되는 파일의 형식과 내용을 정의하는 표준으로, 이메일, 웹 브라우저, HTTP 및 기타 인터넷 프로토콜에서 파일 형식을 식별하는 데 사용됩니다.
초기 인코딩 방식 ASCII
과거 인터넷상에서 전송되는 데이터는 텍스트 기반이 주를 이뤘습니다. 그래서 미국 표준 협회(ANSI)는 컴퓨터 간 데이터 교환 시 문자 인코딩 방식을 통일하기 위해 ASCII라는 인코딩 체계를 만들었습니다.
ASCII(American Standard Code for Information Interchange)
- 0 ~ 32까지는 데이터 전송 및 텍스트 처리를 위해 제어 문자로 사용 (32는 공백 문자)
- 33 ~ 127까지는 영문, 숫자, 특수기호 표현
ASCII | SYM | ASCII | SYM | ASCII | SYM | ASCII | SYM | ASCII | SYM | ASCII | SYM |
---|---|---|---|---|---|---|---|---|---|---|---|
33 | ! | 49 | 1 | 65 | A | 81 | Q | 97 | a | 113 | q |
34 | ” | 50 | 2 | 66 | B | 82 | R | 98 | b | 114 | r |
35 | # | 51 | 3 | 67 | C | 83 | S | 99 | c | 115 | s |
36 | $ | 52 | 4 | 68 | D | 84 | T | 100 | d | 116 | t |
37 | % | 53 | 5 | 69 | E | 85 | U | 101 | e | 117 | u |
38 | & | 54 | 6 | 70 | F | 86 | V | 102 | f | 118 | v |
39 | ’ | 55 | 7 | 71 | G | 87 | W | 103 | g | 119 | w |
40 | ( | 56 | 8 | 72 | H | 88 | X | 104 | h | 120 | x |
41 | ) | 57 | 9 | 73 | I | 89 | Y | 105 | i | 121 | y |
42 | * | 58 | : | 74 | J | 90 | Z | 106 | j | 122 | z |
43 | + | 59 | ; | 75 | K | 91 | [ | 107 | k | 123 | { |
44 | , | 60 | < | 76 | L | 92 | \ | 108 | l | 124 | | |
45 | - | 61 | = | 77 | M | 93 | ] | 109 | m | 125 | } |
46 | . | 62 | > | 78 | N | 94 | ^ | 110 | n | 126 | ~ |
47 | / | 63 | ? | 79 | O | 95 | _ | 111 | o | 127 | |
48 | 0 | 64 | @ | 80 | P | 96 | ` | 112 | p |
0 ~ 127: 000000 ~ 01111111 (7bit)
0 ~ 127만 사용해도 필요한 문자를 표현할 수 있어 7비트 문자 인코딩 체계라고 합니다.
ASCII의 한계
텍스트 데이터를 주고받는 데는 ASCII 체계가 문제가 없었지만, 시간이 지나면서 binary 파일(이미지, 오디오, 비디오 등)을 보낼 필요가 생겼습니다.
- 텍스트 파일: 사람이 읽을 수 있는 문자로 이루어진 파일
- binary 파일: 컴퓨터가 이해할 수 있는 0과 1의 이진수 형식으로 이루어진 파일
binary 파일은 8비트 데이터이므로, 기존 시스템에서 파일을 전송하기 위해서는 7비트 ASCII 파일로 바꾸는 인코딩(encoding) 과정이 필요합니다.
- 인코딩(encoding): 데이터를 한 형식에서 다른 형식으로 변환하는 과정
- 디코딩(decoding): 인코딩된 데이터를 다시 원래 형태로 변환하는 과정
UUEncode(Unix-to-Unix Encode)
대표적인 초기 인코딩 방식은 UUEncode로, 해당 방식을 이용하면 binary 파일을 ASCII 파일로 변환할 수 있습니다.
예시로 ‘dog’라는 문자열을 UUEncode 방식을 사용해 ASCII 문자로 변환시켜 보겠습니다.
-
문자열에 해당하는 ASCII 값을 이진 데이터로 변환합니다.
d:01100100
/ o:01101111
/ g:01100111
-
이진 데이터를 6bit씩 그룹으로 분할합니다.
011001 000110 111101 100111
-
각 그룹을 10진수로 변환합니다.
011001 → 25 / 000110 → 6 / 111101 → 61 / 100111 → 39 -
10진수를 ASCII 문자로 변환합니다. (0 ~ 32는 제어문자로 사용되므로 최솟값을 보장하기 위해 32를 더합니다.)
25 + 32 = 57 → 9
6 + 32 = 38 → &
61 + 32 = 93 → ]
39 + 32 = 71 → G
‘dog’를 UUEncode 방식으로 인코딩하면 9&]G
가 됩니다.
UUEncode 방식의 문제점
그러면 UUEncode를 사용하면 되는데, 왜 MIME이 등장하게 되었을까요?
UUEncode 인코딩 방식에는 공백과 관련한 이슈가 존재했습니다. UUEncode는 인코딩된 데이터를 전송할 때, 6비트 데이터를 8비트 ASCII 문자로 변환하는 과정에서 사용되는 ASCII 문자를 32 ~ 95 사이의 값으로 제한합니다. (6비트 데이터가 0(000000) ~ 63(111111)이므로 +32한 범위)
이 과정에서 공백 문자(32)가 포함될 수 있는데, 문제는 공백 문자를 무시하는 시스템상에서는 데이터가 완전한 형태로 전달되지 않는다는 것입니다. (일부 시스템은 선두 공백 또는 중간 공백을 무시, 삭제하거나 다중 공백 문자를 단일 공백 문자로 치환하는 경우가 있음)
이러한 문제를 해결하기 위해 이후에 Base64와 같은 안전한 인코딩 방식이 등장하게 되었습니다.
Base64
Base64 인코딩은 공백이나 제어 문자와 관련된 문제를 최소화하기 위해 설계된 방식으로, UUEncode 방식에서 발생할 수 있는 여러 문제를 방지할 수 있습니다.
- A-Z, a-z, 0-9 문자, 두 개의 추가 문자(+와 /) 사용
- 총 64개의 문자를 사용하여 binary 데이터를 텍스트로 표현
- 제어 문자나 공백 문자가 포함되지 않음
- 인코딩 결과가 항상 4의 배수 길이를 가져야 하므로 패딩으로
=
문자를 사용함 (패딩은 데이터 전송 시 손상되지 않고 데이터가 올바르게 해석되도록 함)
Base64는 특정 문자 집합만 사용하고 패딩 문자로 길이를 고정하기 때문에 데이터 무결성을 보장합니다.
MIME 등장
UUEncode 방식의 단점을 개선하여 만든 인코딩 방식이 바로 MIME입니다. MIME은 Base64 이외의 여러 인코딩 방식을 사용해 binary 데이터를 안전하게 텍스트 형식으로 변환하고, 텍스트뿐만 아니라 이미지, 오디오, 비디오 등 다양한 형식의 데이터를 전송할 수 있습니다. 그리고 UUEncode에는 존재하지 않던 Content-type 정보도 함께 전달할 수 있습니다.
MIME type 구조
type/subtype
type
: 비디오나 텍스트와 같이 데이터 타입이 속하는 일반 카테고리subtype
: MIME 타입이 나타내는 지정된 타입의 정확한 데이터 종류 식별
항상 type과 subtype을 모두 가지며, 둘 중 하나만 가지지는 않으며, 추가적인 세부 정보 제공을 위해 선택적 매개변수를 추가할 수도 있습니다.
type/subtype;parameter=value
type 종류
discrete: 단일 text, 음악 파일, 비디오 등 단일 파일이나 매체를 나타내는 타입
application
: 모든 종류의 binary 데이터
e.g. application/octet-stream, application/pdf, application/zipaudio
: 오디오 또는 음악 데이터
e.g. audio/mpeg, audio/vorbisexample
: 자리 표시자. (문서나 예제 코드에서 MIME 타입의 사용 방법을 설명하기 위함)
e.g. example/example, example/textfont
: 글꼴이나 서체 데이터
e.g. font/woff, font/ttf, font/otfimage
: 이미지 데이터
e.g. image/jpeg, image/png, image/svg+xmlmodel
: 3D 객체나 화면에 대한 모델 데이터
e.g. model/3mf, model/vrmltext
: 텍스트 형식 데이터
e.g. text/plain, text/csv, text/htmlvideo
: 비디오 데이터
e.g. video/mp4
multipart: 다른 MIME 타입들을 지닌 개별적인 파트들로 나누어지는 문서 그룹
multipart/mixed
: 서로 다른 종류의 데이터를 포함하는 메시지(text, image, 첨부 파일 등)multipart/alternative
: 동일한 내용을 서로 다른 형식으로 표현할 때 사용multipart/form-data
: 파일 업로드를 포함한 폼 데이터를 전송할 때 사용multipart/related
: HTML 이메일에서 본문과 그에 관련된 리소스(이미지, 스타일시트)를 함께 전송할 때 사용
Content-type
- 이메일, HTTP 요청 및 응답, 인터넷 애플리케이션 프로토콜에서 사용
- 메시지 본문(body)의 미디어 타입을 나타내는 데 사용
- 클라이언트와 서버가 데이터의 형식을 이해하고 적절히 처리할 수 있도록 함
References
ASCII
MIME types (IANA media types)
마임 타입 (MIME Type), 미디어 타입(Media Type) 개괄