URL 인코딩 · 디코딩

URL에 넣을 문자를 인코딩하거나 원문으로 되돌리세요. 주소 전체와 값 하나에 맞는 변환 방식을 선택할 수 있습니다.

인코딩 방식

입력값은 브라우저에서만 처리되며 서버로 전송되지 않습니다.

빠른 사용법

  1. URL 전체인지 값 하나인지 구분하세요.
  2. 입력 후 변환 방식을 선택하세요.
  3. 결과를 사용할 시스템과 형식을 맞추세요.

모드별 예시

목적입력인코딩 결과
컴포넌트a&b=ca%26b%3Dc
전체 URLhttps://example.com/?q=a bhttps://example.com/?q=a%20b

전체 URL과 쿼리 값을 구분하세요

컴포넌트 인코딩은 &, =, / 같은 구분 문자도 변환합니다. 전체 URL에 적용하면 주소 구조 자체가 바뀔 수 있습니다. 전체 URL 모드는 구분 문자를 보존하지만 실제 쿼리 값 안에 포함된 &까지 구분해 주지는 않습니다.

디코딩의 범위

이 도구의 디코딩은 decodeURIComponent를 사용합니다. 폼 인코딩의 +를 공백으로 자동 변환하지 않습니다. a+b를 넣으면 +가 유지되고 %20은 공백이 됩니다.

이미 인코딩한 값을 다시 인코딩하면 %가 %25로 바뀝니다. 디코딩은 문자열 표현을 복원하는 기능이며 HTML·SQL·명령어의 안전성을 검증하거나 무해하게 만드는 기능은 아닙니다.

한글이 %로 길어지는 이유

퍼센트 인코딩은 문자를 UTF-8 바이트로 바꾼 뒤 바이트마다 %와 16진수 두 자리를 붙입니다. 한글 한 글자는 UTF-8에서 3바이트라 인코딩하면 9자가 됩니다.

입력UTF-8 바이트인코딩 결과
한ED 95 9C%ED%95%9C
한글ED 95 9C EA B8 80%ED%95%9C%EA%B8%80
a b61 20 62a%20b

공백이 %20이 되기도 하고 +가 되기도 하는 이유

HTML 폼 전송 형식(application/x-www-form-urlencoded)은 공백을 +로 바꾸고, 일반 URL 인코딩 함수는 %20을 씁니다. 같은 값이라도 어느 함수를 썼는지에 따라 결과가 다르므로, 받는 서버가 어느 형식으로 해석하는지 확인하세요.

코드와 결과 · JavaScript · Python 3
encodeURIComponent('a b')                  // a%20b
new URLSearchParams({q: 'a b'}).toString() // q=a+b

urllib.parse.quote('a b')                  # a%20b
urllib.parse.quote_plus('a b')             # a+b

이중 인코딩 찾기

로그나 주소에 %2520처럼 %25 뒤에 다시 16진수가 이어지면 이중 인코딩을 의심하세요. 이 도구로 한 번 디코딩했는데 %20 같은 인코딩 문자열이 다시 나오면 두 번 인코딩된 값입니다. 프록시, 프레임워크, 직접 작성한 코드 중 어느 단계에서 인코딩을 한 번 더 하는지 순서대로 확인합니다.

자주 묻는 질문

한글이 % 문자로 길게 바뀝니다.
UTF-8 바이트를 퍼센트 인코딩한 정상 표현일 수 있습니다. 길이만으로 오류라고 판단하지 마세요.

공식 참고 자료

관련 도구