브라우저 주소창에 한글을 넣었더니 %ED%95%9C%EA%B8%80처럼 알 수 없는 문자열로 바뀌어 있다. 이건 깨진 게 아니라 URL 인코딩이 적용된 정상적인 상태다.
URL 인코딩이 필요한 이유
URL에는 영문, 숫자, 일부 특수문자만 직접 쓸 수 있다. 한글, 공백, 특수기호는 그대로 넣으면 서버가 제대로 해석하지 못한다. 그래서 이런 문자를 %XX 형태의 바이트 코드로 바꾸는 게 URL 인코딩(퍼센트 인코딩)이다.
- 한글 "가": UTF-8로 3바이트 →
%EA%B0%80 - 공백:
%20또는+ - & 기호:
%26(쿼리 구분자와 겹치므로 인코딩 필수)
인코딩 vs 디코딩
| 방향 | 입력 | 결과 | 용도 |
|---|---|---|---|
| 인코딩 | 한글 | %ED%95%9C%EA%B8%80 | URL에 한글 포함 시 |
| 디코딩 | %ED%95%9C%EA%B8%80 | 한글 | 인코딩된 URL 읽을 때 |
개발에서 자주 마주치는 상황
API 파라미터에 한글이 들어갈 때
검색 API에 ?query=서울맛집을 넣으면 한글 부분을 인코딩해야 서버가 정상 처리한다. JavaScript에서는 encodeURIComponent() 함수를 쓴다.
로그에서 URL을 읽어야 할 때
서버 로그에 찍힌 URL이 퍼센트 인코딩 상태라 내용을 바로 알 수 없다. 디코딩하면 원래 한글 주소가 복원된다.
TIP 인코딩/디코딩을 코드 한 줄로 할 수 있지만, 긴 URL이나 여러 개를 한꺼번에 처리할 때는 URL 인코딩 변환 도구에 붙여넣는 편이 빠르다. 입력과 결과의 바이트 크기도 같이 표시되니까 데이터 확인도 동시에 된다.
URL에 한글이 깨져 보일 때 당황할 필요 없다. 인코딩된 상태일 뿐이고, 디코딩하면 원래 텍스트가 그대로 나온다.