Lewis's Tech Keep

multipart / form-data 에 관해 본문

네트워킹

multipart / form-data 에 관해

Lewis Seo 2022. 1. 2. 01:59

기본적인 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가 시스템 독립적으로 동일하게 전송 또는 저장되는 걸 보장하기 위해 사용한다.
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

content-type

MIME

Multipart & Base64

MultipartFile(스프링 인터페이스)

'네트워킹' 카테고리의 다른 글

[subnet] subnetting을 통한 망 분리  (0) 2021.11.26
Comments