MiServe DevTools

내 스티커

도구를 여기에 고정하세요. 이 브라우저에 저장됩니다.

URL 인코더·디코더·파서

값 하나, URL 전체 또는 폼 데이터를 퍼센트 인코딩하거나 디코딩하고, URL을 구성 요소와 쿼리 파라미터로 나눠 보여 줍니다.

브라우저에서 실행됩니다. 붙여 넣은 내용은 업로드되지 않습니다.

이 도구에 대하여

퍼센트 인코딩이란

URL에는 제한된 ASCII 문자만 쓸 수 있으며, 그중 일부에는 맡은 역할이 있습니다. ?는 쿼리를 시작하고, &는 파라미터를 구분하며, #는 프래그먼트를 시작합니다. 그 밖의 문자와, 일반 데이터로 쓰인 예약 문자는 바이트마다 퍼센트 기호 뒤에 16진수 두 자리를 붙여 표기합니다. 공백은 %20이 되고, UTF-8에서 2바이트인 é는 %C3%A9가 됩니다. 규칙은 RFC 3986에 정의되어 있습니다.

디코딩은 이 과정을 거꾸로 합니다. 퍼센트 기호 뒤에 16진수 두 자리가 오지 않거나, 이스케이프된 바이트가 유효한 UTF-8이 아니면 실패하며, 이때 도구는 해당 시퀀스와 위치를 알려 줍니다.

어떤 모드를 써야 하나

컴포넌트는 URL의 한 조각에 알맞습니다. 쿼리 값 하나, 경로 세그먼트 하나, 파라미터로 전달하는 리다이렉트 URL 같은 경우입니다. /, ?, &, =를 이스케이프하므로 값이 URL 구조로 오인되지 않습니다.

URL 전체는 공백과 비ASCII 문자만 고치면 되는 완전한 주소에 사용합니다. 구조를 이루는 문자는 건드리지 않으므로, 그런 문자가 들어 있는 값은 보호하지 못합니다. %도 이스케이프하기 때문에 이미 인코딩된 URL에 사용하면 이중으로 인코딩되며, 호스트의 IPv6 주소를 감싼 대괄호도 이스케이프합니다. 디코딩할 때 이 모드는 %2F, %26처럼 구조를 이루는 문자의 이스케이프를 그대로 둡니다.

폼은 브라우저가 HTML 폼을 쿼리 문자열이나 요청 본문으로 전송할 때 쓰는 application/x-www-form-urlencoded 형식으로, 공백을 +로 씁니다. 디코딩할 때 +를 공백으로 읽는 것은 이 모드뿐입니다.

URL을 파싱하는 방식

입력이 절대 URL이면 입력을, 그렇지 않고 출력이 절대 URL이면 출력을 브라우저 자체의 URL 파서로 읽습니다. 링크와 fetch를 처리하는 바로 그 파서입니다. 표에는 스킴, 자격 증명, 호스트, 포트, 경로, 프래그먼트와 함께, 키와 값을 디코딩한 모든 쿼리 파라미터가 표시됩니다. 파서는 읽은 내용을 정규화합니다. 예를 들어 웹 URL에서는 스킴과 호스트를 소문자로 바꾸고, 경로의 .와 .. 세그먼트를 해석하며, 공백 같은 문자를 퍼센트 인코딩하므로, 각 구성 요소가 입력한 내용과 조금 다를 수 있습니다. http나 https URL의 국제화 도메인 이름은 파서가 저장하는 대로 ASCII(Punycode) 형태로 표시됩니다.

URL에 포트가 명시되지 않았고 도구가 해당 스킴의 기본 포트를 알고 있으면, 그 기본값을 표시합니다. 예를 들어 https는 443입니다.

자주 묻는 질문

encodeURI와 encodeURIComponent의 차이는 무엇인가요?

encodeURI는 URL 전체를 위한 함수로, : / ? # & = 같은 문자를 건드리지 않습니다. encodeURIComponent는 URL 안의 값 하나를 위한 함수로, 이런 문자도 이스케이프합니다. 쿼리 값에는 encodeURIComponent를 사용하세요. 그렇지 않으면 값 안의 &나 =가 쿼리 문자열을 깨뜨립니다.

공백은 %20으로 인코딩해야 하나요, +로 해야 하나요?

%20은 URL 어디에서나 유효합니다. + 기호가 공백을 뜻하는 것은 application/x-www-form-urlencoded 데이터 안에서뿐입니다. 이 형식은 HTML 폼이 쿼리 문자열이나 요청 본문으로 필드를 보낼 때 씁니다. 경로에서 +는 그냥 더하기 기호입니다.

퍼센트 기호가 들어 있는 값을 디코딩하면 왜 오류가 나나요?

퍼센트 기호는 항상 이스케이프의 시작이므로, 퍼센트 기호 자체는 %25로 써야 합니다. “100% free” 같은 텍스트는 퍼센트 기호 뒤에 16진수 두 자리가 오지 않으므로 올바른 퍼센트 인코딩 입력이 아닙니다.

붙여 넣은 URL이 서버로 전송되나요?

아니요. 인코딩, 디코딩, 파싱은 모두 브라우저 탭의 JavaScript가 처리합니다. 이 도구는 입력한 내용으로 네트워크 요청을 보내지 않습니다.

인코딩의 다른 도구