URL 디코딩
%E2%9C%93을 다시 ✓로 바꿉니다. 이중 인코딩된 문자열, 폼 인코딩, 절반쯤 깨진 입력도 거부하지 않고 모두 처리합니다. 아무것도 저장하지 않습니다.
- 저장되지 않음
- 대기열 없음, 기다림 없음
- 회원가입 없음, 워터마크 없음
여기에 디코딩 결과 내용이 표시돼요.
사용 방법
인코딩된 텍스트 붙여넣기
URL 전체, 쿼리 문자열, 또는 값 하나만 넣어도 됩니다.
필요하면 방식 선택
표준 디코딩, 또는 +를 공백으로 보는 폼 디코딩입니다. 잘 모르겠다면 두 결과가 다를 때 페이지가 알려 드립니다.
결과 복사
텍스트가 두 번 인코딩되었다면 한 번 더 디코딩하세요. 흔한 일이고, 한 번 보면 쉽게 알아챌 수 있습니다.
어떤 도구도 대신 풀어 줄 수 없는 모호함
디코딩 자체는 기계적으로 간단합니다. % 뒤에 16진수 두 자리가 오는 부분을 찾아 바이트로 되돌린 다음, 그 바이트를 UTF-8로 읽으면 됩니다. 진짜 모호한 부분은 딱 하나입니다. 더하기 기호는 공백일 수도, 더하기 기호일 수도 있습니다. 제출된 폼에서는 웹의 URL 명세보다도 오래된 관례에 따라 공백을 뜻합니다. 경로 구간에서는 문자 그대로의 문자입니다. 텍스트 자체에는 어느 쪽인지 알려 주는 정보가 없으므로, 이 페이지는 하나를 골라 조용히 틀리는 대신 두 가지 해석을 모두 보여 드립니다. 더하기가 실제 데이터인 이메일 주소나 base64 값처럼 가장 치명적인 경우에 특히 중요합니다.
ASCII가 아닌 텍스트는 한 글자가 여러 개의 퍼센트 시퀀스로 들어옵니다. 인코딩이 글자가 아니라 UTF-8 바이트 단위로 이루어지기 때문입니다. 악센트가 붙은 글자는 2개, 대부분의 기호는 3개, 이모지는 4개입니다. 올바른 UTF-8이 아닌 시퀀스를 디코딩하면 대체 문자가 나오는데, 보통 다른 문자 집합으로 인코딩된 텍스트이거나 글자 중간에서 잘린 텍스트라는 신호입니다.
두 번 디코딩하는 것은 단순한 실수가 아니라 보안 버그입니다. 값을 디코딩하고 검사한 뒤 다시 디코딩하면, 공격자는 검사를 피해 문자를 숨길 수 있습니다. %252e%252e%252f는 한 번 디코딩해도 여전히 %2e%2e%2f이므로 "../"를 찾는 필터를 통과하고, 두 번째 디코딩 후에야 필터가 막으려던 경로 이동 문자열이 됩니다. 정확히 한 번 디코딩한 다음 검증하고, 절대 순서를 바꾸지 마세요.
인코딩된 적이 없는 텍스트는 망가지지 않고 그대로 돌아옵니다. 문자열을 디코딩해야 하는지조차 확실하지 않을 때 유용한 동작입니다. 뒤에 16진수 두 자리가 없는 퍼센트 기호는 오류로 처리하지 않고 그대로 둡니다. 인코딩이 아니라 붙여 넣은 텍스트에 흔한, 문자 그대로의 퍼센트이기 때문입니다.
다른 작업이 필요할 때
코드에서는 디코더가 인코더와 짝이 맞아야 합니다. JavaScript에는 decodeURIComponent가 있고, Python은 바로 이 더하기 기호 문제 때문에 unquote와 unquote_plus를 구분하며, PHP에도 같은 이유로 rawurldecode와 urldecode가 있습니다. 더 좋은 방법은 URL 타입이나 쿼리 문자열 파서에 맡기는 것입니다. 대부분의 프레임워크는 매개변수를 알아서 디코딩하며, 그 뒤에 한 번 더 디코딩하는 것이 바로 위에서 말한 이중 디코딩 버그가 생기는 과정입니다.
값 하나를 디코딩하는 게 아니라 긴 URL을 살펴보려는 경우에는 디코더보다 파서가 낫습니다. python -c "import urllib.parse,sys; print(urllib.parse.urlparse(sys.argv[1]))"는 주소를 구성 요소별로 나눠 주므로, 무엇이든 디코딩하기 전에 어느 부분이 무엇인지 확인할 수 있습니다. 링크가 제대로 작동하지 않을 때 실제로 궁금한 것은 대개 그것입니다.
자주 묻는 질문
디코딩 후에도 텍스트에 %25가 남아 있어요
두 번 인코딩된 것으로, 아주 흔한 일입니다. 이미 인코딩된 값이 리디렉션이나 로깅 계층을 거치면서 다시 인코딩될 때마다 생깁니다. %25는 % 문자 자체를 인코딩한 것이라서, 첫 번째 디코딩은 %2520을 %20으로 바꾸고 두 번째 디코딩에서 공백이 됩니다. 한 번 더 디코딩하면 됩니다. 이런 패턴이 보이면 페이지가 알려 드립니다.
"+"는 공백이 되어야 하나요?
문자열이 어디서 왔는지에 따라 다르며, 그래서 추측이 아니라 선택으로 제공합니다. application/x-www-form-urlencoded 본문, 즉 제출된 HTML 폼에서는 +가 공백입니다. 경로 구간이나 단지 URL을 통해 전달된 데이터에서는 +가 문자 그대로의 더하기이며, 공백으로 바꾸면 값이 손상됩니다. 특히 문제가 되는 것은 Base64 문자열입니다. 실제 + 문자가 들어 있어서 폼 디코딩하면 값이 망가집니다.
깨진 문자열은 어떻게 처리되나요?
전부 거부하지 않고, 디코딩할 수 있는 부분은 디코딩하고 나머지는 그대로 둡니다. 올바른 이스케이프에 속하지 않는 % 하나만 있어도(이미 일부 디코딩되었거나 잘린 텍스트에 흔합니다) 브라우저 자체 디코더는 오류를 내고 아무것도 돌려주지 않습니다. 여기서는 올바른 이스케이프는 모두 디코딩하고 어긋난 문자는 그대로 두므로, 깨진 로그 한 줄을 읽으려 할 때 훨씬 유용합니다.
제 텍스트가 어딘가에 저장되나요?
아니요. 아무것도 저장하지 않으며 어떤 요청도 보내지 않습니다. 페이지가 로드된 뒤 인터넷 연결을 끊어도 계속 작동합니다.
URL 전체를 한 번에 디코딩할 수 있나요?
네. 전체를 붙여 넣으세요. 구조는 읽기 쉽게 유지되고 인코딩된 부분만 텍스트로 되돌아가므로, 인코딩된 매개변수가 여러 개 있는 긴 URL도 실제로 읽을 수 있는 형태가 됩니다.
참고: 더하기 기호(+)는 뜻이 모호합니다. 쿼리 문자열에서는 공백을, 경로에서는 문자 그대로의 더하기를 뜻합니다. 이 페이지는 추측하지 않고 두 방식으로 모두 디코딩해 어느 쪽이 어떤 결과인지 보여 드립니다. 퍼센트 인코딩된 적이 없는 텍스트는 망가뜨리지 않고 그대로 돌려드립니다.
내 웹사이트에 이 도구 넣기
블로그, 수업 페이지, 도움말 글 어디에나 무료로 넣을 수 있습니다. 코드 한 줄만 붙여 넣으면 방문자가 페이지에서 바로 사용할 수 있습니다.