개발 가이드

URL 퍼센트 인코딩, 왜 필요하고 어떻게 작동할까

주소에 한글·공백·특수문자를 넣으면 왜 %20 같은 코드로 바뀌는지, 퍼센트 인코딩의 원리와 전체 URL을 통째로 인코딩하면 안 되는 이유를 예시로 정리했습니다.

검색 결과 주소를 복사했더니 %EA%B2%80%EC%83%89 같은 알 수 없는 문자가 잔뜩 붙어 있던 경험이 있을 것입니다. 이것이 퍼센트 인코딩입니다. 왜 이런 변환이 필요하고 어떻게 작동하는지 이해하면, 주소가 깨지거나 값이 잘못 전달되는 문제를 피할 수 있습니다.

왜 인코딩이 필요한가

URL에는 쓸 수 있는 문자가 정해져 있습니다. 영문자, 숫자, 그리고 일부 기호(-, _, ., ~ 등)만 그대로 쓸 수 있습니다. 문제는 주소에 한글이나 공백, 그리고 ?, &, = 같은 특수문자를 넣어야 할 때입니다.

이런 특수문자 중 일부는 URL에서 이미 특별한 역할을 맡고 있습니다. ?는 쿼리의 시작, &는 매개변수 구분, =는 키와 값의 연결을 뜻합니다. 그래서 이런 기호를 데이터로 넣으려면 구조를 나타내는 기호와 구분해 줘야 합니다. 또 공백이나 한글처럼 URL이 허용하지 않는 문자도 안전한 형태로 바꿔야 합니다. 이 변환이 퍼센트 인코딩입니다.

어떻게 작동하나

퍼센트 인코딩은 문자를 그 문자의 바이트 값으로 바꾸고, 앞에 퍼센트 기호(%)를 붙입니다. 예를 들어 공백은 %20으로 바뀝니다. 한글은 UTF-8 기준으로 여러 바이트를 차지하므로, 한 글자가 %EA%B2%80처럼 여러 개의 퍼센트 코드로 표현됩니다.

이렇게 변환하면 어떤 문자든 URL에 안전하게 담을 수 있고, 받는 쪽은 반대로 디코딩해서 원래 문자를 복원합니다. URL 인코더·디코더는 문자열을 이 방식으로 인코딩하거나, 인코딩된 값을 원문으로 디코딩해 확인할 수 있습니다.

전체 URL을 통째로 인코딩하면 안 되는 이유

여기서 중요한 함정이 있습니다. 인코딩은 주소 전체가 아니라 값 하나에 적용해야 합니다.

전체 URL을 통째로 인코딩하면, 구조를 나타내는 :(프로토콜)와 /(경로 구분)까지 %3A, %2F로 바뀌어 주소가 깨집니다. 예를 들어 검색어 '업무 도구'를 쿼리에 넣고 싶다면, 이 검색어 부분만 인코딩해서 ?q=%EC%97%85%EB%AC%B4%20%EB%8F%84%EA%B5%AC처럼 만들어야 합니다. 주소의 나머지 골격은 그대로 두어야 합니다.

그래서 이 도구는 전체 주소가 아니라 쿼리 값이나 경로 조각 하나를 다룰 때 적합합니다. 구성 요소 단위로 인코딩하는 방식(encodeURIComponent)을 사용하기 때문에, 값 하나를 넣어 변환하는 것을 권장합니다.

자주 하는 실수

이중 인코딩. 이미 인코딩된 값을 다시 인코딩하면 %가 또 변환되어(%%25로) 원문으로 되돌릴 수 없게 꼬입니다. 넣는 값이 원문인지 이미 인코딩된 값인지 확인하세요.

공백과 + 기호. 웹 폼 데이터에서는 공백을 +로 바꾸는 별도 규칙이 쓰이기도 합니다. 이는 퍼센트 인코딩(%20)과 다른 방식이므로, 어떤 규칙이 적용되는 환경인지 알아야 합니다.

한글이 깨지는 문제. 인코딩과 디코딩의 문자 기준(UTF-8 등)이 맞지 않으면 한글이 깨집니다. 최신 환경은 대부분 UTF-8을 쓰므로 이 도구도 UTF-8 기준으로 처리합니다.

자주 묻는 질문

Q. %20은 무슨 뜻인가요? 공백 문자의 퍼센트 인코딩 표현입니다. 주소에서 공백은 그대로 쓸 수 없어 %20으로 바뀝니다.

Q. 전체 URL을 넣어도 되나요? 가능하지만 이 도구는 입력 전체를 구성 요소 방식으로 변환하므로 콜론·슬래시까지 인코딩됩니다. 값 하나만 넣는 것을 권장합니다.

Q. 이미 인코딩된 값을 또 넣으면요? 이중으로 변환되어 꼬입니다. 원문인지 확인하고 사용하세요.

Q. 한글도 되나요? 네. UTF-8 기준의 퍼센트 인코딩으로 안전하게 변환·복원됩니다.


인코딩·디코딩의 문자 기준이 다른 환경에서는 결과가 깨질 수 있으니 사용하는 시스템의 기준을 확인하세요.