최근 수정 시각 : 2025-01-24 10:46:59

파일 시그니처

파일 헤더에서 넘어옴

1. 개요2. 식별자로써3. 목록4. 관련 문서

1. 개요

임의의 데이터가 어떤 형식을 나타내는지 구분하기 위해 파일의 맨 앞부분에 삽입하는 고유한 값. 매직 넘버라고도 불린다.

2. 식별자로써

전통적으로 확장자Windows의 전통으로, 유닉스 계열 운영체제에서는 별도의 확장자 없이 파일 내부에 메타데이터를 포함하는 방식으로 발전했다.[1] 이러한 바이너리 파일 맨 앞부분에 위치한 수~수십 바이트의 내용을 파일 헤더(file header)라고 하는데, 이 파일 헤더 영역의 맨 앞 2바이트를 매직 넘버(magic number)라고 부르며 구분하던 게 시초.[2]

흔히 대중적으로 알려진 파일 구분 방식은 확장자지만, 확장자는 파일 시스템에 저장된 데이터에서만 성립하는 일종의 편의성 습관(convention)이라고 할 수 있다. 유저 인터페이스 아래에서 파일 데이터를 직접 바이트 단위로 읽고 처리하는 대부분의 프로그램들은 파일 시그니처를 사용한다. 파일 매니저에서 확장자와 무관하게 다양한 파일들을 형식별로 동영상, 이미지, 음악 등으로 구분해 주는 원리가 바로 이것.

특히 무명(unnamed) 기반의 시스템에 유리한데, 확장자나 파일명이라는 개념이 없이 모든 데이터를 각각의 바이너리 blob으로 저장하고 이를 해시한 값만을 식별자로 사용한다면?[3] 네트워크로 각종 이미지나 실시간 동영상 같은 데이터를 보낸다면? 이럴 경우 별도의 메타데이터 레이어를 두는 것보다 필요할 때만 파일 시그니처를 읽어서 형식을 알아내는 방식이 효율적이다.

다만 확장자에 비해 비효율적이거나 부정확한 경우도 있는데, 대표적으로 일관성이 없다는 것이다. 확장자야 공백, 특수문자 등이 없는 정규화된 문자열이고 어디부터 어디까지 읽어야 하는지는 명확하지만, 파일 시그니처의 경우 정확히 몇 바이트까지 읽어야 하는지조차 포맷마다 천차만별이다. 또한 바이너리 포맷 위주의 컨벤션이다 보니 파일 헤더란 개념조차 없는 일반 텍스트 파일의 경우에는 적용하기 힘들다.

3. 목록

순서는 시그니처의 바이트 단위로 정렬한다. 길이는 바이트 기준이다. 시그니처는 반드시 대문자 기준 16진법으로 표기한다. 이때, 아무 바이트를 허용한다면 ??로 표시한다. ?? 바이트는 다른 시그니처와 겹치는 경우, 맨 뒤로 정렬한다. 아스키 표현의 경우 출력 불가능한 문자는 .로, 임의의 문자는 ?로 대체한다.
길이 시그니처 아스키 포맷 비고
4 00 00 01 00 .... .ico 파일
4 00 61 73 6D .asm WASM
4 1A 45 DF A3 .E.. MKV WebM도 여기에 포함된다.
2 1F 8B .. gzip 압축 파일
8 21 3C 61 72 63 68 3E 0A !. .deb 패키지 데비안에서 사용된다.
2 23 21 #! 셸 스크립트 #! 문서 참고.
4 25 21 50 53 ..PS 포스트스크립트
5 25 50 44 46 2D %PDF- PDF 이후로는 버전 정보가 온다. 1.7 버전 문서는 %PDF-1.7로 읽히는 식.
6 37 7A BC AF 27 1C 7z..'. 7z
4 38 42 50 53 8BPS PSD
2 42 4D BM BMP
3 42 5A 68 BZh bzip2 압축 파일
5 43 44 30 30 31 CD001 ISO 디스크 이미지
4 43 72 32 34 Cr24 Chrome의 확장 패키지 파일
6 47 49 46 38 37 61 GIF87a GIF 87a 버전 파일
6 47 49 46 38 39 61 GIF89a GIF 89a 버전 파일
4 4B 43 4D 53 KCMS ICC 색 프로파일
3 4B 44 4D KDM VMDK VMware에서 사용된다.
4 4D 53 43 46 MSCF 마이크로소프트 캐비넷 파일
2 4D 5A MZ PE .dll 등이 PE 형식이다.
4 4F 62 6A 01 Obj. Avro 아파치 재단데이터 직렬화 형식
4 4F 67 67 53 OggS Ogg
4 50 4B 03 04 PK.. ZIP zip을 기반으로 하는 거의 모든 컨테이너 파일(apk, docx, epub, jar, xlsx)도 같은 시그니처를 가진다.
8 50 4D 4F 43 43 4D 4F 43 PMOCCMOC DAT
12 52 49 46 46 ?? ?? ?? ?? 57 41 56 45 RIFF????WAVE WAV
12 52 49 46 46 ?? ?? ?? ?? 57 45 42 50 RIFF????WEBP WebP
16 53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00 SQLite format 3. SQLite의 db 파일
4 54 44 46 24 TDF$ Telegram 데스크탑 파일
2 5A 4D ZM EXE
4 66 4C 61 43 fLaC FLAC
8 66 74 79 70 69 73 6F 6D ftypisom MP4
4 7F 45 4C 46 .ELF ELF .so, .o, 유닉스 네이티브 실행 파일 등 유닉스 운영체제에서 흔하게 볼 수 있다.
8 89 50 4E 47 0D 0A 1A 0A .PNG.... PNG
4 CA FE BA BE .... Java class 임의의 비트열 같겠지만 자세히 보면 Cafe babe가 나온다.
8 D0 CF 11 E0 A1 B1 1A E1 ........ CFBF 흔히 Microsoft에서 개발한 레거시 파일들인 .doc, .xls, .ppt, .msi 등이 여기에 해당한다.
4 ED AB EE DB .... RPM
4 FF D8 FF E0 .... JPG
4 FF D8 FF E1 .... JPG JPEG의 경우 디지털카메라로 캡쳐한 파일과 구분하기 위해 “FF D8 FF E1” 시그니처도 사용
2 FF FB .. MP3
2 FF FE .. 리틀 엔디안 텍스트 파일 BOM 참고
2 FE FF .. 빅 엔디안 텍스트 파일
6 FD 37 7A 58 5A 00 .7zXZ. XZ 압축 파일
12 00 00 00 18 66 74 79 70 68 65 69 63 ????ftyphei HEIC

4. 관련 문서


[1] often associated with Unix and its derivatives, is to store a "magic number" inside the file itself.[2] Originally, this term was used for a specific set of 2-byte identifiers at the beginnings of files[3] Git이 정확히 이렇게 동작한다. 정확히는 유닉스의 파일 시스템을 본뜬 것.

분류