단축 URL 뒤에 붙인 파라미터는 어디로 갔나?
리다이렉트 쿼리 포워딩
난이도: ★★☆☆☆ (단, “baked-in vs forwarded” 구분이 핵심 — 놓치기 쉬움) 연관 노트: 픽셀 트래킹은 언제 찍히나
핵심 요약
- 단축 URL은 302 리다이렉트다. 뒤에
?key=123을 붙여도, 그게 최종 목적지까지 도달하려면 단축 서비스가 “쿼리 포워딩”을 해줘야 한다 — 붙어온 쿼리를 리다이렉트 시 목적지 URL에 이어붙여(merge) 넘겨주는 것. 꺼져 있으면 증발. - “기존 파라미터(예:
grade)가 이미 분석 도구에 찍히니key도 되겠지”는 틀린 근거다. grade는 우리가 단축 URL 뒤에 붙인 게 아니라, 단축링크가 가리키는 목적지 URL에 처음부터 박혀 있던(baked-in) 값이라 forwarding과 무관하게 찍힌다. - 그래서 검증은 가정 말고 실측:
단축도메인/x?key=test를 직접 열어 최종 주소창 URL에key가 남는지 눈으로 확인.
왜 헷갈렸나
- “단축 URL 뒤에 param 붙이면 당연히 목적지로 가겠지” — 단축링크가 리다이렉트라는 걸, 그리고 포워딩이 옵션이라는 걸 간과.
- “이미
grade=green이 분석 도구에 보이잖아 → 포워딩 되는 거 아냐?” — baked-in(목적지에 원래 있음) vs appended+forwarded(붙여서 전달) 을 구분 못 함. 둘은 도달 경로가 완전히 다르다.
메커니즘
[baked-in] — forwarding과 무관하게 항상 도달
short/x ──(302)──▶ landing?grade=green ← 목적지 URL에 원래 박혀 있음
(grade는 여기서 옴)
[appended + forwarded] — forwarding ON일 때만 도달
short/x?key=123
│ forwarding OFF → landing?grade=green (key 증발)
│ forwarding ON → landing?grade=green&key=123 (붙어온 key를 merge)
key는 고객마다 달라서 목적지에 미리 박을 수 없다(정적 target 하나를 모두 공유). 그러니 반드시 append + forwarding 경로다. 반면 grade는 목적지에 박아둔 것 → grade가 찍힌다는 사실은 “forwarding이 된다”의 증거가 전혀 아니다.
해결 패턴
1) 실측 검증 (가정 금지)
브라우저에서 https://단축도메인/x?key=test999 열기
→ 최종 주소창이 landing?...&key=test999 이면 forwarding ON
→ key 사라지면 OFF (→ 단축 서비스 설정에서 켜거나, 목적지에 심는 방식으로 우회)
2) merge 동작도 함께 확인
목적지에 이미 ?a=1 이 있으면 → ?a=1&key=... 로 합쳐지는지,
? 가 중복되어 깨지진 않는지
다음에 이 상황을 만나면
“단축 링크 + 추적 파라미터” 조합을 쓸 때:
- 이 값이 목적지에 baked-in 인가, 링크에 append 인가? (고객별로 다르면 append → forwarding 필요)
- 단축 서비스의 쿼리 포워딩 설정을 확인했나? (기본값 가정 금지)
- “다른 param이 이미 잘 찍힌다”를 forwarding 근거로 쓰지 마라 — 그건 baked-in일 수 있다
- 실제 링크를 열어 최종 URL로 검증했나?
커넥팅 닷
← 선행 개념 (이걸 알아야 이해된다)
- HTTP 3xx 리다이렉트 — 단축 URL이 곧 302. 붙인 쿼리가 목적지로 자동 전달되지 않을 수 있다는 게 여기서 나온다.
- 픽셀 트래킹은 언제 찍히나 — 파라미터가 “언제/어디서” 분석 도구에 도달하는지 따지는 같은 사고.
→ 확장 개념 (여기서 더 나아가면)
- URL 정규화·쿼리 병합 규칙 — 포워딩 시 기존 쿼리와 append 쿼리를 어떻게 합치는가(
?중복, 키 충돌). - UTM/어트리뷰션 파라미터 전파 — 리다이렉트 체인에서 추적 param 유실을 막는 일반 문제.
↔ 같은 원리가 적용되는 곳
- “증거가 실제로 그 경로를 증명하나?” — grade 사례처럼, 관측된 사실이 내가 검증하려는 메커니즘과 다른 경로로 생겼을 수 있다. 인과 착오를 경계.
- OAuth/리다이렉트에서 state·param 전달 — 리다이렉트 경유 시 파라미터 보존은 어디서나 반복되는 함정.
참고
- MDN — Redirections in HTTP — 3xx 리다이렉트 기본