ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파일 업로드와 모르고 지나친 개념들 - 1] MIME과 MIME Type과 Content-Type과 Media Type
    2021. 6. 27. 20:07

    서론

    이 글은 파일 업로드에서 시작되었다.

    왜 파일 업로드 요청의 Content-Type Header는 왜 "multipart/form-data"여야 할까?

    늘 해왔던 작업을 하면서 문득 궁금해졌다.

     

    그러려니 넘어갔던 지식의 공백을 메꾸기 위해 꼬리에 꼬리를 물고 찾아본 내용을 정리해보았다.

    이 글이 그 첫번째이다.

     

     

    MIME

    먼저 MIME에 대해 이야기하려 한다.

    MIME(마임)은 "MIME Type"이란 용어를 통해 접하게 되었는데,

    MIME이 뭔지 알게 되고 나서야 MIME Type과 다른 Type들을 이해할 수 있게 되었다.

     

    MIME은 "Multipurpose Internet Mail Extensions"의 약자이다.

    그래서 그게 뭐냐?

    "첨부 파일과 ASCII가 아닌 문자 인코딩으로 작성된 텍스트를 지원하도록 이메일 메시지 형식을 확장한 인터넷 표준"이다.

     

    ... 위 문장을 이해해보자. 이를 위해 내게 필요했던 지식은 아래와 같다.

     

    • 인터넷 표준

    인터넷 표준이란 "인터넷에 적용되는 기술이나 방법론을 표준으로 제정한 규격"이다.

     

    • ASCII

    ASCII는 "American Standard Code for Information Interchange"의 약자로,

    영문 알파벳을 사용하는 대표적인 문자 인코딩이다.

     

    MIME에서 이게 왜 튀어나왔나면,

    ASCII는 7비트 문자 인코딩으로 SMTP에서는 ASCII만을 지원하여

    ASCII로 표현할 수 없는 언어로 작성된 이메일을 보낼 수 없었기 때문이다.

     

    자 그러면, ASCII에 대해 설명한 저 문장을 또 이해해보자.

     

    • 문자 인코딩

    문자 인코딩은 "문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것"이다.

     

    참고로 문자 인코딩(Character Encoding)은 문자 집합(Charecter Set)과 동의어로도 사용되고 있다.

    Historically, the terms "character encoding", "character map", "character set" and "code page" were synonymous in computer science, as the same standard would specify a repertoire of characters

    출처: https://en.wikipedia.org/wiki/Character_encoding#Character_sets,_character_maps_and_code_pages

     

    • 바이트

    1바이트는 8비트이다.

     

    8비트는 8자리의 이진수이며,

    0(00000000)부터 255(11111111)까지 256가지의 경우의 수를 표시할 수 있다.

     

    즉, ASCII는 7비트 문자 인코딩이기 때문에, 0부터 127까지 128가지의 경우의 수만을 가진다.

    따라서 바이너리 데이터와 ASCII가 아닌 텍스트를 전송하기 위한 메시지 형식으로 MIME가 등장하게 된 것이다.

    (참고로 MIME 이전에는 첨부 파일 인코딩을 위해 UUEncode 방식을 사용했다.)

     

    이처럼 MIME은 이메일에 파일을 첨부하기 위한 "형식"이다.

    HTTP 요청이나 응답처럼 MIME도 Header를 가지는데, 그 중에 "Content Type" Header가 있다.

    송할 데이터가 어떤 데이터인지를 알려주기 위한 것이다.

    이 MIME의 "Content Type" Header에서 MIME Type이란 용어가 유래되었다.

     

     

    MIME Type

    MIME Type은 (MIME의 "Content Type" Header에 쓰이는) 특정 파일 형식을 식별하는 문자열이다.

    MIME Type은 type과 subtype 두 가지 부분으로 구성되며, 각 부분은 슬래시("/")로 구분된다.

     

    • MIME Type 예시
    text/html

    multpart/form-data

    application/json

    image/png

     

    모든 MIME Type은 아래 링크에서 확인할 수 있다.

    https://www.iana.org/assignments/media-types/media-types.xhtml

     

    Media Types

     

    www.iana.org

     

     

    Content-Type

    MIME은 SMTP를 위해 설계되었으나, MIME Type은 다른 프로토콜에서도 사용되게 되는데,

    대표적으로 HTTP가 있다.

     

    HTTP에서 브라우저는 파일의 확장자가 아니라 MIME Type을 통해서 URL 처리 방법을 결정한다.

    그리고 HTTP 메시지에서 MIME Type은 우리에게 익숙한 "Content-Type" Header에 표시된다.

    (참고로 HTTP 메시지는 요청과 응답 두 가지를 의미한다.)

     

    내 경우 파일 업로드를 구현할 때 응답의 Content-Type을 제대로 설정하지 않으면,

    이미지를 보내도 바이너리 문자열이 그대로 브라우저에 표시되는 걸 보곤 했었다.

     

     

    Media Type

    마지막으로 Media Type이란 무엇일까?

     

    Media Type은 MIME Type을 의미한다. 같은 거다.

    MIME Type이 더이상 이메일에서만 사용되지 않기 때문에 Media Type이란 용어를 사용하고 있다.

    [RFC2046] specifieds that Media Types (formerly known as MIME types) and Media Subtypes will be assigned and listed by the IANA.

    출처: https://www.iana.org/assignments/media-types/media-types.xhtml

     

     

    다음 글에서는 파일 업로드에 쓰이는 Media Type "multipart/form-data"에 대하여 알아보려 한다.

     

     

     

    틀린 설명이 있다면 댓글로 남겨주시면 감사하겠습니다.

    댓글

Designed by Tistory.