HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
💾
File Signature (파일 확장자)
💾

File Signature (파일 확장자)

progress
Done
Tags
backend
🏗️ Build UpMIME 타입이란?MIME을 사용하는 이유?타입을 어떻게 알려줄까?MIME-Type 구조💨What파일 시그니처 란?❓Why [파일 시그니처가 왜 중요할까?]✅HowApach Tika 사용법의존성 추가사용법1. 파일들을 먼저 업로드해서 타입 확인해보기2. 파일의 확장자를 변경해서 타입 확인해보기📌 REFER

🏗️ Build Up

MIME 타입이란?

  • 전자우편을 위한 인터넷 표준으로 바이너리 데이터를 ASCII 텍스트 형식으로 변환(인코딩)하기 위한 방법을 정의합니다.
 

MIME을 사용하는 이유?

  • 옛날 전자우편은 ASCII파일 전송만 가능했었다. 하지만 바이너리 파일(음악, 동영상, 문서 등) 전송이 필요해졌으며 이를 전자우편으로 전송하기 위해 개발되었다.
  • MIME표준에 정의된 Content-Type은 HTTP 통신에서 전송 데이터를 표현할때도 사용된다.
 

타입을 어떻게 알려줄까?

  • MIME으로 인코딩 한 파일은 데이터의 종류를 알려주는 Content-Type 정보를 파일 앞부분에 담습니다.
  • 브라우저의 경우 응답/요청 시 HTTP 메시지 헤더에 정보를 담아서 보내게 되는데 이 헤더에 Content-Type정보를 담아서 어떤 데이터 종류인지 알려줍니다.
 

MIME-Type 구조

  • type/subtype으로 구성되어 있습니다. (전통적으로 소문자를 사용합니다.)
  • type은 1.개별 혹은 2.멀티파트 타입이 될 수 있습니다.
[개별타입]
  • text : 텍스트를 포함한 모든 문서 (인간 readable)
  • image : 모든 종류의 이미지를 포함 (gif 포함)
  • audio : 모든 종류의 오디오 파일
  • video : 모든 종류의 비디오 파일
  • application : 모든 종류의 바이너리 데이터
기본 타입에 있어 중요 역할을 하는 주요 MIME-Type
  • text/plain
    • 서브타입이 없는 텍스트 파일을 위한 기본값입니다.
    • 서브타입이 있는 파일은 서브타입 명시되어야 올바르게 감지합니다.
  • application/octet-stream
    • 서브타입이 없는 바이너리 데이터/문서의 기본값
    • 알려지지 않은 파일 타입은 이 타입을 사용해야 합니다.
    • 웹브라우저가 실행여부를 묻기도 하는데 content-Disposition 헤더가 값 attachment와 함께 설?정되었고 “Save as” 파일을 제안하는지 여부에 따로 브라우저가 그것을 다루게 됩니다.
[멀티파트 타입]
합성된 문서를 나타내는 방법입니다.
  • multipart/form-data (보통 서버로 데이터 보낼때 사용)
    • 브라우저 → 서버로 HTML Form 내용을 전송 시 사용이 가능합니다.
    • 경계(이중대시 - -로 시작되는 문자열)로 구분되는 다른 파트들로 구성됩니다.
    • 각 파트는 자체로 개체이며 자신만의 HTTP 헤더를 가집니다.
      • ex) 파일업로드 필드를 위한 헤더인 content-Diposition, 가장 일반적인 Content-Type
      notion image
  • multipart/byteranges
    • 브라우저로 회신하는 부분적인 응답 전송의 context 내에서 사용됩니다.
    • 206 Partial Content 상태 코드가 전송된 경우, MIME 타입은 문서가 각각의 요청된 범위 중 하나인 몇 가지 파트로 구성되어 있음을 알리기 위해 사용됩니다.
    • boundary 디렉티브를 통해 경계선 문자열을 정의합니다.
    • 각각 다른 파트들은 문서 타입을 나타내는 Content-Type 헤더와 범위를 나타내는 Content-Range를 가집니다.
    • notion image
  • MIME Type 전체목록
    • application
    • audio
    • font
    • example
    • image
    • message
    • model
    • multipart
    • text
    • video

💨What

파일 시그니처 란?

🌕
파일 형식마다 가지고 있는 고유의 특징, 즉 포맷에 대한 정보
  • 파일 시그니처는 특정 byte로 이루어져 있는데 이 byte단위의 시그니처가 파일의 처음에만 존재하는 파일 포맷도 있으며 , 처음과 마지막에 존재하는 파일도 있다.
  • 파일 처음에 있는 시그니처를 Header, 마지막에 있는 시그니처를 Footer라고 불리운다.
 

❓Why [파일 시그니처가 왜 중요할까?]

🌕
불특정 다수에게 서비스하는 곳에서 .exe 확장자를 .pdf로 업로드 하는 경우 .exe를 실행시키게 된다면 서비스는 마비 및 개인정보 유출 보안에 심각한 사태가 발생하기 때문이다.

✅How

Apach Tika 사용법

의존성 추가

