파일 없는 파일 업로드 만들기

devkingsejong·2021년 4월 9일
0

그냥

목록 보기
2/3
post-thumbnail

홍철없는 홍철팀.

웹페이지의 form(<input type='file'/>)을 통해 업로드한 파일을 받아 처리하는 API가 있을 때 파일 없이 String Data를 그 파일의 내용인 것 처럼 보낼 순 없을까?

당연히 가능하다.

일반적인 파일 전송을 curl 코드로 보면 아래와 같다.

curl --location --request POST 'http://0.0.0.0:3337
--form 'f=@"/Users/velog/text.txt"'

당연히 서버측에 로컬 컴퓨터에 있는 파일 주소를 보내는 것은 아니고, curl 프로그램이 파일 관련 Tag인 F=@ 혹은 --file = 등을 만나면 약속된 규약으로 바꾸어 보내는데, 그 규약은 아래 링크에 정리되어있다.

https://tools.ietf.org/html/rfc2046#section-5.1.1


Boundary 설정법

규약 내용을 읽어보면 파일을 전송하기위해 multipart/formdataBoundary에 대한 내용이 나오는데, 대략적인 방법은 아래와 같다.

  1. content-typemultipart/form-data 로 지정하고, boundary명을 지정해 준다.
  2. boundary 내용은 Body에 들어가며 --Boundary 명으로 시작하고, --Boundary 명으로 끝난다. 모든 Boundary에 대한 정의가 끝났으면, --Boundary-- 으로 끝난다.
  3. 각 Boundary에는 Content-DispositionContent-Type에 대한 정의가 필요하다.

+a 컨텐츠 내용의 줄바꿈은 \r \n 으로 표현한며, 컨텐츠의 내용이 반드시 ASCII로 이루어질 필요는 없다.

Curl 형태의 예시

curl --location --request POST 'https://test.com
--header 'content-type: multipart/form-data; boundary=--9546' \

--data-raw '--9546
Content-Disposition: form-data; name="file"; filename="main.c"
Content-Type: application/octet-stream

#include <stdio.h>

int main (void){
	return 0;
}

--9546--

위와 같이 Body와 Header를 설정하고, 서버측에서 request를 받아보면 form을 통해 파일을 전송했을 때와 똑같이 파일을 처리할 수 있는 것을 확인할 수 있을 것이다. (물론 proxy툴을 통해 HTTP통신을 capture해 보아도 Boundary명만 제외하면 내용이 같은 것을 확인할 수 있다.)

출처

https://tools.ietf.org/html/rfc2046#section-5.1.1
https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Disposition

0개의 댓글