개발 공부 기록하기/08. 네트워크

HTTP Content-Disposition란

lannstark 2019. 7. 25. 08:59

간단한 이해

Disposition이란 기질, 성향, 배치, 배열 이란 뜻이다.

HTTP Response Header에 들어가는 Content-Disposition은 HTTP Response Body에 오는 컨텐츠의 기질/성향을 알려주는 속성이다.

default 값은 inline으로 web에 전달되는 data라고 생각하면 된다.

특수한 경우는 Content-Disposition에 attachment를 주는 경우로, 이때 filename과 함께 주게 되면 Body에 오는 값을 다운로드 받으라는 뜻이 된다.

Content-Disposition: attachment; filename="hello.jpg"

"는 서버측에서 header를 설정할 때 붙이지 않아도 되는 듯 하다

multipart

만약 Body에 담길 data가 커서 HTTP response가 여러 번 나가야 한다면(multipart) 아래와 같은 형식으로 나가게 된다.

  • 첫 번째 Response Header

    Content-Type: multipart/form-data;boundary="boundary"
  • 두 번째 Response Header

    Content-Disposition: form-data; name="field1"
  • 세 번째 Response Header

    Content-Disposition: form-data; name="field2"; filename="example.txt"

궁금증

여기서 생긴 궁금증... HTTP body는 용량제한이 없어도 (브라우저나 서버에서 정한 미니멈이 사실상 제한이 될 것!) HTTP를 있게 해주는 Transport layer나 Network layer에서 payload 제한이 있을텐데 HTTP단에서 패킷 순서를 받아서 한 번에 보여주는건가...?

실험을 위해 1,000byte, 100,000byte 100,000byte 1,000,000 byte를 한 번 보내보자!

백엔드 / 프론트 구현

back은 간단하게 spring boot로 작성했다.

package com.lannstark.httptest;

import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MainController {

  @RequestMapping(value = "/test1", method = RequestMethod.GET)
  public ResponseEntity<String> getTest1File() {
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < 1000; i++) {
    sb.append("A");
  }

  HttpHeaders headers = new HttpHeaders();
  headers.add("Content-Disposition", "attachment; filename=test1.txt");
  return ResponseEntity
    .ok()
    .headers(headers)
    .body(sb.toString());
  }

}

프론트는 index.html 하나만 만들어서 브라우저에서 열면 된다.

<a href="http://localhost:8080/test1">여기!</a>

1,000 bytes

Content-Length 1000으로 잘 온 것을 확인할 수 있다.

10,000 bytes

이번에도 잘 왔다.

100,000 bytes

100kb라면 어떨까!

너무 잘온다...

1,000,000 bytes

굳이 캡쳐하지 않아도 아주 잘온다...

10,000,000 bytes

마찬가지...

10mb파일을 전송할 때도, multipart는 사용하지도 않았다. 정말 큰 용량의 파일을 다룰 때 사용하나보다