확장자(副檔字, filename extension)는 파일 이름 뒤에 붙어 파일의 종류나 용도를 나타내는 문자열이다. 영어로는 filename extension 또는 간단히 file extension이라고 한다.
보통 파일 이름의 마지막 부분에 마침표 `.`와 함께 붙는다.
사진.jpg 음악.mp3 문서.pdf 압축파일.zip 프로그램.exe
여기서 `.jpg`, `.mp3`, `.pdf`, `.zip`, `.exe`가 확장자다.
Windows에서는 확장자가 어떤 프로그램으로 파일을 열 것인지 결정하는 데 특히 중요한 역할을 한다. 예를 들어 `.docx`는 보통 Microsoft Word, `.xlsx`는 Microsoft Excel, `.mp3`는 음악 재생 프로그램과 연결된다.[1]
다만 확장자와 실제 파일 형식은 같은 개념이 아니다. `cat.jpg`라는 파일의 이름을 `cat.png`로 바꾼다고 JPEG 파일이 PNG로 변환되는 것은 아니다. 이름표만 바뀌었을 뿐 파일 내부 데이터는 그대로다.[2]
구조
일반적인 파일 이름은 대략 다음과 같이 볼 수 있다.
파일이름.확장자
예를 들어
novawiki.png
라면
- `novawiki` - 파일 이름
- `.png` - 확장자
다.
확장자 앞의 마침표 자체를 포함해 `.png`라고 표현하는 경우가 많지만 확장자 문자열 자체는 `png`라고 보기도 한다.
파일 이름에는 마침표가 여러 개 들어갈 수도 있다.
novawiki.backup.2026.zip
이 경우 일반적으로 마지막 `.zip`을 확장자로 취급한다.
하지만 다음과 같이 여러 부분이 하나의 의미를 이루는 복합 확장자도 있다.
archive.tar.gz database.sql.gz types.d.ts
`archive.tar.gz`는 TAR 파일을 gzip으로 다시 압축했다는 뜻이므로 `.tar.gz` 전체가 하나의 관용적인 형식 표시처럼 사용된다.
Linux 데스크톱에서 사용하는 Shared MIME-info 사양 역시 `*.tar.gz`처럼 여러 확장자가 붙은 경우 더 긴 패턴을 우선해서 식별하도록 규정한다.[3]
역사
초기 컴퓨터 운영체제에서는 파일 이름 뒤의 짧은 문자열을 이용해 파일 종류를 구분하는 방식이 널리 사용됐다.
DOS에서는 8.3 파일명 규칙이 유명했다.
XXXXXXXX.YYY
파일 이름 8자, 확장자 3자까지 사용할 수 있었기 때문에 지금도 유명한 확장자 상당수가 3글자다.
- `.txt`
- `.exe`
- `.com`
- `.bat`
- `.bmp`
- `.wav`
- `.zip`
- `.gif`
- `.jpg`
JPEG의 원래 약어가 JPEG인데 확장자로 `.jpg`가 널리 퍼진 것도 3글자 제한의 영향이 컸다.
현대의 Windows, Linux, macOS 등에서는 확장자가 반드시 3글자일 필요가 없다.
그래서
- `.jpeg`
- `.html`
- `.docx`
- `.xlsx`
- `.webp`
- `.webm`
- `.heic`
- `.torrent`
- `.blend`
- `.sqlite`
등 길이가 제각각인 확장자를 자유롭게 사용한다.
확장자와 파일 형식
확장자는 파일 형식을 표시하는 이름이지 파일 형식 그 자체가 아니다.
예를 들어 실제 PNG 파일에는 파일 시작 부분에 PNG를 나타내는 고유한 데이터가 존재한다. 확장자를 `.jpg`로 바꿔도 내부 데이터는 여전히 PNG다.
마찬가지로
music.mp3 → music.wav
로 이름을 바꾼다고 MP3가 WAV로 변환되지 않는다.
Microsoft도 Windows의 확장자 변경은 파일 형식 자체를 변환하지 않고 파일 이름만 변경한다고 명시하고 있다.[4]
진짜 변환을 하려면 해당 데이터를 디코딩하고 다른 포맷으로 다시 저장해야 한다.
예를 들어
PNG → JPEG
변환이라면 PNG 데이터를 읽은 뒤 JPEG 방식으로 다시 인코딩해야 한다.
WAV → MP3
역시 PCM 등의 오디오 데이터를 MP3 코덱으로 새로 인코딩해야 한다.
그냥 이름만 바꾸는 것은 변환이 아니다.
파일 시그니처
파일 내부에 들어 있는 형식 식별용 데이터를 파일 시그니처(file signature)라고 한다.
흔히 매직 넘버(magic number)라고도 한다.
대표적으로 다음과 같은 파일은 시작 부분에 특징적인 값이 들어 있다.
| 형식 | 대표적인 시작 데이터 |
|---|---|
| PNG | `89 50 4E 47 0D 0A 1A 0A` |
| JPEG | `FF D8 FF` |
| GIF | `GIF87a` 또는 `GIF89a` |
| `%PDF-` | |
| ZIP | `PK` |
| WAV | `RIFF....WAVE` |
따라서 프로그램은 확장자만 보지 않고 파일 내부를 확인해 실제 형식을 판별할 수도 있다.
Unix 계열 시스템의 `file` 명령어가 대표적이다.
file image.jpg
`file`은 파일시스템 정보, 매직 데이터, 텍스트 구조 등을 검사해 파일 형식을 판단한다.[5]
그래서 PNG 파일 이름을 억지로 `image.jpg`로 바꿔도 `file` 명령어를 실행하면 실제로는 PNG라는 것을 찾아낼 수 있다.
MIME 타입
인터넷에서는 파일 확장자와 별도로 MIME 타입 또는 미디어 타입을 사용해 데이터 형식을 표현한다.
대표적으로
| 파일 | MIME 타입 |
|---|---|
| HTML | `text/html` |
| CSS | `text/css` |
| JSON | `application/json` |
| `application/pdf` | |
| JPEG | `image/jpeg` |
| PNG | `image/png` |
| GIF | `image/gif` |
| MP3 | `audio/mpeg` |
| MP4 | `video/mp4` |
와 같이 쓴다.
IANA는 현재 MIME 타입을 `application`, `audio`, `font`, `image`, `message`, `model`, `multipart`, `text`, `video` 등의 최상위 유형으로 분류해 등록하고 있다.[6]
확장자와 MIME 타입은 서로 관련이 있지만 1:1 대응하는 것은 아니다.
예를 들어 같은 MIME 타입에 여러 확장자가 대응될 수도 있고 같은 컨테이너가 내부 데이터에 따라 서로 다른 용도로 사용될 수도 있다.
Linux 데스크톱 환경의 Shared MIME-info 역시 파일명의 확장자 패턴과 파일 내부의 매직 데이터를 함께 사용해 MIME 타입을 판별한다.[7]
Windows
Windows는 파일 확장자를 적극적으로 사용하는 대표적인 운영체제다.
확장자를 이용해
- 파일 아이콘
- 기본 프로그램
- 더블클릭 시 실행할 프로그램
- 파일 종류 설명
등을 연결한다.
예를 들어 `.xlsx`를 Microsoft Excel에 연결하면 파일 탐색기에서 Excel 아이콘이 표시되고 더블클릭했을 때 Excel이 실행된다.
Microsoft가 제공하는 Windows 확장자 목록만 봐도 수많은 형식이 등록되어 있다.[8]
확장자 표시
Windows에서는 설정에 따라 알려진 파일 형식의 확장자를 숨길 수 있다.
Windows 11 기준 파일 탐색기에서
보기 → 표시 → 파일 확장명
을 활성화하면 확장자를 볼 수 있다.[9]
컴퓨터를 어느 정도 다룬다면 그냥 항상 켜놓는 것이 편하다.
특히 실행파일과 일반 문서를 구별할 때 상당히 중요하다.
Linux
Linux와 전통적인 Unix 계열에서는 확장자가 Windows보다 덜 절대적이다.
실행파일도 반드시 `.exe`를 붙이지 않는다.
예를 들어
bash python ssh ls grep nginx
같은 프로그램에는 확장자가 없다.
Unix 계열에서는 파일이 실행 가능한지는 파일 이름의 확장자보다 실행 권한과 파일 내부 형식이 중요하다.
ELF 실행파일에 굳이 `.elf`라는 확장자를 붙일 필요도 없다.
하지만 사용자 편의와 데스크톱 프로그램 연결 등을 위해 Linux에서도 `.txt`, `.png`, `.mp4`, `.pdf` 같은 확장자를 매우 흔하게 사용한다.
freedesktop.org의 Shared MIME-info 시스템은
- 파일명 패턴
- 확장자
- MIME 타입
- 매직 데이터
를 함께 사용해 파일 종류를 판별한다.[10]
macOS
macOS에서도 확장자를 사용한다.
대표적으로
- `.app`
- `.dmg`
- `.pkg`
- `.plist`
- `.heic`
- `.mov`
등이 흔하다.
macOS의 애플리케이션은 Finder에서 하나의 파일처럼 보이는 `.app` 형태가 많지만 실제로는 내부에 여러 파일과 디렉터리가 들어 있는 애플리케이션 번들이다.
또 역사적으로 Macintosh는 단순한 확장자 이외에도 파일 타입 코드나 Creator Code 같은 별도의 메타데이터 체계를 사용했다.
현대 macOS에서는 확장자와 함께 UTI/UTType 계열의 파일 형식 식별 체계를 사용한다.
주요 확장자
문서
| 확장자 | 형식 | 설명 |
|---|---|---|
| .txt | 텍스트 파일 | 일반 텍스트 |
| Adobe가 개발한 전자문서 | ||
| .doc | Microsoft Word Document | 구형 Microsoft Word 문서 |
| .docx | Office Open XML Document | 현대 Word 문서 |
| .hwp | 한글과컴퓨터 한글 문서 | 대한민국에서 많이 사용 |
| .hwpx | HWPX | XML 기반 한글 문서 |
| .odt | OpenDocument Text | LibreOffice 등에서 사용 |
| .rtf | Rich Text Format | 서식 포함 텍스트 |
| .md | Markdown | 마크다운 문서 |
| .epub | EPUB | 전자책 |
| .mobi | Mobipocket | 전자책 |
스프레드시트
| 확장자 | 형식 |
|---|---|
| .xls | 구형 Microsoft Excel 문서 |
| .xlsx | Office Open XML Spreadsheet |
| .xlsm | 매크로 포함 Excel 문서 |
| .csv | CSV |
| .tsv | Tab-separated values |
| .ods | OpenDocument Spreadsheet |
특히 CSV는 Excel 전용 형식이 아니다. 그냥 구분자로 데이터를 나열한 텍스트 파일이다.
프레젠테이션
| 확장자 | 형식 |
|---|---|
| .ppt | 구형 Microsoft PowerPoint 문서 |
| .pptx | Office Open XML Presentation |
| .pptm | 매크로 포함 PowerPoint |
| .odp | OpenDocument Presentation |
이미지
| 확장자 | 형식 | 특징 |
|---|---|---|
| .jpg / .jpeg | JPEG | 사진에 널리 사용되는 손실압축 |
| .png | PNG | 무손실압축·투명도 지원 |
| .gif | GIF | 애니메이션 지원 |
| .webp | WebP | Google이 개발 |
| .avif | AVIF | AV1 기반 이미지 |
| .heif | HEIF | 고효율 이미지 컨테이너 |
| .heic | HEIC | Apple 기기에서 흔함 |
| .bmp | BMP | Windows 비트맵 |
| .tif / .tiff | TIFF | 출판·스캔·전문 이미지 |
| .svg | SVG | XML 기반 벡터 이미지 |
| .ico | Windows Icon | 아이콘 |
| .raw | Raw image | 일반적인 RAW 데이터 표현 |
| .dng | Digital Negative | Adobe RAW 규격 |
| .cr2 | Canon RAW | Canon 카메라 |
| .cr3 | Canon RAW | 최신 Canon 카메라 |
| .nef | Nikon RAW | Nikon 카메라 |
| .arw | Sony RAW | Sony 카메라 |
3D·CAD
- 3dm - Rhinoceros 3D에서 주로 사용하는 3D 모델 파일 형식.
오디오
| 확장자 | 형식 | 특징 |
|---|---|---|
| .wav | WAV | PCM 등에 널리 사용되는 오디오 컨테이너 |
| .mp3 | MP3 | 대표적인 손실압축 오디오 |
| .aac | AAC | 손실압축 오디오 |
| .flac | FLAC | 무손실압축 |
| .m4a | ALAC | Apple 무손실 코덱 |
| .ogg | Ogg | 컨테이너 |
| .opus | Opus | 현대적인 오디오 코덱 |
| .aiff / .aif | AIFF | Apple 계열 무압축 오디오 |
| .mid / .midi | MIDI | 실제 음성 대신 연주 정보 저장 |
| .m4a | MPEG-4 Audio | AAC·ALAC 등에 사용 |
| .wma | Windows Media Audio | Microsoft 오디오 |
`.m4a`처럼 확장자 하나만으로 내부 코덱을 완전히 특정할 수 없는 경우도 있다. M4A 안에 AAC가 들어갈 수도 있고 ALAC가 들어갈 수도 있다.
영상
| 확장자 | 형식 | 특징 |
|---|---|---|
| .mp4 | MP4 | 가장 널리 사용되는 영상 컨테이너 중 하나 |
| .mkv | Matroska | 다양한 코덱과 자막을 담을 수 있음 |
| .avi | AVI | Microsoft의 오래된 컨테이너 |
| .mov | QuickTime | Apple 계열 영상 컨테이너 |
| .webm | WebM | 웹 영상 |
| .mpeg / .mpg | MPEG Program Stream 등 | 오래된 MPEG 영상 |
| .m2ts | MPEG-2 Transport Stream | Blu-ray 등에 사용 |
| .ts | MPEG Transport Stream | 방송·스트리밍 |
| .3gp | 3GPP | 과거 휴대전화에서 많이 사용 |
| .wmv | Windows Media Video | Microsoft 계열 |
| .flv | Flash Video | 과거 웹 동영상 |
영상 파일에서는 특히 컨테이너와 코덱을 구분해야 한다.
예를 들어 `.mp4`라고 해서 무조건 H.264 영상인 것은 아니다.
MP4 컨테이너 안에는
등 다양한 영상·음성 데이터를 넣을 수 있다.
MKV 역시 영상 코덱 이름이 아니라 컨테이너다.
압축 및 아카이브
| 확장자 | 형식 |
|---|---|
| .zip | ZIP |
| .rar | RAR |
| .7z | 7-Zip |
| .tar | TAR |
| .gz | gzip |
| .bz2 | bzip2 |
| .xz | XZ |
| .zst | Zstandard |
| `.tar.gz` | TAR + gzip |
| `.tar.bz2` | TAR + bzip2 |
| `.tar.xz` | TAR + XZ |
| `.tgz` | `.tar.gz`의 축약형 |
TAR 자체는 원래 여러 파일을 하나로 묶는 아카이브 형식이지 압축 알고리즘이 아니다.
그래서 Unix 계열에서는
archive.tar.gz
처럼 TAR로 묶은 뒤 gzip으로 압축하는 방식이 매우 흔하다.
실행파일 및 시스템 파일
| 확장자 | 설명 |
|---|---|
| .exe | Windows 실행파일 |
| .com | DOS 계열 실행파일 |
| .msi | Windows Installer 패키지 |
| .dll | Dynamic-Link Library |
| .sys | Windows 시스템·드라이버 파일 |
| .bat | Windows 배치 파일 |
| .cmd | Windows 명령 스크립트 |
| .ps1 | PowerShell 스크립트 |
| .vbs | VBScript |
| .lnk | Windows 바로가기 |
| .scr | Windows 화면보호기 실행파일 |
| .app | macOS 애플리케이션 번들 |
| .dmg | Apple Disk Image |
| .pkg | macOS 설치 패키지 |
| .apk | Android 애플리케이션 패키지 |
| .aab | Android App Bundle |
| .ipa | iOS 애플리케이션 패키지 |
Windows에서는 `.scr`도 화면보호기 영상 같은 파일이 아니라 실행 가능한 프로그램이라는 점에 주의해야 한다.
`.lnk` 역시 단순 문서가 아니라 다른 파일이나 명령을 실행하도록 설정할 수 있는 바로가기 파일이다.
프로그래밍 및 소스 코드
| 확장자 | 언어·형식 |
|---|---|
| .c | C |
| .cpp / .cc / .cxx | C++ |
| `.h` | C/C++ 헤더 |
| `.hpp` | C++ 헤더 |
| .cs | C Sharp |
| .java | Java |
| .py | Python |
| .rb | Ruby |
| .php | PHP |
| .js | JavaScript |
| .ts | TypeScript |
| `.jsx` | JSX |
| `.tsx` | TypeScript + JSX |
| .rs | Rust |
| .go | Go |
| .swift | Swift |
| .kt | Kotlin |
| .R / .r | R |
| `.m` | Objective-C 또는 MATLAB 등 |
| `.sh` | 셸 스크립트 |
| `.sql` | SQL |
| `.lua` | Lua |
| `.pl` | Perl |
하나의 확장자가 여러 언어에서 겹치는 경우도 있다.
대표적으로 `.m`은 Objective-C 소스 코드로도 쓰이고 MATLAB 파일로도 사용된다.
따라서 확장자만으로 파일의 정확한 의미를 항상 판단할 수 있는 것은 아니다.
웹
| 확장자 | 형식 |
|---|---|
| .html / .htm | HTML |
| .css | CSS |
| .js | JavaScript |
| .ts | TypeScript |
| .json | JSON |
| .xml | XML |
| .yaml / .yml | YAML |
| `.php` | PHP |
| `.asp` | Active Server Pages |
| `.aspx` | ASP.NET |
| `.jsp` | JavaServer Pages |
| `.wasm` | WebAssembly |
웹 서버에서는 실제 디스크 파일의 확장자가 URL에 아예 노출되지 않는 경우도 많다.
예를 들어
https://example.com/article/123
같은 주소가 내부적으로 PHP, Python, JavaScript 또는 다른 서버 프로그램에서 생성되는 페이지일 수도 있다.
데이터 및 설정 파일
| 확장자 | 설명 |
|---|---|
| .json | 구조화 데이터 |
| .xml | 마크업 기반 데이터 |
| .yaml / .yml | 설정·데이터 |
| .csv | 구분자 기반 표 데이터 |
| .tsv | 탭 구분 데이터 |
| .ini | 설정파일 |
| `.cfg` | Configuration |
| `.conf` | Configuration |
| `.properties` | Java 등의 설정파일 |
| `.env` | 환경변수 설정파일 |
| .sqlite / .db | SQLite 데이터베이스 |
| `.sql` | SQL 명령 및 데이터 덤프 |
| `.log` | 로그 파일 |
`.db`처럼 매우 일반적인 확장자는 특정 하나의 파일 형식을 의미하지 않는다.
프로그램마다 전혀 다른 데이터베이스를 `.db`라는 이름으로 저장할 수 있다.
디스크 이미지
| 확장자 | 형식 |
|---|---|
| .iso | ISO 9660 등의 광디스크 이미지 |
| .dmg | Apple Disk Image |
| .img | 일반 디스크 이미지 |
| `.vhd` | Virtual Hard Disk |
| `.vhdx` | Hyper-V Virtual Hard Disk |
| `.vmdk` | VMware Virtual Disk |
| `.qcow2` | QEMU Copy-On-Write |
글꼴
| 확장자 | 형식 |
|---|---|
| .ttf | TrueType Font |
| .otf | OpenType Font |
| .woff | Web Open Font Format |
| .woff2 | WOFF2 |
IANA에도 `font/ttf`, `font/otf`, `font/woff`, `font/woff2` 등의 공식 미디어 타입이 등록되어 있다.[11]
자막
| 확장자 | 형식 |
|---|---|
| .srt | SubRip Subtitle |
| .ass | Advanced SubStation Alpha |
| .ssa | SubStation Alpha |
| .vtt | WebVTT |
| `.smi` | SAMI |
한국에서는 과거 `.smi` 자막이 존나 흔했지만 국제적으로는 `.srt`와 `.vtt` 등이 훨씬 널리 쓰인다.
토렌트
`.torrent` 파일은 BitTorrent에서 파일 배포에 필요한 메타데이터를 저장한다.
실제 영화나 게임이 `.torrent` 안에 들어있는 게 아니다.
토렌트 클라이언트가
- 파일 목록
- 조각 정보
- 해시
- 트래커 등의 정보
를 읽어 다른 사용자에게 실제 데이터를 요청한다.
자세한 내용은 토렌트 및 BitTorrent 문서 참고.
복합 확장자
파일 이름에 확장자가 하나만 붙어야 한다는 법은 없다.
대표적으로 Unix 계열에서
- `.tar.gz`
- `.tar.bz2`
- `.tar.xz`
- `.sql.gz`
같은 복합 확장자가 널리 사용된다.
프로그래밍에서도
- `.d.ts`
- `.test.js`
- `.spec.ts`
- `.min.js`
- `.bundle.js`
같이 여러 마침표를 이용해 파일의 역할을 표현한다.
이 중 어디까지를 엄밀한 확장자로 볼 것인지는 프로그램과 문맥에 따라 달라질 수 있다.
예를 들어 `archive.tar.gz`에서 파일시스템 관점으로 단순히 마지막 점 이후만 보면 `.gz`지만 사용자 입장에서는 `.tar.gz` 전체가 파일 형식을 훨씬 정확하게 설명한다.
확장자가 없는 파일
파일에는 반드시 확장자가 있어야 하는 것은 아니다.
특히 Linux와 Unix 환경에서는 매우 흔하다.
대표적으로
README LICENSE Makefile Dockerfile bash python ssh nginx
등이 있다.
`Makefile`, `Dockerfile`처럼 오히려 확장자가 없는 특정 파일 이름 자체가 역할을 나타내기도 한다.
Unix에서는 실행 여부도 `.exe`가 아니라 파일 권한으로 제어하기 때문에 실행파일에 확장자가 없는 것이 전혀 이상하지 않다.
숨김 파일과 점
Unix 계열에서 이름 맨 앞의 점은 확장자가 아니라 숨김 파일을 의미하는 관례로 사용된다.
예를 들어
.bashrc .gitignore .env .htaccess
등이 있다.
`.bashrc`를 보고 확장자가 `bashrc`라고 생각할 수도 있지만 Unix 관례에서는 전체가 파일 이름이고 맨 앞 점은 숨김 파일 표시 역할에 가깝다.
물론 `.env.local`처럼 숨김 파일 이름 뒤에 다시 점이 들어가는 경우도 있다.
확장자를 바꿔도 변환되지 않는다
파일 관련 초보자들이 존나 많이 하는 실수.
photo.png
를
photo.jpg
로 바꿔도 JPEG가 되지 않는다.
마찬가지로
song.mp3 → song.wav movie.mkv → movie.mp4 document.docx → document.pdf ``` 처럼 이름만 바꾼다고 변환되지 않는다. 내부 데이터 구조가 전혀 다르기 때문이다. 오히려 프로그램이 확장자를 믿고 잘못된 방식으로 파일을 읽으려고 해서 파일이 안 열릴 수 있다. 파일 형식을 바꾸려면 이미지 편집기, 오디오 인코더, 영상 변환기, 문서 프로그램 등에서 실제 변환 또는 다시 저장해야 한다. == 보안 == 확장자는 보안 측면에서도 중요하다. 특히 Windows에서 확장자를 숨기는 설정은 악성 파일을 일반 문서처럼 보이게 만드는 데 악용될 수 있다. 예를 들어 실제 파일 이름이 <pre> 여행사진.jpg.exe
인데 `.exe`가 사용자에게 보이지 않는 환경이라면 얼핏
여행사진.jpg
처럼 보일 수 있다.
Microsoft는 실제 악성코드 캠페인에서도 `.png`, `.mp3`, `.mp4`, `.wav`, `.jpg` 같은 미디어 확장자로 파일을 위장하거나 `file.hta.mp4` 같은 이중 확장자를 사용하는 사례를 보고했다.[12]
따라서 출처가 불분명한
- `.exe`
- `.scr`
- `.com`
- `.bat`
- `.cmd`
- `.ps1`
- `.vbs`
- `.js`
- `.hta`
- `.msi`
- `.lnk`
같은 파일은 함부로 실행하지 않는 것이 좋다.
아이콘보다 확장자를 믿어라.
실행파일이 PDF나 폴더 아이콘을 사용하는 것은 어렵지 않다.
확장자만 믿어도 안 된다
반대 방향의 문제도 있다.
악성 프로그램이 실제 실행파일이나 스크립트를 `.jpg`, `.png` 같은 무해해 보이는 확장자로 바꿔놓을 수도 있다.
Microsoft와 CISA가 분석한 실제 공격에서도 악성 파일의 확장자를 이미지나 다른 형식으로 위장한 사례가 확인됐다.[13]
따라서 보안 프로그램은 단순히 파일 이름만 보는 것이 아니라
- 파일 시그니처
- 실제 실행 구조
- 코드 서명
- 해시
- 행위
- 내부 스크립트
등을 함께 분석한다.
대문자와 소문자
Windows에서는 일반적으로
IMAGE.JPG image.jpg Image.Jpg
를 같은 확장자로 처리한다.
반면 Linux 파일시스템에서는 파일 이름의 대소문자를 구분하는 경우가 많아서
test.txt TEST.TXT
가 서로 다른 파일로 존재할 수 있다.
다만 Linux 데스크톱의 MIME 식별 시스템은 일반적인 확장자 패턴에 대해서는 대소문자를 구분하지 않도록 설계돼 있다. 그래서 `IMAGE.GIF` 역시 GIF 이미지로 식별될 수 있다.[14]
같은 확장자, 다른 의미
확장자가 전 세계적으로 하나의 중앙기관에 의해 완전히 통제되는 것은 아니다.
그래서 같은 확장자를 서로 다른 프로그램이 사용하는 경우가 있다.
예를 들어 `.dat`는 그냥 data의 약자라 프로그램마다 내용이 완전히 다를 수 있다.
`.bin` 역시 binary라는 뜻일 뿐 특정한 단일 포맷이 아니다.
`.img`, `.raw`, `.db`, `.sav`, `.pak` 등도 마찬가지다.
따라서 이런 파일은 확장자만 보고 정확한 프로그램이나 데이터 구조를 알아내기 어렵다.
같은 형식, 여러 확장자
반대로 하나의 형식이 여러 확장자를 사용하는 경우도 있다.
대표적으로
| 형식 | 확장자 |
|---|---|
| JPEG | `.jpg`, `.jpeg`, `.jpe` |
| TIFF | `.tif`, `.tiff` |
| HTML | `.htm`, `.html` |
| YAML | `.yaml`, `.yml` |
| AIFF | `.aif`, `.aiff`, `.aifc` |
| MPEG | `.mpeg`, `.mpg` |
같은 경우다.
역사적인 운영체제 제한이나 프로그램 호환성 때문에 짧은 확장자와 긴 확장자가 동시에 살아남은 경우가 많다.
파일 연결
운영체제가 확장자와 특정 프로그램을 연결하는 것을 파일 연결(file association)이라고 한다.
예를 들어 Windows에서 `.pdf`를 Adobe Acrobat에 연결하면 PDF 파일을 더블클릭했을 때 Acrobat이 실행된다.
사용자는 기본 앱 설정을 바꿔 다른 프로그램으로 연결할 수도 있다.
따라서
확장자 = 프로그램
도 아니다.
같은 `.png`를
- Microsoft Paint
- Adobe Photoshop
- 웹 브라우저
- 이미지 뷰어
등 여러 프로그램으로 열 수 있다.
Microsoft 역시 하나의 확장자가 여러 설치 프로그램과 호환될 수 있다고 설명한다.[15]
컨테이너와 코덱
영상과 오디오 분야에서는 확장자만 보고 코덱까지 착각하기 쉽다.
예를 들어
`.mp4` = H.264
가 아니다.
MP4는 컨테이너이고 그 안에 H.264, H.265, AV1 등의 영상을 담을 수 있다.
마찬가지로
`.mkv` = 특정 영상 코덱
이 아니다.
Matroska 컨테이너 안에는 여러 종류의 영상·오디오·자막을 넣을 수 있다.
오디오에서도 `.wav`는 컨테이너이며 가장 흔하게 PCM을 담을 뿐 다른 오디오 형식을 포함할 수도 있다.
그래서 미디어 파일을 제대로 분석하려면
확장자 → 컨테이너 → 코덱
을 따로 봐야 한다.
숨겨진 내부 구조
겉보기에는 완전히 다른 확장자지만 실제로는 ZIP 컨테이너를 사용하는 형식이 상당히 많다.
대표적으로
- `.docx`
- `.xlsx`
- `.pptx`
- `.epub`
- `.jar`
- `.apk`
등이 있다.
예를 들어 `.docx` 파일의 내부는 여러 XML 파일과 리소스를 ZIP으로 묶은 구조다.
그래서 ZIP 프로그램으로 강제로 열어보면
[Content_Types].xml _rels word docProps
같은 내부 파일을 볼 수 있다.
`.apk` 역시 ZIP 기반 패키지이므로 압축 프로그램으로 내부 파일을 볼 수 있다.
물론 ZIP으로 열 수 있다고 그냥 ZIP 파일과 같은 용도로 사용하는 것은 아니다. 각 형식마다 내부 디렉터리와 메타데이터 규칙이 따로 존재한다.
이상한 확장자
프로그램이 자기들 마음대로 확장자를 만들기도 해서 세상에는 별 확장자가 다 있다.
게임에서는
- `.sav`
- `.pak`
- `.wad`
- `.bsp`
같은 확장자가 흔하며, 3D 제작에서는
- `.blend`
- `.fbx`
- `.obj`
- `.stl`
등이 사용된다.
디자인 프로그램에서는
- `.psd`
- `.ai`
- `.indd`
- `.xcf`
같은 전용 프로젝트 파일이 존재한다.
개발 환경에서는
- `.gitignore`
- `.dockerignore`
- `.lock`
- `.toml`
- `.gradle`
- `.csproj`
- `.sln`
등 일반 사용자에게는 뭔지 알 수 없는 파일이 끝도 없이 나온다.
확장자는 그냥 컴퓨터 세계의 이름표라서 새로운 프로그램과 기술이 나오면 계속 늘어난다.
주요 확장자 바로가기
문서
표·데이터
이미지
오디오
영상
압축
실행·설치
웹·개발
기타
여담
- 한국에서는 보통 그냥 확장자라고 부르지만 영어권에서는 filename extension 또는 file extension이라고 한다.
- DOS의 3글자 제한 때문에 `.jpg`, `.exe`, `.txt`, `.wav`처럼 3글자 확장자가 유난히 많다.
- 현대 운영체제에서는 확장자 길이에 3글자 제한 같은 것은 없다.
- 파일명에서 마침표 하나 보인다고 무조건 뒤가 확장자인 것도 아니다. Unix의 `.bashrc` 같은 파일은 파일명 전체가 저 형태다.
- `README`, `LICENSE`, `Makefile`, `Dockerfile`처럼 확장자가 아예 없는 유명한 파일도 많다.
- `.docx`, `.xlsx`, `.pptx`는 내부적으로 ZIP 기반 구조다.
- `.apk`와 `.epub`도 ZIP 기반이다.
- `.wav`를 `.mp3`로 이름만 바꾼다고 파일 용량이 줄어드는 일은 없다.
- `.jpg`를 `.png`로 이름만 바꿔놓고 이미지 변환했다고 하는 인간이 가끔 있는데 그냥 이름만 바꾼 거다.
- `.mp4`와 `.mkv`는 영상 압축방식 자체가 아니라 컨테이너다.
- `.txt`라고 적혀 있다고 내용이 반드시 사람이 읽을 만한 정상적인 텍스트라는 보장도 없다.
- 파일 확장자가 틀려도 프로그램이 내부 시그니처를 검사해 알아서 열어주는 경우가 있다.
- 반대로 확장자를 엄격하게 검사하는 프로그램은 실제 파일 내용이 정상이어도 확장자가 잘못돼 있으면 열기를 거부하기도 한다.
- Windows에서 확장자를 숨겨두면 `사진.jpg.exe` 같은 이중 확장자 공격을 알아보기 힘들 수 있다. 그냥 확장자 표시를 켜놓는 편이 속 편하다.
- `.exe`만 위험한 것은 아니다. `.scr`, `.bat`, `.cmd`, `.ps1`, `.vbs`, `.js`, `.hta`, `.msi`, `.lnk` 등도 실행 또는 명령 수행에 악용될 수 있다.
- 확장자를 바꾼다고 악성 프로그램이 안전해지지도 않는다.
- Linux에서는 프로그램 실행 여부를 확장자가 아니라 실행 권한이 결정하기 때문에 실행파일 이름이 그냥 `python`, `bash`, `nginx`인 경우가 흔하다.
- 파일 종류를 정말 확인하고 싶다면 확장자 하나만 보는 것보다 파일 시그니처, MIME 타입, 코덱 등의 정보를 함께 확인하는 것이 정확하다.
- IANA의 미디어 타입 등록 신청 양식에도 아예 File extension(s)와 Magic number(s)가 서로 별도의 항목으로 존재한다.[16]
같이 보기
각주
- ↑ Microsoft Support, 「Common file name extensions in Windows」
- ↑ Microsoft Support, 「Common file name extensions in Windows」
- ↑ freedesktop.org, 「Shared MIME-info Database」
- ↑ Microsoft Support, 「Common file name extensions in Windows」
- ↑ Linux man-pages, 「file(1)」
- ↑ IANA, 「Media Types」
- ↑ freedesktop.org, 「Shared MIME-info Database」
- ↑ Microsoft Support, 「Common file name extensions in Windows」
- ↑ Microsoft Support, 「Common file name extensions in Windows」
- ↑ freedesktop.org, 「Shared MIME-info Database」
- ↑ IANA, 「Media Types」
- ↑ Microsoft Security Blog, 「Think before you Click(Fix)」
- ↑ CISA, 「Threat Actors Exploit Telerik Vulnerability」
- ↑ freedesktop.org, 「Shared MIME-info Database」
- ↑ Microsoft Support, 「Common file name extensions in Windows」
- ↑ IANA, 「Application for Media Type」
```