본문으로 바로가기

URL 인코더 · 디코더

URL과 쿼리 문자열을 퍼센트 인코딩하거나 디코딩합니다. 값 하나(encodeURIComponent)와 전체 URL(encodeURI) 방식을 골라 쓰고, 완전한 URL을 프로토콜·호스트·경로·쿼리 파라미터로 나눠 볼 수 있습니다.

방향
0자 · 0줄
인코딩 방식
encodeURIComponent는 /, ?, &, # 같은 URL 구분자까지 전부 이스케이프해서 쿼리 파라미터 값 하나를 인코딩할 때 씁니다. encodeURI는 이 구분자들은 그대로 두고 나머지만 이스케이프해서 완전한 URL 자체를 다룰 때 씁니다. 예: "a b/c?d" → 값 하나는 "a%20b%2Fc%3Fd", 전체 URL은 "a%20b/c?d".

0자 · 0줄

URL 구조 분석

URL 구조 분석

전체 URL을 입력하면 프로토콜·호스트·경로·쿼리 파라미터로 나눠 보여줍니다.

https://example.com/path?query=1&lang=ko

입력한 내용은 이 브라우저 안에서만 처리되며 서버로 전송되지 않습니다. 어떻게 동작하나요?

hello world의 공백을 %20으로 인코딩하고 다시 되돌리는 URL 변환

사용 방법

이 페이지에는 도구가 둘 있습니다. 위쪽은 문자열을 인코딩하거나 디코딩하고, 아래쪽 “URL 구조 분석”은 완전한 URL 하나를 부분별로 나눠 보여 줍니다. 둘은 서로 영향을 주지 않습니다.

위쪽은 “방향”에서 “인코딩”이나 “디코딩”을 고른 뒤 두 가지를 정합니다.

  • 인코딩 방식: “값 하나”는 쿼리 파라미터의 값처럼 URL에 끼워 넣을 조각에, “전체 URL”은 이미 주소 모양을 갖춘 문자열에 씁니다. 차이는 다음 항목에서 설명합니다.
  • + 를 공백으로 (application/x-www-form-urlencoded): HTML 폼이 보내는 데이터를 다룰 때만 켭니다.

인코딩에서는 “원문”에 넣은 글이 “인코딩 결과”로, 디코딩에서는 “인코딩된 문자열”이 “디코딩 결과”로 나옵니다. €를 인코딩하면 %E2%82%AC입니다. 이 글자는 UTF-8로 3바이트여서 %XX 세 개가 됩니다. “결과를 디코딩 입력으로”, “결과를 인코딩 입력으로”는 방금 나온 결과를 반대 방향의 입력으로 옮깁니다.

“값 하나”와 “전체 URL”은 남겨 두는 글자가 다릅니다

두 방식 모두 URL에 그대로 쓸 수 없는 글자를 %와 16진수 두 자리로 바꿉니다(퍼센트 인코딩). 다른 점은 /, ?, &처럼 URL의 구조를 나누는 글자를 어떻게 다루느냐입니다. “값 하나”는 자바스크립트의 encodeURIComponent, “전체 URL”은 encodeURI와 같은 결과를 냅니다.

인코딩 방식 바꾸지 않고 남기는 글자
값 하나 영문자, 숫자, - _ . ! ~ * ' ( )
전체 URL 위 글자 전부와 ; / ? : @ & = + $ , #

같은 입력 https://example.com/café?q=crème brûlée&page=1#menü를 두 방식으로 인코딩하면 이렇게 갈립니다.

  • 전체 URL: https://example.com/caf%C3%A9?q=cr%C3%A8me%20br%C3%BBl%C3%A9e&page=1#men%C3%BC
  • 값 하나: https%3A%2F%2Fexample.com%2Fcaf%C3%A9%3Fq%3Dcr%C3%A8me%20br%C3%BBl%C3%A9e%26page%3D1%23men%C3%BC

첫째는 주소로 바로 쓸 수 있고, 둘째는 주소로는 못 쓰지만 다른 URL의 파라미터 값(?redirect=...)으로 통째로 넣을 수 있습니다. 반대로 검색어 a/b&c를 쿼리 값으로 넣을 때 “전체 URL”을 쓰면 &가 그대로 남아 다음 파라미터의 시작으로 읽힙니다. 이때는 “값 하나”로 a%2Fb%26c를 만들어야 합니다.

디코딩에서도 같은 차이가 있습니다. “전체 URL”로 디코딩하면 구조를 나누는 글자의 인코딩은 풀지 않습니다. a%2Fb%3Fc%26d%23e%20f를 넣으면 “값 하나”는 a/b?c&d#e f를, “전체 URL”은 a%2Fb%3Fc%26d%23e f를 돌려줍니다. 디코딩했는데 %2F나 %26이 남아 있다면 인코딩 방식을 “값 하나”로 바꿔 보세요.

“값 하나”로도 ! ' ( ) *는 바뀌지 않는다는 점은 기억해 둘 만합니다. 이 글자까지 인코딩하기를 요구하는 서버에 보낼 값이라면 결과에서 직접 %21, %27, %28, %29, %2A로 바꿔야 합니다.

+ 를 공백으로

HTML <form>이 보내는 데이터(application/x-www-form-urlencoded)는 공백을 %20이 아니라 +로 적습니다. 이 형식을 만들거나 읽을 때 “+ 를 공백으로”를 켭니다.

방향 입력 옵션 끔 옵션 켬
인코딩 (값 하나) a+b c a%2Bb%20c a%2Bb+c
인코딩 (전체 URL) a+b c a+b%20c a%2Bb+c
디코딩 (값 하나) a+b%2Bc a+b+c a b+c

