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방식과 비교하면 다음과 같다
{
"name": "Concert Ticket",
"context": "VIP Seat",
"image": "/9j/4AAQSkZJRg..." // Base64 인코딩된 이미지
}
json형식의 요청은 데이터를 한 번에 묶어서 전송한다.
파일을 정송하려면, 일반적으로 Base64 인코딩을 사용하여 텍스트로 변환해야 하므로, 파일 크기가 커질수록 인코딩된 데이터 크기도 커지게 됨으로 전송시간도 오래걸리고 비효율적이다.
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>
완벽해 보이지만 당연히 단점 또한 존재한다.
데이터 크기 오버해드
결국 각 파트마다 헤더 정보가 포함되기 때문에 오버헤드가 발생할 수 있으며 헤드에 의한 크기 증가가 발생할 수 있다.