← 전체 글

한글 파일명 자소분리로 웹 업로드가 꼬일 때: 증상 5가지와 해결법

맥에서 올린 파일이 홈페이지나 그룹웨어에서 보고서_최종.hwp가 아니라 ㅂㅗㄱㅗㅅㅓ_ㅊㅚㅈㅗㅇ.hwp처럼 보이거나, 다운로드 링크를 누르면 "파일을 찾을 수 없습니다"가 뜨거나, 분명히 있는 파일이 검색에 안 잡힌다면 거의 틀림없이 한글 파일명 자소분리 문제입니다. macOS는 한글이나 악센트 문자를 유니코드 분해형(NFD)으로 저장하는데, 대부분의 웹 서버, 게시판, 그룹웨어, 브라우저는 조합형(NFC)을 기대합니다. 해결책은 업로드 전에 파일명을 NFC로 바꾸거나, 서버가 받는 즉시 정규화하도록 만드는 것입니다. 아래에서 이 문제가 웹사이트에서 나타나는 다섯 가지 증상과 각각의 의미, 가장 빠른 해결법을 정리합니다.

한글 파일명 자소분리는 어디서 시작되나

유니코드에서 한이라는 글자는 두 가지 방식으로 적을 수 있습니다. 조합형은 코드포인트 하나(U+D55C)입니다. 분해형은 초성 ㅎ, 중성 ㅏ, 종성 ㄴ 세 개를 이어 붙인 것입니다. 화면에서는 둘 다 똑같이 보입니다. 일본어 가나의 탁점(が → か + 탁점), 프랑스어·스페인어의 악센트 문자(é → e + 결합 악센트)도 같은 원리입니다.

macOS는 예전부터 이런 이름의 파일을 저장할 때 분해형(NFD)을 만들어 왔습니다. 반면 윈도우, 리눅스 서버, PHP, Node, Python 웹 프레임워크, 그리고 결과를 그려 주는 브라우저까지 거의 모든 것이 NFC를 전제로 합니다. NFD 이름이 NFC를 전제로 한 시스템에 들어가면 시스템은 그것을 "고쳐" 주지 않습니다. 그냥 다른 문자열로 취급합니다. 뒤에 나오는 모든 증상은 이 한 가지 불일치에서 나옵니다.

파일명에 한글, 일본어, 악센트 문자가 들어 있는 사람이라면 누구나 겪을 수 있습니다. 2026년_예산안.xlsx, 졸업논문_김민준.pdf, 가족여행_제주.jpg, 거래처에서 받은 見積書.pdf, 교환학생 서류 Résumé_José.pdf 모두 해당됩니다. 반대로 report_2026.pdf처럼 영문과 숫자만 쓴 이름이라면 이 글의 내용은 해당되지 않습니다.

증상 다섯 가지와 각각의 해결법

1. 업로드하고 나니 자음·모음이 따로 놀거나 악센트가 떠 있다

보이는 모습: 게시판, 학교 LMS, 관공서 사이트, 거래처 포털의 파일 목록에 ㄱㅘㅈㅔ_ㅈㅔㅊㅜㄹ.hwp처럼 글자가 낱낱이 풀어져 보이거나, Jose´.pdf처럼 악센트가 옆에 붙어 있습니다. 다른 컴퓨터에서는 멀쩡해 보일 수도 있습니다.

원인: 사이트의 글꼴이나 렌더링 계층이 초성·중성·종성(또는 기본 글자와 결합 기호)을 한 글자로 합치는 법을 몰라서 그냥 나란히 그려 버립니다.

해결: 업로드 전에 파일명을 NFC로 바꾸고 다시 올리세요. 깨진 항목을 직접 지울 수 없는 사이트라면 관리자에게 삭제를 요청해야 합니다. 고친 파일을 올려도 기존 항목을 덮어쓰지 않고 두 번째 파일이 생기기 쉽기 때문입니다(증상 4 참고).

2. 다운로드 링크가 404 또는 "파일을 찾을 수 없습니다"

