블로그 글 링크를 카카오톡으로 보냈더니 한글 부분이 %ED%95%9C%EA%B8%80 같은 문자열로 바뀌어 있다. 깨진 것처럼 보이지만 실제로는 정상이다. 이게 URL 인코딩이고, 브라우저가 한글을 URL에서 쓸 수 있는 형식으로 변환한 결과다.
URL에 한글이 그대로 못 들어가는 이유
URL 표준(RFC 3986)은 영문 알파벳, 숫자, 일부 특수문자만 허용한다. 한글, 공백, &, = 같은 문자는 URL에 직접 들어갈 수 없어서 퍼센트 인코딩(%XX)으로 변환된다.
- "서울" →
%EC%84%9C%EC%9A%B8(UTF-8 기준) - 공백 →
%20 - & →
%26 - = →
%3D
브라우저 주소창에서는 한글이 그대로 보이지만, 실제 HTTP 요청에서는 인코딩된 형태로 전송된다. 복사해서 붙여넣을 때 인코딩된 버전이 나오는 건 이 때문이다.
인코딩 vs 디코딩
| 작업 | 방향 | 예시 |
|---|---|---|
| 인코딩 | 한글 → %코드 | 검색어=서울 → 검색어=%EC%84%9C%EC%9A%B8 |
| 디코딩 | %코드 → 한글 | %EC%84%9C%EC%9A%B8 → 서울 |
실무에서 인코딩이 필요한 경우
- API 파라미터 전달
- 검색어에 공백이나 특수문자가 포함되면 인코딩 없이 보내면 서버가 파라미터를 잘못 파싱한다.
- 리다이렉트 URL 생성
- redirect_url 파라미터 안에 또 다른 URL이 들어가면, 내부 URL의 &와 = 때문에 구조가 꼬인다. encodeURIComponent로 감싸야 안전하다.
- 마케팅 UTM 파라미터
- utm_campaign에 한글 캠페인명을 넣을 때 인코딩하지 않으면 트래킹이 제대로 안 되는 경우가 있다.
TIP encodeURI는 URL 전체 구조를 유지하면서 한글만 변환하고, encodeURIComponent는 /, ?, = 같은 구조 문자까지 전부 변환한다. 파라미터 값만 인코딩할 때는 encodeURIComponent를 써야 한다.
코드를 직접 작성하지 않더라도 URL 인코딩 변환기에 텍스트를 넣으면 인코딩·디코딩 결과를 바로 확인할 수 있다. 깨져 보이는 URL을 디코딩해서 원래 주소를 확인하거나, API에 보낼 파라미터를 인코딩해서 복사하는 용도로 쓸 수 있다.