MIME 타입 이해하기: 확장자만 믿지 마세요
MIME 타입은 브라우저와 서버가 콘텐츠 형식을 합의하는 방식입니다. 확장자만으로 판단하면 보안 문제와 호환성 문제가 동시에 생길 수 있습니다. 특히 업로드 기능, CDN, 다운로드 응답, 정적 파일 서빙에서는 MIME 타입이 예상과 다르면 동작이 크게 달라집니다.
1) MIME 타입의 역할
- 브라우저가 파일을 어떻게 처리할지 결정
- 다운로드 vs 인라인 표시를 제어
- 파일 업로드 검증에 활용
2) 확장자만으로 부족한 이유
- 파일 확장자는 쉽게 변경 가능
- 실제 파일 시그니처와 다를 수 있음
- 보안상 우회가 가능
- 운영 중 잘못된 Content-Type 헤더가 내려갈 수 있음
3) 실무 팁
- 서버에서 Content-Type을 명시적으로 설정하세요.
- 업로드 검증 시 확장자 + 시그니처(매직 넘버)를 함께 확인하세요.
- 캐시/CDN에서 MIME이 올바르게 전달되는지 점검하세요.
- 브라우저 스니핑에 기대지 말고 헤더를 정확히 내려주세요.
4) 바로 써보기
MIME Type Finder에 확장자나 MIME 타입을 넣어 매핑을 빠르게 확인하세요.
5) 대표 매핑 예시
.png→image/png.svg→image/svg+xml.json→application/json.pdf→application/pdf
6) 보안 관련 팁
- 업로드 시 MIME만 믿지 말고 파일 시그니처를 확인하세요.
- 브라우저에 잘못된 MIME을 보내면 XSS 위험이 커집니다.
예를 들어 SVG는 이미지처럼 보이지만 스크립트를 포함할 수 있어 취급이 민감합니다. 단순히 .svg 확장자라고 해서 무조건 안전한 이미지로 보면 안 됩니다. 다운로드로 처리할지, 인라인 렌더링을 허용할지 서비스 정책을 먼저 정해야 합니다.
7) 자주 발생하는 문제
정적 파일은 로컬에서 잘 보이는데 CDN을 거치면 다운로드로 떨어지는 경우가 있습니다. 이때는 파일 자체보다 CDN이나 스토리지 메타데이터의 Content-Type이 잘못된 경우가 많습니다. 반대로 API에서 JSON을 내려주면서 text/plain을 보내면 일부 클라이언트나 보안 장비가 예상과 다르게 처리할 수 있습니다.
8) 체크리스트
- 서버에서 Content-Type을 명시하는가?
- 업로드 검증에 확장자+시그니처를 사용하는가?
- CDN/캐시가 MIME을 변경하지 않는가?
- 다운로드와 인라인 표시 정책이 명확한가?
9) 추가 예시
text/csv는 스프레드시트로 다운로드될 때 유용합니다.application/octet-stream은 다운로드 강제에 사용됩니다.text/html을 잘못 내리면 브라우저가 문서로 해석합니다.