보이는 모습: 업로드는 오류 없이 끝났고 자료실 목록에도 보입니다. 그런데 링크를 누르면 404가 뜨거나 파일이 없다고 합니다.

원인: 서버는 파일을 NFD 이름으로 저장했는데, 서버가 만든 링크나 DB에 저장된 레코드는 어딘가에서 NFC로 정규화됐습니다. URL이 가리키는 이름과 디스크에 실제로 있는 파일 이름이 바이트 단위로 어긋나 있는 것입니다. 주소창에서는 둘이 똑같아 보입니다.

해결: 한 번만 넘기면 되는 상황이라면 NFC 이름으로 다시 올리세요. 자기가 운영하는 사이트에서 이런 일이 생긴다면 진짜 해결책은 서버 쪽입니다. 들어오는 모든 파일명을 저장 전에 NFC로 정규화하면 됩니다. Python은 unicodedata.normalize("NFC", name), JavaScript는 name.normalize("NFC"), PHP는 Normalizer::normalize($name, Normalizer::FORM_C)입니다. 업로드 경계에서 한 번만 처리하면 모든 사용자에게서 문제가 사라집니다.

3. 파일이 바로 눈앞에 있는데 검색이 안 된다

보이는 모습: 사이트 검색창에 예산안을 치거나 파일 목록에서 Ctrl+F를 눌러도 아무것도 안 잡힙니다. 목록에는 분명히 보입니다.

원인: 검색은 바이트열을 비교합니다. 내가 입력한 것은 NFC이고 저장된 이름은 NFD이니 서로 다르다고 판단합니다. 일부 메일 클라이언트에서 첨부파일 이름을 검색할 때도 같은 일이 벌어집니다.

해결: NFC로 바꿔 다시 올리세요. 임시방편으로는 이름 중 한글이 아닌 부분(2026 같은 숫자나 영문)으로 검색하면 어느 형태든 걸립니다.

4. "같은 이름의 파일이 이미 있습니다" 또는 똑같아 보이는 파일이 두 개

보이는 모습: 사이트가 업로드를 거부하거나, 이름이 완전히 같아 보이는 파일이 두 개 생깁니다.

원인: 하나는 NFD, 하나는 NFC입니다. 시스템 입장에서는 서로 다른 이름이라서 이름 매핑 테이블에서 충돌을 내거나, 아니면 둘 다 그냥 저장합니다.

해결: NFD 쪽을 지우고 NFC 쪽을 남기세요. 눈으로 구분이 안 되면 둘 다 내려받아 확인합니다(아래 "어느 형태인지 확인하는 법" 참고).

5. 스크립트, 일괄 가져오기, 입력 폼이 파일명을 거부한다

보이는 모습: 일괄 업로더, 파일명을 검사하는 폼, 빌드 스크립트가 "허용되지 않는 문자"라며 실패합니다. 이름에는 평범한 글자밖에 없는데도요.

원인: 정규식으로 짠 검증 규칙은 완성형 한글이나 완성된 악센트 문자는 허용하면서 결합 기호나 옛한글 자모 영역은 허용하지 않는 경우가 많습니다. 분해된 é에는 U+0301이, 분해된 한글에는 U+1100 영역의 자모가 들어 있는데, "글자만 허용" 패턴 상당수가 이를 걸러냅니다.

해결: 파일이 검증기에 닿기 전에 NFC로 정규화하세요. 검증기를 직접 관리한다면 입력을 먼저 정규화한 뒤 검증하도록 바꾸면 됩니다.

파일명이 어느 형태인지 확인하는 법

눈으로는 알 수 없습니다. 그게 바로 이 문제의 본질입니다. 믿을 만한 확인법 세 가지입니다.

  1. 맥 터미널에서: ls | xxd | head. 조합형 한은 ed 95 9c로 나오고, 분해형은 e1 84 92 e1 85 a1 e1 86 ab(ㅎ, ㅏ, ㄴ 순서)로 나옵니다.
  2. 윈도우 PowerShell에서: [int[]][char[]]"한"을 실행하면 코드포인트가 출력됩니다. 54620 하나면 조합형, 4370, 4449, 4523 세 개면 분해형입니다.
  3. 아무 브라우저의 콘솔에서: "한글".normalize("NFD") === "한글"을 입력했을 때 붙여넣은 문자열이 이미 NFD라면 true가 나옵니다.

