Lewis's Tech Keep
multipart / form-data 에 관해 본문
기본적인 HTTP 의 파트
- 4개의 파트로 나눌 수 있다.
- Request LIne, HTTP header, Empty Line, Message Bod
- 여기에 Message Body에 들어가는 데이터 타입을 Http Header에 명시 해 줄 수 있다.
- 이 header에 Content-type에 컨텐츠의 유형을 지정해 줌으로써 어떤 유형의 데이터(MIME type - RFC2045 기술서)가 전송되는 지 알려주는 역할
- 여기에 multipart/form-data 의 타입을 입력하고 보낼 시 해당 데이터의 타입인 것을 알려주는 것이다.
Mulitpart 메시지
- Mulitpart 메시지란
- 서로 붙어있는 여러 개의 메시지를 포함하는 하나의 복합 메시지
- boundary 파라미터를 포함해서 메시지 파트를 구분함
Spring MultipartFile
MultipartFile → File 변환
Multipart 보낼 때
- Multipart 를 보낼 때 웹 서버는 헤더에 Content-type 바이트 Stream을 앞에 붙여서 보내고 어떻게 커뮤니케이션 할 것인지 묘사해서 보냄
- MultipartFile 업로드 시 File = binary stream
- 그래서 바이너리라면 바이너리로 해석, 텍스트라면 텍스트로 해석, json이라면 json으로 해석한다.
파일을 보낼 때 주로 base64로 보내는 이유
- base64 인코딩
- 8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념
- base64 필요한 이유
- 플랫폼 독립적으로 Binary Data(이미지나 오디오)를 전송할 필요가 있을 때, ASCII로 Encoding 하여 전송하게 되면 여러 가지 문제가 발생할 수 있다.
- ASCII는 7bit Encoding(base64는 6bit encoding)인데 나머지 1bit를 처리하는 방식이 시스템 별로 상이하다.
- 일부 제어 문자 (line ending)의 경우 os별로 다른 코드 값을 가짐 (ex, CRLF, LF)
- Base64는 ASCII 중 제어 문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용한다.
- 즉, Base64는 HTML 또는 Email과 같이 문자를 위한 Media에 Binary Data를 포함해야 될 필요가 있을 때, 포함된 Binary Data가 시스템 독립적으로 동일하게 전송 또는 저장되는 걸 보장하기 위해 사용한다.
- 플랫폼 독립적으로 Binary Data(이미지나 오디오)를 전송할 필요가 있을 때, ASCII로 Encoding 하여 전송하게 되면 여러 가지 문제가 발생할 수 있다.
It is worth noting though that in most (all?) cases, binary multipart/form-data data is encoded as base64.
따라서 파일의 경우는 대부분의 경우 base64로 encoding 하고 보낸다. 그렇지만 필수 규약은 아님!
결론
-
multi-part means form data divides into multiple parts and send to server. multipart/form-data: Characters are NOT encoded. This is important when the form has a file upload control. You want to send the file binary and this ensures that bitstream is not altered.
- Content-type에 입력한 MIME-type의 유형에 따라 구분하고 Multipart/form-data 를 통해 데이터를 보내면 form data의 부분에 따라 나뉘어져 있다는 것을 뜻함
- 또한 캐릭터들이 encode 되어 있지 않다는 것을 뜻함
- 캐릭터들이 encode 되어 있지 않기 때문에 파일의 바이너리 stream이 변환되지 않음을 증명함
- 하지만 multipart로 file을 보낼 시에는 대부분의 경우 base64로 encode 되어있음.
해당 글을 참고함
multipart/form-data
- https://lng1982.tistory.com/209
- https://junghyun100.github.io/Multipart_form-data/
- https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4
- https://velog.io/@bclef25/multipart-form-data-upload
- https://lena-chamna.netlify.app/post/http_multipart_form-data/ ← 가장 이해가 많이 됨
- https://soooprmx.com/multipart-form-data-%ed%83%80%ec%9e%85%ec%9d%98-http-%eb%a9%94%ec%8b%9c%ec%a7%80-%ea%b5%ac%ec%84%b1-%eb%b0%a9%eb%b2%95/
content-type
MIME
Multipart & Base64
- https://devuna.tistory.com/41
- https://stackoverflow.com/questions/47095294/what-is-difference-between-base64-and-multipart
MultipartFile(스프링 인터페이스)
'네트워킹' 카테고리의 다른 글
[subnet] subnetting을 통한 망 분리 (0) | 2021.11.26 |
---|
Comments