본문 바로가기
Web/Protocols

application/www-form-urlencoded vs multipart/form-data

by 폴우정킴 2020. 9. 15.

웹에서 파일을 서버로 보내기 위해서는 multipart/form-data 값을 반드시 써야한다.

그렇게 하지 않으면 웹서버에서는 파일명만 받을 수 있기 때문이다.

 

<form 
	id="fregisterform" 
	name="fregisterform"
	method="post" 
	enctype="multipart/form-data"
    >
    <input type="file">
</form>

 

Note
enctype :
   전송되는 데이터의 인코딩 형식을 설정

enctype 속성은 3가지 방법으로 지정될 수 있다.

 

application/www-form-urlencoded /* 디폴트 값 */ 폼데이터는 서버로 전송되기전에 URL-Encode 처리 됨 
multipart/form-data 파일을 업로드 할 때 사용됨
text/plain 인코딩을 거치지 않은 문자 상태로 전송됨 
Note
form-data: 
   브라우저가 난수로 이루어진 {boundary string} 값을 생성해준다. 
   예시: -----WebkitFormBoundaryFIfNdufjIfjru38f7h7
   난수가 아닌 원하는 방식으로도 생성할 수 있다.

 

application/www-form-urlencoded vs multipart/form-data

아래와 같은 로그인 form이 있다고 가정했을때

username woojung
password 123123

 

x-www-form-urlencoded

이와 같은 form데이터를 서버에 넘길때  x-www-form-urlencoded로 인코딩을 하면 많이들 익숙한 방식으로 서버에 보내진다.

username=woojung&password=123123
  • URL encoding 방식과 GET 메소드 방식과 비슷합니다. 즉 하나의 queryString이 되도록 인코딩 됩니다. 예를 들어 스페이스 값 같은 경우 %20으로 대체 된다.
  • string의 최대 길이에 대해서는 HTTP 명세서 에서는 언급되지 않으나 서버의 스팩에 따라 제한적일 수 있다.
  • URL encoding 방식에 따라 하나의 character당 3bytes 크기로 인코딩 된다.

 

multipart/form-data

하지만 form-data 방식의 경우 키 와 값은 {boundarystring}을 기준으로 다음과 같이 나누어 진다.

만약 로그인과 더불어 파일을 같이 보낸다고 가정하면 다음과 같이 된다.

--{boundary string}
Content-Disposition: form-data; name="username",  // username=woojung

woojung 
--{boundary string}
Content-Disposition: form-data; name="password", // password=123123

123123
--{boundary string}
Content-Disposition: form-data; name="file"; filename="image.jpg"
Content-Type: image/jpeg,  // 업로드 한 파일 정보

--{boundary string}--  // 종료
  • boundary string 에 난수값으로 대체되어 구분자 역할을 한다. ( 여러개의 파일을 한번에 보내도 서버에서 구분할 수 있음)
  • -- 을 붙인 boundary string기준으로 나뉘며 마지막에 --을 추가적으로 붙여줌으로 종료를 알린다.
  • 바이너리 데이터는 인코딩 되지 않으며 metadata 와 함께 보내진다.

 

공통점

  • MIME type으로 인코딩 되며 HTTP header ContentType에 담기게 된다.
  • key-value 페어 데이터로 서버에 전송된다.
  • POST request 방식의 form data로 전송된다.

 

참고자료:

dev.to/getd/x-www-form-urlencoded-or-form-data-explained-in-2-mins-5hk6

javarevisited.blogspot.com/2017/06/difference-between-applicationx-www-form-urlencoded-vs-multipart-form-data.htmldocs.thewhitespace.io/unifi/1.5/multipart_form_data.html#http-header

'Web > Protocols' 카테고리의 다른 글

MQTT가 알고싶다  (0) 2020.09.02

댓글