Finder에서 이름을 손으로 다시 입력하면 NFC가 될 때도 있고 아닐 때도 있습니다. 파일 시스템과 입력 방식에 따라 달라지므로 다시 타이핑하는 것만으로는 확실한 해결책이 되지 못합니다.

업로드 전에 파일명을 한꺼번에 고치기

파일이 한두 개라면 윈도우 PC에서 이름을 다시 입력하거나 업로드 후 서버에서 바꾸는 것으로 충분합니다. 하지만 사진 80장이 든 폴더나 한 학기치 강의 자료, 거래처에 보낼 견적서 묶음이라면 그렇게 할 수 없습니다.

별도 도구 없이 할 수 있는 방법들입니다.

  • 영문·숫자만 쓴 이름을 사용한다. kim_minjun_thesis.pdf 같은 이름은 이 문제를 절대 겪지 않습니다. 공개 링크로 걸릴 파일이라면 가장 안전한 선택입니다.
  • 한 줄 스크립트로 정규화한다. macOS에는 Python이 있습니다: for f in *; do mv "$f" "$(python3 -c 'import sys,unicodedata;print(unicodedata.normalize("NFC",sys.argv[1]))' "$f")"; done. 잘 동작하지만, 엉뚱한 폴더에서 실행하면 의도하지 않은 파일까지 이름이 바뀝니다.
  • 서버에서 고친다. 사이트를 직접 운영한다면 업로드 시점에 정규화하는 것이 나뿐 아니라 앞으로의 모든 사용자를 보호합니다.

스크립트를 돌리기 부담스럽다면 FilenameFixer라는 무료 웹앱이 정확히 이 변환을 해 줍니다. 브라우저에 파일을 끌어다 놓으면 NFD에서 NFC로 한꺼번에 이름을 바꿔 주고, 처리는 서버가 아니라 내 브라우저 안에서 이뤄져 파일이 외부로 전송되지 않습니다. 텍스트를 붙여넣어 변환할 수도 있어서 파일명 하나를 빠르게 확인할 때 편리하고, 맥에서 압축한 ZIP 안의 한글 파일명을 복원하는 기능도 있습니다(200MB까지). 업로드 상황에 특화된 도구로는 Chrome 확장 프로그램이 있는데, 웹사이트에 파일을 올리는 순간 파일명을 자동으로 정규화하므로 위의 증상 1~5가 애초에 생기지 않습니다. 사이트는 한국어, 영어, 일본어, 프랑스어, 독일어, 스페인어, 베트남어로 제공됩니다.

솔직히 밝혀 둘 한계가 하나 있습니다. 어떤 방법도 이미 서버에 깨진 이름으로 올라가 있는 파일을 고쳐 주지는 못합니다. 그런 파일은 지우고 다시 올리거나, 사이트 운영자에게 디스크에서 이름을 바꿔 달라고 요청해야 합니다.

한눈에 보기

증상 나타나는 곳 해결
자음·모음 분리, 악센트 분리 파일 목록, 자료실 NFC로 바꿔 다시 업로드
다운로드 링크 404 공개 URL, 게시판·CMS 다시 업로드, 서버에서 정규화
검색이 안 됨 사이트 검색, Ctrl+F, 메일 NFC로 변경, 숫자·영문 부분으로 검색
중복 또는 "이미 있습니다" 업로드, 공유 폴더 NFD 쪽을 삭제

똑같아 보이는 두 이름이 사실은 다른 문자열일 수 있다는 것만 알면, 위의 증상은 전부 예측 가능해집니다. 파일이 맥을 떠나기 전에, 또는 서버 입구에서 NFC로 정규화하면 웹사이트는 처음부터 기대했던 대로 그 이름을 다룹니다.