ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • multipart form-data 와 boundary
    Search: WebService WebService 2022. 8. 8. 21:26

    multipart/form-data

     

    개요

    http의 data에 전송 규격은 단일 방식이 아니다.
    각 방식을 정의 하는 방법으로 'content-type'를 사용한다.

    file전송은 용량이 큰 경우도 가능해야 한다. 그래서 한번에 모두 보낼 수 없기에 나눠 보내야한다. 그래서 'content-type'에 'multipart/form-data' 전송 방식이 사용된다.

    전송이 한번에 처리되지 않기에 조각 조각에 대한 parsing이 처리가 필요하다. 그런 처리는 보통 미리 정의해둔 함수 주소를 받아 data조각이 올 때마다 호출하여 알아서 처리하도록 한다. 그래서 bodyparse개념이 등장했다.

     

    Content-Type

     

    2020.07.13 - HTTP Content-type header values

     

    Content-Type의 값에 'multipart/form-data'를 지정할 수 있다.

    Ex

    Content-Type: multipart/form-data;boundary="boundary"

    이진파일 넘길 때 사용, 하나의 메세지 바디에 파트가 여러개로 나뉠 수 있다.

    boundary는 파트 구분자

     

    multipart/form-data

    파일을 전송하기위해서는multipart/form-data방식을 써야 한다. application/x-www-form-urlencoded방식은 파일을 전송할 수 없다.

    이 방식의 전송데이터는 다음과 같이 생겼다.

    POST /test HTTP/1.1
    Host: foo.example
    Content-Type: multipart/form-data;boundary="boundary"
    
    --boundary
    Content-Disposition: form-data; name="field1"
    
    value1
    
    --boundary
    Content-Disposition: form-data; name="field2"; filename="example.txt"
    
    value2
    
    --boundary--

     

    Boundary

    항목과 항목을 구분하는 구분자는 boundary를 사용한다. 이 값은 Content-Type에 미리 지정하는 값이고 보내는 측에서 마음대로 설정할 수 있다.

    Content-Type에 사용되는 boundary값 앞에 "--"을 붙은 "--boundary"가 실제 boundary이며, 전송데이터의 마지막에는 마지막에 "--"을 붙여서 "--boundary--"가 마지막 boundary로 데이터 전송이 끝났음을 표시한다.

     
    위의 예에서 binary값으로 정확히 본다면 "--boundary\r\n"와 마지막은"--boundary--\r\n"이 된다.
     
    data에서 구분자 값과 동일한 값이 들어가면 절대 안 된다.

    위의 예에서 data값에 [--boundary]이라는 값이 들어갈 경우 문제가 발생할 수 있다. 전체 data값을 전부 파악해서 겹치치 않는 값을 만들어서 사용해야 된다.

    파일을 열어서 모두 검사를 하는 것은 자원을 너무 많이 먹는 작업이다. 따라서 중복되기 매우 어려운 값을 사용하여 성능을 올릴 수 있다.

    public static String GenBoudnaryString() {
    
       SecureRandom random = new SecureRandom();
       byte[] randData = random.generateSeed(16);
       StringBuilder sb = new StringBuilder(randData.length * 2);
    
       for(byte b: randData )
           sb.append(String.format("%02x", b));
    
       return sb.toString();
    }

    무작위 방식인 만큼 연속으로 실패하기 어렵다.

    별도 무결성 검사가 있으면 좋다.

     

     

    'WebService' 카테고리의 다른 글

    Http Keep Alive  (0) 2022.09.23
    'Node Js' vs Python  (0) 2022.08.18
    Token(토큰)  (0) 2022.08.17
    HTTP Request Response structure  (0) 2022.08.10
    Firebase을 사용한 제품  (0) 2022.05.02
    HttpHeader Cookie(쿠키)  (0) 2021.10.26
    웹서버 개발  (0) 2021.06.26
    인터넷 온라인 쇼핑몰 구축 비용  (0) 2021.06.26

    댓글