본문으로 건너뛰기

© 2026 Molayo

GeekNews헤드라인2026. 06. 05. 15:11

URL의 IPv6 zone은 실수

요약

IPv6 링크 로컬 주소의 zone 식별자(%)가 URL 문법과 충돌하여 발생하는 Go 언어의 파싱 오류를 다룹니다. RFC 6874 표준에 따라 '%'를 '%25'로 인코딩해야 하지만, 브라우저 및 라이브러리 간 호환성 문제가 여전히 엣지 케이스로 남아 있습니다.

핵심 포인트

  • IPv6 zone 식별자(%)는 URL에서 잘못된 escape 문자로 해석될 수 있음
  • RFC 6874에 따라 '%'를 '%25'로 percent-encode해야 함
  • Go net/url 패키지는 zone이 포함된 IPv6를 invalid URL escape로 처리함
  • 브라우저와 라이브러리 간의 origin 개념 충돌로 인해 호환성 이슈가 존재함

IPv6 zone은 여러 인터페이스가 같은 fe80::

링크 로컬 범위를 쓸 때 fe80::4%eth0

처럼 대상 인터페이스를 구분하게 하는 표기임

  • URL에서 IPv6 주소는 포트와 콜론을 구분하려고
    [fe80::4]:80

처럼 감싸며, zone까지 붙이면 대괄호 표기[fe80::4%eth0]:80

형식이 됨

  • Go의
    net/url

]:80

%et

라는 잘못된 URL escape로 해석해 invalid URL escape 오류를 냄

  • RFC 6874는 zone이 있는 IPv6 리터럴을
    IPv6address "%25" ZoneID

로 정의하므로, URL에서는 %

%25

로 percent-encode해야 함

  • Anubis가 IPv6 zone 주소를 가리키려면 이 표기를 써야 하며, 브라우저·nginx·Requests 관련 이슈처럼 origin과 라이브러리 호환성까지 걸린
    엣지 케이스로 남음

IPv6 zone와 URL 문법 충돌

  • IPv6의 링크 로컬 주소는 인터페이스마다
    fe80::whatever

범위에 놓일 수 있어, 두 네트워크 인터페이스가 있을 때 fe80::4

목적지를 구분하려면 IPv6 scope/zone) 사용이 필요함

  • zone 값의 형식은 운영체제마다 다르며, Linux에서는 인터페이스 이름, Windows에서는 인터페이스 ID를 사용함
  • 예시에서
    eth0

는 이더넷 장치 이름이며, 주소는 다음처럼 표현됨

fe80::4%eth0
  • 호스트와 포트는 보통 콜론으로 구분하지만 IPv6 주소도 헥스 그룹 구분에 콜론을 쓰므로, 포트 80의
    fe80::4

는 다음처럼 대괄호로 감싸야 함

[fe80::4]:80
[fe80::4%eth0]:80
panic: parse "http://[fe80::4%eth0]:80";: invalid URL escape "%et"

표준상 해결책과 남은 문제

IP-literal = "[" ( IPv6address / IPv6addrz / IPvFuture ) "]"
ZoneID = 1*( unreserved / pct-encoded )
IPv6addrz = IPv6address "%25" ZoneID
  • 같은 엣지 케이스는 nginx 티켓, Requests 이슈, HTTP link-local URI BCP 초안에도 걸려 있음
  • 브라우저는 현재 IPv6 zone을 지원하지 않으며, 이유는 많은 미묘한 동작에 쓰이는 “origin” 개념을 깨뜨리기 때문이고, 해당 초안은 브라우저가 사용할 수 있도록 IPv6의 zone origin을 정의하려는 시도임
  • Anubis가 IPv6 zone 주소를 가리키려면
    %

를 percent-encoding해야 하며, Go 표준 라이브러리를 포크하지 않는 정책 아래에서는 이 엣지 케이스의 나쁜 UX를 감수해야 함

AI 자동 생성 콘텐츠

본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0