식별
이미지 업로드 시 프론트엔드에서 확장자를 이미지 파일로 제한을 했지만 이미지 파일이 아닌 파일의 확장자를 .jpg 등의 이미지 확장자로 바꾼다면 업로드가되는 문제가 발생했습니다.
다음과 같이 프로필 이미지를 변경할 시에 .pptx 파일을 .jpg 파일로 변경해도 문제 없이 업로드가 될 수 있습니다.

분석 및 개선 방향
파일의 확장자가 바뀌어도 변조된 파일이 원래 어떤 형식의 파일인지 알아낼 필요가 있습니다. 검색결과 MimeType의 Signature는 파일의 확장자와는 상관없이 어떤 형식의 파일인지에 대해서 나타내고 있었습니다.

이를 활용해서 이미지파일 Validator를 구현하면 해결할 수 있을 것으로 판단되었습니다.
해결
본 프로젝트에서 사용되는 파일의 형식은 JPG, JPEG, PNG, BMP, GIF 등 이미지 파일이었습니다.
아래 문서를 확인해본 바로는 시그니처 패턴과 파일의 어디에 시그니처 패턴이 위치해 있는지의 Offset을 활용할 수 있었습니다.
현재 프로젝트에서 사용되는 Image 파일 형식은 Offset이 모두 0이었고 파일 맨 앞부분의 몇가지의 16진수만 읽어들이면 검증할 수 있었습니다.

시그니처 Validation 과정은 다음과 같습니다.
- 먼저 1차로 파일의 확장자를 읽어들입니다.
- 파일 시그니처 목록을 정의한 Enum이 해당 확장자를 지원하는지 확인하고 맞는 Enum값을 가져옵니다.
- 지원하지 않는다면 예외를 발생시킵니다.
- Enum 값을 가져왔다면 InputStream으로 파일의 앞부분을 필요한만큼 읽어들입니다.
- Enum에 정의한 Signature와 읽어들인 16진수 값들이 일치하는지 확인합니다.
- 일치하지 않는다면 예외를 발생시킵니다.