implementation 'org.apache.tika:tika-core:1.4' implementation 'org.apache.tika:tika-parsers:2.3.0'

사용법

  • 간단하게 넘어온 파일의 실제 MIME 타입을 확인해 보겠습니다.
@PostMapping public void test(MultipartFile[] multipartFiles) throws IOException { Tika tika = new Tika(); for (MultipartFile file : multipartFiles) { String mimeType = tika.detect(file.getBytes()); System.out.println("**************************"); System.out.println(file.getOriginalFilename()); System.out.println("mimeType = " + mimeType); System.out.println("**************************"); } }
 

1. 파일들을 먼저 업로드해서 타입 확인해보기

  • 현재 제 폴더에는 2개의 jpeg와 하나의 pdf파일이 존재하며 세개의 파일을 모두 컨트롤러로 요청을 보내보겠습니다.
notion image
notion image
  • 아래의 결과를 보면 제대로된 타입이 나오는걸 확인하실 수 있습니다.
notion image

2. 파일의 확장자를 변경해서 타입 확인해보기

🧐
확장자를 잘 체크하도록 동작은 했지만 실제 확장자와 맞지 않는 타입을 강제로 확장자 타입에 맞게 변경한 후에 요청된 파일들에 대해서는 제대로 검증하지 못한 문제점이 존재했었습니다.
  • 신청서의 pdf파일을 png로 변환시킨 후 컨트롤러로 요청을 보내보겠습니다.
notion image
notion image
  • 아래의 결과를 보면 파일의 이름에는 png로 변경되어 있지만 실제 mimeType은 그대로 application/pdf로 출력되는 모습을 확인하실 수 있습니다.

📌 REFER

  • byte 🔄 16 진수 변환 코드
70. (java/자바) byte to hex, hex to byte - 바이트 byte, 헥사 hex 데이터간 포맷 실시
package AI2; import java.util.Arrays; public class MainActivity20 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("[byte to hex, hex to byte - 바이트 byte, 헥사 hex 데이터간 포맷 실시]"); /*[설 명] * 1. hex란 ? 16진수 표기입니다 * 2. 사용이유 ?
70. (java/자바) byte to hex, hex to byte - 바이트 byte, 헥사 hex 데이터간 포맷 실시
https://kkh0977.tistory.com/76
70. (java/자바) byte to hex, hex to byte - 바이트 byte, 헥사 hex 데이터간 포맷 실시
byte 와 16진수(Hex) String 변환
16진법은 0~9, A~F 까지 기호를 사용하여 숫자를 표현(코딩)하는 방식입니다. 64진법은 0~9, a~z, A~Z, +, / 기호를 이용하여 숫자를 표현(코딩)하는 방식입니다. byte array 는 2진수로 이루어진 데이터 입니다만 사람이 읽기 어려우므로 16진법(Hex digits)이나 64진법(base64)으로 변환하여 2진수의 배열(byte array)을 문자처럼 사용하기도 합니다. java에서 byte 데이터를 16진수 String으로 바꿀 때 보통 아래와 같은 소스 코드를 이용합니다.
byte 와 16진수(Hex) String 변환
https://blog.aacii.net/73
byte 와 16진수(Hex) String 변환
 
  • 시그니처 정의
파일 시그니처 모음 & 파일 확장자란?
파일 확장자란? 컴퓨터 파일의 이름에서 파일의 종류와 그 역할을 표시하기 위해 사용하는 부분이다. 간단히 확장자라고도 한다. 많은 운영체제들은 파일이름에서 마지막 점(.) 뒤에 나타나는 부분을 확장자로 인식한다. 출처) https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC_%ED%99%95%EC%9E%A5%EC%9E%90 예를 들어 abc라는 jpg파일이 있다. 파일을 똑같이 복사하여 확장자를 docx로 변경하니 word아이콘으로 바뀌었다. word파일을 열어보면 오류가 생겼다고 열리지 않는다.
파일 시그니처 모음 & 파일 확장자란?
https://4rensic01.tistory.com/6
파일 시그니처 모음 & 파일 확장자란?
파일 시그니처(File Signatures)란?
손상된 파일을 복구하거나 파일 안에있는 숨겨진 내용을 파악하는 포렌식 분야에서 알아야 할 파일 시그니처의 개념과 CTF에서 자주 볼 수있는 파일들의 헤더 시그니처에 대해 알아봅시다. 파일 시그니처(File Signatures) 혹은 파일 매직 넘버(file magic number)는 파일 형식마다 가지고 있는 고유의 특징, 즉 포맷에 대한 정보입니다.
파일 시그니처(File Signatures)란?
https://velog.io/@910/%ED%8C%8C%EC%9D%BC-%EC%8B%9C%EA%B7%B8%EB%8B%88%EC%B2%98File-Signatures-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
파일 시그니처(File Signatures)란?
  • 파일 시그니처 값
List of file signatures - Wikipedia
needs additional citations for verification .improve this article by (Learn how and when to remove this template message ) adding citations to reliable sources. Unsourced material may be challenged and removed.
List of file signatures - Wikipedia
https://en.wikipedia.org/wiki/List_of_file_signatures
List of file signatures - Wikipedia