ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • http multipart request
    Network 2023. 3. 11. 23:03
    728x90
    반응형

     

    개요 

    http 통신은 두 서비스가 정보를 교환하는 방식입니다. 
    정보를 교환하는 방식은 다른 표현으로 프로토콜이라고 합니다.
    그리고 이 서비스들은 각각 클라이언트서버로 불리는데요. 
    클라이언트는 어떠한 컨텐츠에 대한 직접적인 요구를 하는 서비스이고, 서버는 그 요청을 수행해줍니다. 
    즉, http 통신은 클라이언트와 서버가 서로 정보를 교환하고 처리하기 위한 프로토콜이라고 할 수 있습니다. 
     
    브라우저의 네트워크 도구를 통해서 이미지와 문서 등의 자원들이 통신되는 것을 확인할 수 있습니다. 

     
    http 통신이미지, 문서, 스크립트, 파일 등의 다양한 타입의 데이터를 교환할 수 있습니다. 
    multipart 방식의 http 통신큰 규모의 파일을 효율적으로 처리하거나 다양한 데이터 타입의 데이터를 통신하기 위해서 주로 사용하곤 합니다. 

    multipart

    HTTP는 오랜 기간동안 사용되고 발전되어 오면서 다양한 데이터 타입을 수용할 수 있게 되었습니다. 

    과거의 HTTP는 단순히 이미지와 문서만이 통신 가능했습니다.

    하지만 시간이 흘러 스크립트 json 그리고 바이너리 데이터 또한 통신이 가능해졌습니다.

    Content-Type 을 지정함으로써 손쉽게 다양한 데이터를 다룰 수 있습니다. 

     

    하지만 HTTP Request 는 구조적으로 단 하나의 메시지만을 표현할 수 있습니다. 

    HTTP 메시지의 구조는 아래와 같이 표현됩니다. 

    POST / HTTP 1.1
    Host : localhost:3000 
    User-Agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
    Accept-Encoding: gzip, deflate
    Content-Type: multipart/form-data; binary=4j3jdi3jt
    
    -4j3jdi3jt
    .. data ..

    1. Start-Line

    POST / HTTP 1.1

    2. Request/Response Header 

    Host : localhost:3000 
    User-Agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)
    Accept-Encoding: gzip, deflate
    Content-Type: multipart/form-data; binary=4j3jdi3jt

    3. Blank Line

    // 빈 한줄의 라인

    4. Request/Response Message

    -4j3jdi3jt
    .. data ..

    로 구성되는데요,  Request/Response Message 실질적인 데이터를 포함하는 구성요소입니다. 

    Content-Type 설정함으로써 Request/Response Message 의 타입을 지정할 수 있는데,

    둘 이상의 타입의 데이터를 통신하고 싶을 때는 제약 사항이 될 수 있습니다. 

    이렇게 다양한 타입의 데이터를 활용하기 위해서 나온 Content-Type 이 바로 multipart 입니다. 

     

    multipart 타입을 사용함으로써, 스크립트, 이미지, 문자열, 바이너리 데이터 등을 동시에 전송할 수 있게 되었습니다. 

    이때 다양한 데이터들이 Request Message Body 에 추가되게 되는데, 

    각각의 데이터를 구분하기 위해서 boundary 라는 방식을 사용합니다. 

    boundary 는 단순합니다. 식별할 수 있는 고유한 값을 활용하여 데이터를 나누어 줍니다. 

     

    예를 들면, 아래와 같습니다. 

    // ..
    // Http Header
    Content-Type : multipart/form-data; boundary=----1q2w3e4r
    
    ----1q2w3e4r
    Content-Disposition: form-data; name="file"; filename="test1.txt"
    Content-Type: plain/text
    
    this is first file content.
    ----1q2w3e4r
    Content-Disposition: form-data; name="picture"; filename="picture.jpeg"
    Content-Type: image/jpeg
    
    image binary data 
    ----1q2w3e4r

    Content-Type 은 multipart/form-data 와 boundary 에 해당하는 난수가 주어집니다. 

    그리고 첨부된 여러 데이터들은 http message body 에서 boundary 로 구분되어 컨텐츠의 내용이 구성됩니다. 

     

     

    예시

    클라이언트 코드 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form action="/test2" method="post" enctype="multipart/form-data">
      <p><input type="text" name="text" value="this is text">
      <p><input type="file" name="file">
      <p><input type="file" name="image">
      <p><button type="submit">Submit</button>
    </form>
    </body>
    </html>

     

    서버 코드 (nodejs)

    const express = require('express')
    const bodyParser = require('body-parser')
    const multer = require('multer');
    const app = express()
    const port = 3000;
    
    app.use(bodyParser.urlencoded({
      extended: true
    }));
    
    app.use(bodyParser.json());
    app.use(multer({dest:__dirname+'/uploads/'}).any());
    
    
    app.post('/upload', (req, res) => {
      console.log(req.body)
      console.log(req.files)
      res.send("hi")
    })
    
    app.listen(port)

     

     

     

    반응형

    'Network' 카테고리의 다른 글

    TCP Socket 알아보기  (0) 2022.12.19
Designed by Tistory.