λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λͺ©λ‘μ΄ μ—†μŠ΅λ‹ˆλ‹€.

[HTTP] λ―Έλ””μ–΄ νƒ€μž… (MIME Type)

πŸ”‘ Basic Concept

    MIME νƒ€μž… κ°œλ… 및 νƒ„μƒμ΄μœ 

     MIME은 Multipurpose Internet Mail Extensions (λ‹€λͺ©μ  인터넷 메일 ν™•μž₯) 이 ν’€λ„€μž„μΈλ° μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ›λž˜λŠ” μ „μžλ©”μΌ(이메일) μ‹œμŠ€ν…œμ„ μœ„ν•΄μ„œ λ§Œλ“€μ–΄μ§„ κ°œλ…μ΄λ‹€. μ „μžμš°νŽΈμ€ 7λΉ„νŠΈ ASCII μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ†‘λ˜κΈ° λ•Œλ¬Έμ— 문자 데이터 μ΄μ™Έμ˜ λ°”μ΄λ„ˆλ¦¬ 데이터(이미지, λ™μ˜μƒ, μ—‘μ…€ λ“±)λ₯Ό μ£Όκ³  받을 수 μ—†μ—ˆλ‹€. 이 λ•Œλ¬Έμ— μ£Όκ³  받을 λ•Œ κ·œμΉ™μ„ μ •ν•΄μ„œ 이미지λ₯Ό κ·œμΉ™μ— 맞게 ASCII μ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ 보내고 λ°›λŠ” μͺ½μ—μ„œλŠ” κ·œμΉ™μ— 맞게 λ‹€μ‹œ ASCII μ½”λ“œμ—μ„œ λ°”μ΄λ„ˆλ¦¬ λ°μ΄ν„°λ‘œ λ³€ν™˜ν•˜λ„λ‘ ν•΄μ„œ μ£Όκ³ λ°›μ•˜λ‹€. 이 λ•Œ μ‚¬μš©λœ κ·œμΉ™μ΄ λ°”λ‘œ MIME type이닀. MIME type을 톡해 ASCII μ½”λ“œλ§Œ 전솑할 수 μžˆμ—ˆλ˜ μ „μžμš°νŽΈμ˜ ν•œκ³„λ₯Ό λ„˜μ„ 수 μžˆμ—ˆλ‹€. μ „μžμš°νŽΈμ—μ„œ μ›Œλ‚™ 잘 λ™μž‘ν•΄μ„œ κ·ΈλŸ°μ§€ HTTPμ—μ„œλ„ λ©€ν‹°λ―Έλ””μ–΄ μ½˜ν…μΈ λ₯Ό μœ„ν•΄ 라벨을 λΆ™μ΄λŠ” 용으둜 μ±„νƒλ˜μ—ˆλ‹€.

     

    MIME Type λ™μž‘

     

    사싀 MIME νƒ€μž…μ€ μ‰½κ²Œ λ§ν•΄μ„œ 인코딩 방식이라고 보면 λœλ‹€. μ‹€μ œλ‘œ base64 인코딩을 μ‚¬μš©ν•˜κ³  μžˆλ‹€. MIME νƒ€μž… 이전에 μ‚¬μš©λ˜λ˜ 방식이 μžˆλŠ”λ° UUEncodeλΌλŠ” 방식이닀. ν•˜μ§€λ§Œ 이 인코딩 방식은 νŒŒμΌμ„ μ›ν˜• κ·ΈλŒ€λ‘œ 전솑할 수 μ—†κ³ , 맨 끝에 곡백이 ν¬ν•¨λœ λ°μ΄ν„°λŠ” 곡백을 λˆ„λ½ν•œλ‹€λŠ” λ‘₯ 단점이 λ§Žμ•˜λ‹€. 단점을 λ³΄μ™„ν•΄μ„œ λ‚˜μ˜¨ 것이 MIME νƒ€μž…μ΄κ³  μœ„μ˜ κ·Έλ¦Όμ—μ„œ λ³€ν™˜μ΄λΌκ³  λ˜μ–΄μžˆλŠ” 뢀뢄은 λ³΄λ‚΄λŠ” μͺ½μ—μ„œλŠ” μΈμ½”λ”©μœΌλ‘œ 보면 되고 λ°›λŠ” μͺ½μ—μ„œλŠ” λ””μ½”λ”©ν•˜λŠ”κ²ƒμœΌλ‘œ 보면 λœλ‹€.

     

    UUEncode
    : λ„€νŠΈμ›Œν¬ μƒμ—μ„œ μ‚¬μš©μžλ“€μ΄λ‚˜ μ‹œμŠ€ν…œλ“€ 간에 κ΅ν™˜λœ νŒŒμΌλ“€μ„ μΈμ½”λ”©ν•˜κ³  λ””μ½”λ”©ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” 인기 있던 μœ ν‹Έλ¦¬ν‹°μ΄λ‹€. μœ λ‹‰μŠ€ μ‹œμŠ€ν…œ μ‚¬μš©μžλ“€κ°„μ— μ‚¬μš©μ—μ„œ λΉ„λ‘―λ˜μ—ˆλ‹€. Unix-to-Unix encoding의 μ€„μž„λ§μ΄λ‹€. μœ λ‹‰μŠ€μ—μ„œ μ‹œμž‘λ˜μ—ˆμ§€λ§Œ λͺ¨λ“  μš΄μ˜μ²΄μ œμ—μ„œ μ‚¬μš©κ°€λŠ₯ν•˜κ³  μ‰½κ²Œ ꡬ할 수 μžˆλ‹€. 기본적으둜 Uuencodeκ°€ ν•˜λŠ” 일은 νŒŒμΌμ΄λ‚˜ μ „μžμš°νŽΈμ˜ 첨뢀물을 λ°”μ΄λ„ˆλ¦¬ λ˜λŠ” λΉ„νŠΈ 슀트림 ν‘œν˜„μ—μ„œ 7λΉ„νŠΈ μ•„μŠ€ν‚€ ν…μŠ€νŠΈλ‘œ λ³€ν™˜ν•˜λŠ” 것이닀. ν…μŠ€νŠΈλŠ” μ˜€λž˜μ „μ— μ œμž‘λ˜μ–΄ λ°”μ΄λ„ˆλ¦¬ νŒŒμΌμ„ μ²˜λ¦¬ν•  수 μ—†λŠ” μ‹œμŠ€ν…œμ—μ„œλ„ 잘 처리될 수 있으며, μ»€λ‹€λž€ νŒŒμΌλ“€μ„ μ’€ 더 μ‰½κ²Œ μ—¬λŸ¬ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ„μ–΄ 전솑할 수 μžˆλ‹€.

     

     

    HTTPμ—μ„œμ˜ MIME νƒ€μž…

    인터넷은 수천 가지 데이터 νƒ€μž…μ„ 닀루기 λ•Œλ¬Έμ—, HTTPλŠ” μ›Ήμ—μ„œ μ „μ†‘λ˜λŠ” λͺ¨λ“  데이터 각각에 MIME Typeμ΄λΌλŠ” 데이터 포맷 라벨을 뢙인닀. μ›ΉλΈŒλΌμš°μ €λŠ” μ„œλ²„λ‘œλΆ€ν„° 데이터λ₯Ό 받을 λ•Œ, λ‹€λ£° 수 μžˆλŠ” 객체인지 MIME νƒ€μž…μ„ 톡해 ν™•μΈν•œλ‹€. λŒ€λΆ€λΆ„μ˜ μ›Ή λΈŒλΌμš°μ €λŠ” 잘 μ•Œλ €μ§„ νƒ€μž… 수백 가지λ₯Ό λ‹€λ£° 수 μžˆλ‹€. 이미지 νŒŒμΌμ„ 보여주고, HTML νŒŒμΌμ„ λΆ„μ„ν•˜κ±°λ‚˜ ν¬λ§·νŒ…ν•˜κ³ , μ˜€λ””μ˜€ νŒŒμΌμ„ μ»΄ν“¨ν„°μ˜ μŠ€ν”Όμ»€λ₯Ό 톡해 μž¬μƒν•˜κ³ , νŠΉλ³„ν•œ 포맷의 νŒŒμΌμ„ 닀루기 μœ„ν•΄ μ™ΈλΆ€ ν”ŒλŸ¬κ·ΈμΈ(μ†Œν”„νŠΈμ›¨μ–΄)을 μ‹€ν–‰ν•œλ‹€.

     

    λΈŒλΌμš°μ €λŠ” 파일 ν™•μž₯μžκ°€ μ•„λ‹Œ MIME μœ ν˜•μ„ μ‚¬μš©ν•˜μ—¬ URL을 μ²˜λ¦¬ν•˜λŠ” 방법을 κ²°μ •ν•˜λ―€λ‘œ μ›Ή μ„œλ²„κ°€ μ‘λ‹΅μ˜ Content-Type 헀더 에 μ˜¬λ°”λ₯Έ MIME μœ ν˜•μ„ λ³΄λ‚΄λŠ” 것이 μ€‘μš”ν•˜λ‹€. 이것이 μ˜¬λ°”λ₯΄κ²Œ κ΅¬μ„±λ˜μ§€ μ•ŠμœΌλ©΄ λΈŒλΌμš°μ €κ°€ 파일 λ‚΄μš©μ„ 잘λͺ» ν•΄μ„ν•˜κ³  μ‚¬μ΄νŠΈκ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° λ‹€μš΄λ‘œλ“œ ν•œ 파일이 잘λͺ» 처리 될 수 μžˆλ‹€.

     

    MIME νƒ€μž… ꡬ쑰 및 μ˜ˆμ‹œ

     MIME νƒ€μž…μ€ 사선(/)으둜 κ΅¬λΆ„λœ μ£Ό νƒ€μž…(primary object type)κ³Ό λΆ€ νƒ€μž… (specific subtype)으둜 이루어진 λ¬Έμžμ—΄ 라벨이닀. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

     

    • HTML λ¬Έμ„œλŠ” text/html 라벨이 λΆ™λŠ”λ‹€.
    • plain ASCII ν…μŠ€νŠΈ λ¬Έμ„œλŠ” text/plain 라벨이 λΆ™λŠ”λ‹€.
    • JPEG μ΄λ―Έμ§€λŠ” image/jpeg 라벨이 λΆ™λŠ”λ‹€.
    • GIF μ΄λ―Έμ§€λŠ” image/gif 라벨이 λΆ™λŠ”λ‹€.
    • μ• ν”Œ ν€΅νƒ€μž„ λ™μ˜μƒμ€  video/quicktime 라벨이 λΆ™λŠ”λ‹€.
    • λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈ νŒŒμ›Œν¬μΈνŠΈ ν”„λ ˆμ  ν…Œμ΄μ…˜ νŒŒμΌμ€ application/vnd.ms-powerpoint 라벨이 λΆ™λŠ”λ‹€.

    수백 κ°€μ§€μ˜ 잘 μ•Œλ €μ§„ MIME  νƒ€μž…κ³Ό, 그보닀 더 λ§Žμ€ μ‹€ν—˜μš© ν˜Ήμ€ νŠΉμ • μš©λ„μ˜ MIME νƒ€μž…μ΄ μ‘΄μž¬ν•œλ‹€.

     

    λ©”μΈνƒ€μž…(μ£Όνƒ€μž…) μ„€λͺ… μ„œλΈŒνƒ€μž…(λΆ€νƒ€μž…)
    text ν…μŠ€νŠΈλ₯Ό ν‘œν˜„. text/plain,
    text/html,
    text/css,
    text/javascript,
    ...
    image 이미지λ₯Ό ν‘œν˜„. image/gif,
    image/png,
    image/jpeg,
    image/bmp,
    ...
    video λ™μ˜μƒμ„ ν‘œν˜„. video/mp4,
    video/ogg,
    video/mpeg4-generic,
    ...
    application λͺ¨λ“  μ’…λ₯˜μ˜ 이진 데이터λ₯Ό ν‘œν˜„. application/octet-stream,
    application/vnd.mspowerpoint,
    application/xml,
    application/pdf,
    application/json,
    ...
    multipart μ—¬λŸ¬κ°€μ§€ νƒ€μž…μ˜ 데이터듀을 λ™μ‹œμ— 전솑할 λ•Œ μ‚¬μš©. multipart/form-data,
    multipart/byteranges,
    ...

     

    application/octet-stream

    일반적으둜 MIME νƒ€μž…μ€ λ©”μΈνƒ€μž…κ³Ό μ„œλΈŒνƒ€μž…μ„ 보면 μ§κ΄€μ μœΌλ‘œ μ•Œ 수 μžˆλ„λ‘ 넀이밍이 λ˜μ–΄ μžˆμ§€λ§Œ μ˜₯ν…Ÿμ΄λΌλŠ” κ°œλ…μ„ λͺ¨λ₯΄λ©΄ μœ„μ˜ νƒ€μž…μ€ 무슨 ν˜•νƒœμΈμ§€ 와닿지 μ•ŠλŠ”λ‹€. μ˜₯ν…Ÿμ΄λž€ 8λΉ„νŠΈ λ‹¨μœ„λ₯Ό λ§ν•œλ‹€. λ”°λΌμ„œ μœ„μ˜ νƒ€μž…μ€ 8λΉ„νŠΈ λ‹¨μœ„μ˜ λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό μ˜λ―Έν•œλ‹€.

    νŠΉλ³„νžˆ ν‘œν˜„ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ°μ΄ν„°μ˜ 경우 κΈ°λ³Έκ°’μœΌλ‘œ octet-stream을 μ‚¬μš©ν•œλ‹€.

     

     

    multipart/form-data

    μ›Ή κ°œλ°œμ„ ν•˜λ‹€λ³΄λ©΄ 자주 λ³Ό 수 μžˆλŠ” MIME νƒ€μž… 쀑에 ν•˜λ‚˜μ΄λ‹€. μ›Ή 개발 μ΄ˆκΈ°μ—λŠ” MIME νƒ€μž…μ΄λΌλŠ” 인식이 μ—†κ³  form νƒœκ·Έμ— μ†μ„±μœΌλ‘œ μ„€μ •ν•΄μ£ΌλŠ” κ²ƒμœΌλ‘œ μ•Œκ³ μžˆμ—ˆλ‹€. μ•„λž˜μ™€ 같이 form νƒœκ·Έ μ•ˆμ—μ„œ post method둜 μ—¬λŸ¬ 데이터λ₯Ό λ¬Άμ–΄μ„œ μ „μ†‘ν•˜λŠ” 경우 μ‚¬μš©ν•œλ‹€.

     

    <form action="/inserProfile" method="post" enctype="multipart/form-data">
      이름 : <input type="text" name="userName"><br>
      성별 : <input type="checkbox" name="male">남</input>
             <input type="checkbox" name="female">μ—¬</input><br>
      사진 : <input type="file" name="profileImage"><br>
             <input type="submit" value="전솑">
    </form>

    이름을 Kim Beom Soo둜 λ„£κ³  성별에 '남'을 μ²΄ν¬ν•œ 후에 사진첨뢀λ₯Ό A.pngλΌλŠ” νŒŒμΌμ„ μ²¨λΆ€ν•œ ν›„ μ „μ†‘ν•˜κ²Œ 되면 μ•„λž˜μ™€ 같이 Content-Type이 multipart/form-dataλΌλŠ”κ²ƒμ΄ λͺ…μ‹œλ˜κ³  μ„œλΈŒνŒŒνŠΈλ₯Ό ꡬ뢄할 수 μžˆλŠ” κ΅¬λΆ„μž λ¬Έμžμ—΄μ΄ boundary κ°’μœΌλ‘œ 주어지며 본문이 κ΅¬μ„±λœλ‹€.

     

    Content-Type: multipart/form-data; boundary=Bjwo02D
     
    --Bjwo02D
    Content-Disposition: form-data; name="userName"
    Kim Beom Soo
     
    --Bjwo02D
    Content-Disposition: form-data; name="male"
    true
     
    --Bjwo02D
    Content-Disposition: form-data; name="profileImage"; filename="A.png"               
    Content-Type: image/png
     
    (...이미지 λ°”μ΄λ„ˆλ¦¬ 데이터...)
    --Bjwo02D
     
     
    (...μ„œλΈŒνŒŒνŠΈκ°€ 더 μžˆλŠ”κ²½μš°...)
    --Bjwo02D--

     

     

    μΆ”κ°€ MIME Type

    MIME Type은 μ’…λ₯˜κ°€ 파일 ν™•μž₯자 λ§ŒνΌμ΄λ‚˜ 많기 λ•Œλ¬Έμ— μœ„μ—μ„œ μ–ΈκΈ‰ν•œ νƒ€μž… 외에도 ν™•μΈν•˜κ³  싢은 경우 κ³΅μ‹λ¬Έμ„œλ₯Ό μ°Έκ³ ν•˜μž.

     

    μ°Έκ³ 

    - oreilly HTTP μ™„λ²½κ°€μ΄λ“œ

    - (λΈ”λ‘œκ·Έ) 코끼리λ₯Ό 냉μž₯고에 λ„£λŠ” 방법

    - Runebook.dev