multipart/form-data란 파일 업로드를 포함한 데이터를 사용할때 사용되는 http 요청 방식을 말한다.

다른 데이터 전송 방식과 비교하면 다음과 같다.

Context-Type 사용예시 파일 전송 가능 여부
application/json JSON 데이터 전송 파일 전송 가능 여부: 불가능(파일을 base64 encoding 필요)
application/x-ww-form-urlencoded 폼 데이터
(※ key=value&key2=value2) 불가능
multipart/form-data;
boundary=… 파일+텍스트 동시 전송 가능

기존 json방식과 비교하면 다음과 같다

application/json 형식

{
"name": "Concert Ticket",
"context": "VIP Seat",
"image": "/9j/4AAQSkZJRg..."  // Base64 인코딩된 이미지
}

json형식의 요청은 데이터를 한 번에 묶어서 전송한다.

파일을 정송하려면, 일반적으로 Base64 인코딩을 사용하여 텍스트로 변환해야 하므로, 파일 크기가 커질수록 인코딩된 데이터 크기도 커지게 됨으로 전송시간도 오래걸리고 비효율적이다.

multipary/form-data 형식

POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXxXxXxXx
-----WebKitFormBoundaryXxXxXxXx
Content-Disposition: form-data; name="name"
Concert Ticket
------WebKitFormBoundaryXxXxXxXx
Content-Disposition: form-data; name="context"
VIP Seat
------WebKitFormBoundaryXxXxXxXx
Content-Disposition: form-data; name="image"; filename="ticket.jpg"
Content-Type: image/jpeg
(Binary Data...)
------WebKitFormBoundaryXxXxXxXx--

파일, 텍스트등의 다양한 데이터를 여러 개의 파트로 나누어 전송하는 형식이다.

이 형식에서는 각 파트가 독립적으로 헤더와 본문을 포함하여 독립적을 전송하게 되며 그 사이에는 boundary라는 구분자가 있다.

따라서 파일을 원본 그대로 전송되므로, 크기가 커도 효율이 높으며 서버는 각 파트를 순차적으로 처리할 수 있어 전체적인 처리 시간이 단축될 수 있다.

<aside> 💡

이때 주의해야하는 것은 직접적으로 segment 여러개로 나누어 보내는 것이 아니라 body 쪽에서 파일을 boundary로 구분 짓는 것 이다.

</aside>

단점

완벽해 보이지만 당연히 단점 또한 존재한다.

  1. 데이터 크기 오버해드

    결국 각 파트마다 헤더 정보가 포함되기 때문에 오버헤드가 발생할 수 있으며 헤드에 의한 크기 증가가 발생할 수 있다.