URL 인코딩/디코딩
URL을 인코딩하거나 디코딩합니다.
인코딩 방식 안내
- encodeURIComponent: 쿼리 파라미터 값에 사용 (권장)
- encodeURI: 전체 URL에 사용 (/, ?, # 등 유지)
- 전체 인코딩: 모든 특수문자를 인코딩
URL 인코딩이란?
URL 인코딩(퍼센트 인코딩)은 URL에서 사용할 수 없는 문자를 안전하게 전송하기 위해 %XX 형태의 16진수 코드로 변환하는 방식입니다. URL은 ASCII 문자의 제한된 집합만 허용하기 때문에, 공백, 한글, 특수문자 등은 인코딩이 필요합니다. 예를 들어 공백은 %20, 앰퍼샌드(&)는 %26, 한글 '가'는 %EA%B0%80으로 변환됩니다. 쿼리 파라미터에 데이터를 전달하거나, 폼을 제출하거나, REST API를 호출할 때 URL 인코딩은 웹 개발의 필수 기술입니다.
Component와 URI 전체, 무엇이 다른가
이 도구의 두 모드는 어떤 문자를 건드리지 않고 남겨두느냐만 다릅니다. URI 전체 모드는 주소 하나를 통째로 넘기는 상황을 가정해 구조를 이루는 문자를 보존합니다. Component 모드는 값 하나를 인코딩하는 용도라 그 문자들까지 모두 변환합니다.
- 두 모드가 다르게 처리하는 문자 —
: / ? # [ ] @ ! $ & ' ( ) * + , ; = - URI 전체 모드 — 위 문자를 그대로 둡니다. 이미 완성된 주소의 한글이나 공백만 손보고 싶을 때 씁니다.
- Component 모드 — 위 문자를 모두
%XX로 바꿉니다. 쿼리 파라미터 값, 경로 조각, 파일명처럼 값을 넣을 때는 반드시 이쪽입니다.
판단이 서지 않으면 Component를 고르세요. 값에 &가 들어 있는데 URI 전체 모드로 인코딩하면 그 &가 살아남아 서버가 새 파라미터의 시작으로 읽습니다. 검색어에 앰퍼샌드가 포함된 순간 뒤쪽 값이 통째로 잘려 나가는 버그가 이렇게 만들어집니다.
공백이 %20이 될 때와 +가 될 때
공백을 나타내는 방식이 두 가지라 혼동이 잦습니다. 이 도구를 포함한 퍼센트 인코딩 규칙(RFC 3986)에서 공백은 %20입니다. 반면 HTML 폼이 기본으로 쓰는 application/x-www-form-urlencoded 형식에서는 공백을 +로 적습니다.
문제는 디코딩할 때 드러납니다. 퍼센트 디코딩은 +를 공백으로 되돌리지 않고 그냥 더하기 기호로 둡니다. 폼에서 넘어온 값을 이 도구로 디코딩하면 단어 사이가 +로 남아 있는 이유입니다. 그럴 때는 먼저 +를 공백으로 바꾼 뒤 디코딩하세요. 반대로 값 안에 진짜 더하기 기호가 있어야 한다면(전화번호 +82처럼) 반드시 %2B로 인코딩해야 폼 처리 과정에서 공백으로 오해받지 않습니다.
이중 인코딩 알아보기
이미 인코딩된 문자열을 한 번 더 인코딩하면 % 자체가 %25로 바뀝니다. 공백이 %20을 거쳐 %2520이 되는 식입니다. 결과물에 %25가 눈에 띄면 어딘가에서 인코딩이 두 번 적용됐다는 신호입니다. 프레임워크가 이미 처리해 주는 값을 코드에서 또 감쌀 때 흔히 발생합니다.
확인하려면 디코딩을 두 번 해보면 됩니다. 한 번 디코딩했을 때 %20이 남아 있고 두 번째에 비로소 공백이 되면 이중 인코딩이 맞습니다. 반대로 정상적인 값은 한 번에 원문으로 돌아옵니다.
자주 묻는 질문
한글 한 글자가 왜 아홉 자로 늘어나나요?
한글은 먼저 UTF-8 바이트로 바뀐 뒤 각 바이트가 %XX로 표현됩니다. UTF-8에서 한글 한 글자는 3바이트이므로 가는 %EA%B0%80이 됩니다. 길이가 늘어나는 것이 정상이며, 브라우저 주소창이 한글로 보여주더라도 실제 전송되는 값은 이 형태입니다.
도메인에 있는 한글도 이렇게 바뀌나요?
아닙니다. 도메인은 규칙이 달라 퓨니코드로 변환되며 xn--으로 시작하는 문자열이 됩니다. 이 도구는 퍼센트 인코딩만 수행하므로 도메인 부분까지 넣으면 의도와 다른 결과가 나옵니다. 주소에서 경로와 쿼리 부분만 잘라 넣으세요.
디코딩할 때 오류가 나는 이유는?
% 뒤에 16진수 두 자리가 오지 않으면 오류가 납니다. 값 안에 퍼센트 기호가 문자 그대로 들어 있는 경우(할인율 50% 같은)가 대표적이며, 이때는 %25로 인코딩되어 있어야 정상입니다. UTF-8로 해석할 수 없는 바이트 조합이 섞여 있을 때도 실패합니다.
인코딩하면 값이 안 보이게 되나요?
아닙니다. 인코딩은 암호화가 아니라 표현을 바꾸는 것뿐이며 누구나 즉시 되돌릴 수 있습니다. 비밀번호나 토큰을 URL에 담으면 브라우저 기록, 서버 접근 로그, 참조 헤더에 그대로 남습니다. 숨겨야 하는 값은 URL이 아니라 요청 본문에 담고 HTTPS로 보내야 합니다.
같이 보면 좋은 도구
- Base64 인코딩 - 텍스트를 Base64로 인코딩/디코딩
- 퍼센트 계산기 - 백분율 계산
- JWT 디코더 - JWT 토큰 해석