쿼리스트링 만들기 · 풀기 (URL 파라미터 분해와 조립)

로그에 찍힌 긴 주소에서 어떤 값이 넘어갔는지 확인하거나, 파라미터 몇 개를 바꿔 테스트 주소를 다시 만들 때 쓰는 도구입니다. 퍼센트 인코딩된 한글을 눈으로 읽을 수 있게 풀고, 같은 키가 두 번 들어갔는지, 값이 비어 있는지처럼 눈으로는 잘 안 보이는 것들을 따로 짚어 줍니다. 광고 추적용 UTM 주소를 만드는 것이 목적이라면 UTM 빌더가 항목이 정해져 있어 더 편합니다.

쿼리스트링 만들기 · 풀기 (URL 파라미터 분해와 조립)모두의계산기

물음표 뒤가 어떻게 나뉘는가

주소는 크게 경로, 쿼리, 앵커 세 덩어리입니다. ? 앞이 경로, ?부터 # 전까지가 쿼리, # 뒤가 앵커입니다. 쿼리는 다시 &로 항목을 나누고 각 항목을 첫 번째 =에서 키와 값으로 자릅니다. "첫 번째"라는 점이 중요한데, 값 안에 =가 들어 있어도(예: base64 문자열의 끝) 그 뒤는 전부 값으로 봅니다. 앵커는 브라우저가 서버에 보내지 않고 자기 페이지 안에서만 쓰는 표시라, 로그를 아무리 뒤져도 # 뒤가 안 나오는 것이 정상입니다. 이 도구는 세 덩어리를 먼저 보여 준 다음 쿼리만 표로 풉니다.

퍼센트 인코딩과 + 기호

주소에는 영문·숫자와 몇 개 기호만 안전하게 들어갈 수 있어서, 한글이나 공백은 %EB%9F%AC처럼 바이트를 16진수로 적는 방식으로 바뀝니다. 이것을 퍼센트 인코딩이라고 합니다. 공백은 역사적으로 두 가지로 표현되는데, HTML 폼이 보내는 쿼리에서는 +가 공백이고 그 밖의 자리에서는 %20이 공백입니다. 그래서 이 도구에는 "+ 를 공백으로 해석" 옵션이 있습니다. 값에 실제로 더하기 기호가 들어가는 경우(수식, 전화번호 국가코드)라면 이 옵션을 끄고 봐야 원래 값이 나옵니다. 반대로 조립할 때 더하기를 값으로 넣고 싶으면 인코딩을 켜 두면 %2B로 안전하게 바뀝니다.

같은 키가 여러 번 들어갈 때

size=260&size=265처럼 같은 키를 반복하는 것은 문법상 문제가 없지만, 받는 쪽 처리는 표준이 없습니다. PHP는 마지막 값만 남기고(size[]로 적어야 배열), Node.js의 기본 파서와 자바 서블릿은 배열로 모으며, 어떤 프레임워크는 첫 값만 씁니다. 그래서 체크박스 여러 개를 넘기는 화면에서 값이 하나만 저장되는 버그가 흔히 생깁니다. 이 도구는 중복 키를 따로 표시하고 a[] 같은 배열 표기도 알아봅니다. 어느 쪽이 맞는지는 결국 서버 코드를 봐야 하므로, 표시는 "여기를 확인하라"는 신호로 쓰시면 됩니다.

빈 값과 값 없음의 차이

page=는 "page라는 키가 있고 값은 빈 문자열", page는 "키만 있고 등호도 없음"입니다. 표에서 앞의 것은 빈 값, 뒤의 것은 값 없음으로 구분해 보여 줍니다. 서버에서는 대체로 둘 다 빈 문자열로 읽지만, 값이 없는 키를 참(true)으로 취급하는 API도 있어서(?debug) 의미가 달라질 수 있습니다. 조립할 때는 빈 값을 남길지, 등호 없이 키만 남길지, 아예 뺄지 고를 수 있게 해 두었습니다. 필터 조건을 초기화하는 주소를 만들 때는 남기는 쪽이, 주소를 짧게 유지하려면 빼는 쪽이 편합니다.

자주 묻는 질문

주소를 붙여넣었는데 파라미터가 하나도 안 나옵니다.

주소에 ?가 없으면 쿼리가 없는 것으로 봅니다. 쿼리스트링만 따로 복사해 넣으셨다면 a=1&b=2처럼 등호나 앰퍼샌드가 들어 있어야 쿼리로 인식합니다. 등호가 하나도 없는 문자열은 경로로 처리됩니다.

한글이 깨져서 나옵니다.

주소가 UTF-8이 아닌 EUC-KR로 인코딩된 경우입니다. 오래된 게시판 주소에서 종종 나오는데, 이 도구는 UTF-8 기준으로만 디코드하므로 그런 값은 "디코드 실패"로 표시되거나 깨진 글자가 됩니다. 원본 값 자체는 표에 그대로 나오니 필요하면 그 값을 가져다 쓰세요.

입력한 주소가 서버로 보내지나요?

보내지지 않습니다. 문자열을 자르고 붙이는 처리 전부가 브라우저 안에서 실행됩니다. 토큰이나 세션 값이 들어 있는 주소도 안전하게 넣을 수 있지만, 결과를 화면에 띄우므로 화면 공유 중에는 주의하세요.

함께 보기