옵션을 켜면 원문에 있던 +는 공백과 헷갈리지 않도록 %2B가 됩니다. “전체 URL” 방식은 평소에는 +를 그대로 두지만 이 옵션을 켰을 때는 똑같이 %2B로 바꿉니다. 옵션을 끈 디코딩에서 +는 그냥 +입니다. 검색 결과 주소에서 복사한 q=crème+brûlée 같은 값을 디코딩했는데 +가 남아 있다면 이 옵션을 켜야 하는 경우입니다. URL 경로나 파일 이름에서는 +가 공백을 뜻하지 않으므로 꺼 두세요.

URL 구조 분석이 보여 주는 값

“전체 URL” 칸에 https://처럼 프로토콜로 시작하는 완전한 URL을 넣으면 “프로토콜”, “호스트”, “경로”가 나오고, 있을 때만 “쿼리 문자열”과 “해시”가 더해집니다. 그 아래 표에는 쿼리 파라미터가 “키”와 “값 (디코딩됨)“으로 한 줄씩 나옵니다. example.com/path처럼 프로토콜이 없으면 “프로토콜(https:// 등)을 포함한 완전한 URL이 아닙니다.“라고 나옵니다.

보여 주는 값은 입력한 글자 그대로가 아니라 브라우저가 URL을 해석해 정리한 값입니다. https://Example.COM:443/a/../b/café?q=hello%20world&tag=a&tag=b&x=1+2#top을 넣으면 다음과 같습니다.

항목 표시되는 값 입력과 달라진 점
프로토콜 https
호스트 example.com 소문자로 바뀌고, https의 기본 포트 443은 빠집니다
경로 /b/caf%C3%A9 /a/..이 정리되고 é는 인코딩된 모습으로 나옵니다
쿼리 문자열 ?q=hello%20world&tag=a&tag=b&x=1+2 입력 그대로
해시 #top

표에는 q = hello world, tag = a, tag = b, x = 1 2 네 줄이 나옵니다. 같은 키가 여러 번 나오면 줄도 여러 개입니다. x의 값에서 보듯 이 표는 위쪽의 “+ 를 공백으로” 체크박스와 상관없이 +를 항상 공백으로 읽습니다. 쿼리 문자열은 폼 데이터 형식으로 해석하는 것이 URL 표준의 규칙이기 때문입니다.

두 가지를 더 알아 두세요. ASCII가 아닌 글자가 들어간 도메인은 “호스트”에 퓨니코드로 나옵니다(https://café.example/ → xn--caf-dma.example). 그리고 http://user:pw@host:8080/p처럼 주소에 아이디와 비밀번호가 들어 있으면 그 부분은 어느 항목에도 표시되지 않고 “호스트”에는 host:8080만 나옵니다.

디코딩이 실패하는 입력

디코딩은 % 뒤에 16진수 두 자리가 오고, 그렇게 모인 바이트가 UTF-8 글자를 이룰 때만 성공합니다. 하나라도 어긋나면 결과 없이 “퍼센트(%) 인코딩이 올바르지 않습니다.“로 시작하는 안내가 나옵니다.

입력 실패하는 이유
100% % 뒤에 아무것도 없습니다. 퍼센트 기호 자체는 %25로 적어야 합니다
%zz zz는 16진수가 아닙니다
%E2%82 3바이트짜리 글자 €(%E2%82%AC)에서 마지막 바이트가 빠졌습니다. 긴 주소를 중간에서 잘라 복사했을 때 생깁니다

인코딩 쪽은 실패하지 않습니다. 반쪽만 남은 이모지처럼 그 자체로 글자가 되지 못하는 입력도 오류 대신 대체 문자(%EF%BF%BD)로 인코딩합니다.

참고 자료

자주 묻는 질문

이미 인코딩된 문자열을 한 번 더 인코딩하면 어떻게 되나요?

%가 다시 %25로 바뀌어 이중 인코딩이 됩니다. %20을 값 하나 방식으로 인코딩하면 %2520이 나오고, 이것을 한 번 디코딩하면 공백이 아니라 %20이 나옵니다. 주소에 %25가 여러 번 보이거나 디코딩 결과에 %XX가 그대로 남아 있다면 어딘가에서 두 번 인코딩한 것입니다. 원문이 나올 때까지 디코딩을 반복하면 되고, 결과를 디코딩 입력으로 옮기는 버튼으로 이어서 할 수 있습니다.

오래된 사이트 주소에 있는 caf%E9 같은 문자열이 디코딩되지 않습니다.

그 주소가 UTF-8이 아닌 문자 인코딩으로 만들어졌기 때문입니다. 이 도구는 %XX로 적힌 바이트를 UTF-8로만 해석하고, UTF-8로 맞지 않는 바이트 조합은 퍼센트 인코딩이 올바르지 않다는 오류로 처리합니다. %u00e9처럼 %u로 시작하는 옛 표기도 같은 오류가 납니다. 이런 문자열은 이 도구로 되돌릴 수 없습니다.

퍼센트 인코딩이 깨진 URL을 URL 구조 분석에 넣으면 오류가 나나요?

나지 않습니다. 위쪽의 디코딩은 잘못된 %가 하나라도 있으면 전체를 오류로 처리하지만, URL 구조 분석은 읽을 수 있는 데까지 읽습니다. https://example.com/?q=%zz&r=%E2%82 를 넣으면 q의 값은 %zz 그대로, r의 값은 깨진 글자를 뜻하는 기호(�)로 표시됩니다. UTF-8로 해석할 수 없는 바이트가 있으면 이 기호로 표시될 수 있습니다. 일부가 잘렸거나 다른 문자 인코딩으로 작성됐는지 확인하세요. 원문에 이 기호 자체가 들어 있을 수도 있어 표시만으로 원인을 단정할 수는 없습니다.

최종 수정일: