·2분 읽기

URL 인코딩 한글 파라미터 깨짐 해결 — 실전 디버깅 5가지 패턴

URL에 한글 파라미터를 넣었더니 물음표나 %ED%9C 같은 문자로 깨지나요? 인코딩/디코딩 규칙부터 자주 만나는 5가지 깨짐 패턴과 해결법을 정리했어요.

URL 인코딩 한글 파라미터 깨짐 해결 — 실전 디버깅 5가지 패턴
🔗
URL 인코더/디코더 바로 사용하기
URL을 인코딩하거나 디코딩하세요

왜 한글 URL은 깨질까

URL 표준은 원래 ASCII만 허용해요. 한글 같은 비ASCII 문자는 **퍼센트 인코딩(UTF-8 바이트를 `%XX` 형태)**으로 변환해야 합니다. 예시: `안녕`은 UTF-8로 `0xEC 0x95 0x88 0xEB 0x85 0x95` → URL 인코딩 `%EC%95%88%EB%85%95`. 이 변환이 어딘가 빠지거나 두 번 걸리면 한글이 깨져요. 흔한 5가지 패턴을 정리했어요.

패턴 1 — 인코딩을 안 하고 붙여 넣음

가장 흔한 실수예요. `/search?q=안녕`을 그대로 fetch에 넣으면 브라우저마다 처리가 달라요. Firefox는 자동 인코딩해주지만, 백엔드가 `Content-Length`를 바이트로 파싱하면 길이 불일치로 끊깁니다. 해결: JavaScript는 `encodeURIComponent('안녕')`으로 감싸세요. Python은 `urllib.parse.quote('안녕')`.

패턴 2 — encodeURI와 encodeURIComponent 혼동

`encodeURI`는 URL 구조 문자(`/`, `?`, `=`, `&`)를 안 건드려요. 파라미터 값 안에 이런 문자가 있으면 깨집니다. 파라미터 값은 반드시 **`encodeURIComponent`**를 써요. ```js const url = `/search?q=${encodeURIComponent(query)}`; ```

패턴 3 — 이중 인코딩

서버가 자동 디코딩하는데 프론트에서 `encodeURIComponent`를 두 번 돌린 경우예요. `%` 기호 자체가 `%25`로 한 번 더 인코딩되면서 `%2595%2588` 같은 쓰레기가 나옵니다. 해결: 인코딩은 한 번만. URL 작성 시점에 1회만 걸고 그 후엔 안 건드리세요.

패턴 4 — EUC-KR과 UTF-8 혼합

옛날 사이트(네이버 일부 페이지, 공공기관 사이트)가 EUC-KR을 쓰면 같은 `안녕`이 `%BE%C8%B3%E7`으로 인코딩돼요. UTF-8로 디코드하면 깨집니다. 해결: 상대 사이트 charset을 확인하고 맞는 인코딩 사용. Python은 `urllib.parse.quote(text.encode('euc-kr'))` 같이 명시적으로 지정하세요.

패턴 5 — 웹서버 자동 디코딩 차이

Nginx와 Node.js가 URL 디코딩 방식이 다른 경우가 있어요. Nginx는 한 번 자동 디코딩해서 넘기는데, Node.js(Express)는 또 디코딩을 시도할 수 있죠. 해결: 프록시 구성에서 `proxy_pass` 옵션 확인. `proxy_set_header Host $http_host` 같은 설정으로 원본 URL 보존하는 게 안전합니다.

디버깅 체크리스트

URL이 깨지면 이 순서로 확인해요. 1. 원본 문자열이 어떤 인코딩인가 (UTF-8? EUC-KR?) 2. 인코딩 몇 번 걸렸나 (`%` 두 개 이상 연속?) 3. 브라우저 주소창에서 복사하면 정상인가 4. 서버 로그에 찍힌 원본 쿼리는 어떻게 보이나 5. 프록시 설정이 URL 변환하고 있나

실전 코드 예시

JavaScript ```js const keyword = '홍길동'; const url = `https://api.example.com/search?q=${encodeURIComponent(keyword)}`; // https://api.example.com/search?q=%ED%99%8D%EA%B8%B8%EB%8F%99 ``` Python ```python from urllib.parse import quote keyword = '홍길동' url = f'https://api.example.com/search?q={quote(keyword)}' ``` Ruby ```ruby require 'uri' URI.encode_www_form_component('홍길동') # => '%ED%99%8D%EA%B8%B8%EB%8F%99' ```

Toolkio URL Encoder 활용

Toolkio URL Encoder는 인코딩/디코딩을 양방향으로 즉시 보여줘요. 이중 인코딩 여부를 체크할 때 이게 가장 빠릅니다. 브라우저 내 처리라 민감 파라미터도 안심하고 테스트할 수 있어요.

지금 바로 URL 인코더/디코더를 사용해보세요

무료이며, 브라우저에서 바로 실행됩니다.

URL 인코더/디코더