문제상황
클라이언트가 업로드한 파일을 바이트 어레이로 변경하고 외부 서버를 호출하는 과정에서 에러가 발생했다.
@Override
public void setFormDataImageFile(MultiValueMap<String, Object> formData, MultipartFile file) {
try {
byte[] fileBytes = file.getBytes();
String originalFilename = file.getOriginalFilename();
final String fileExtension;
if (originalFilename != null && originalFilename.contains(".")) {
fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
} else {
throw new CustomException(...);
}
formData.add(
"image",
new ByteArrayResource(fileBytes) {
@Override
public String getFilename() {
return UUID.randomUUID() + fileExtension; //fileExtension 부분을 추가하지 않았었음
}
});
} catch (IOException e) {
throw new IllegalArgumentException(
"Failed to process the file: " + (file.getOriginalFilename() != null
? file.getOriginalFilename() : "unknown file"), e);
}
}
MultipartFile 형태로 받아온 파일의 원본 이름을 제외하고, UUID형태로 변환하는 과정에서 확장자를 빼먹고 변환 후 외부 서버로 전송했다. 그랬더니 외부 서버에서는 .jpg와 같은 확장자를 보고 바이트 어레이의 MIME TYPE을 추론하기 때문에 에러가 났다.
테스트 시에 포스트맨으로 보낼 때는 에러가 발생하지 않았다. 포스트맨은 파일을 업로드 할 때 확장자를 참조하여 MIME_TYPE을 자동으로 포함하여 요청을 보내기 때문이다.
* MIME 타입(MIME Type)란?
MIME(Multipurpose Internet Mail Extensions) 타입은 인터넷에서 파일, 데이터, 이메일 등을 전송할 때 데이터의 형식과 유형을 식별하기 위해 사용되는 표준 형식입니다. 이는 클라이언트(웹 브라우저, 애플리케이션)와 서버가 데이터를 올바르게 처리할 수 있도록 도와줍니다.
MIME 타입의 역할
클라이언트와 서버 간 데이터 처리
• 클라이언트가 서버로부터 받은 데이터를 어떻게 처리할지 결정하는 데 사용
• 예: text/html은 브라우저가 HTML로 렌더링하도록 지시
파일 전송 및 업로드
• 업로드되는 파일의 유형을 서버가 판별
• 예: 이미지 파일이 image/jpeg인지, image/png인지 확인
보안
• 잘못된 MIME 타입의 데이터를 무시하거나 거부하여 보안 문제 방지
• 예: HTML 대신 실행 가능한 스크립트를 포함한 파일 전송을 막음
'Programming-[Base] > Web, Browser' 카테고리의 다른 글
Web Architecture / 기초 / HTTP (0) | 2020.09.25 |
---|---|
Web Architecture / URI, URL, URN (0) | 2020.09.25 |
Web Architecture / 개요 / Browser, Server, API, HTTP, Ajax (0) | 2020.09.22 |