IPv6의 링크 로컬 주소는 여러 네트워크 인터페이스가 동일한 주소 범위를 공유할 때 특정 인터페이스를 지정하기 위해 '존(Zone)' 식별자를 사용합니다. 예를 들어, `fe80::4%eth0`와 같이 `%` 뒤에 인터페이스 이름을 붙이는 방식입니다. 하지만 이러한 존 식별자가 포함된 IPv6 주소를 URL에 사용할 경우, 웹 표준과 프로그래밍 라이브러리 간의 미묘한 충돌이 발생하여 개발자들에게 혼란을 주고 있습니다.
문제는 URL에서 IPv6 주소를 포트와 구분하기 위해 대괄호로 감싸는 문법(`[fe80::4]:80`)과, 존 식별자의 `%` 문자가 충돌하면서 발생합니다. `http://[fe80::4%eth0]:80`와 같은 URL을 Go 언어의 `net/url` 라이브러리가 파싱할 때, `%et`를 잘못된 URL 이스케이프 시퀀스로 해석하여 오류를 발생시키는 것이 대표적인 사례입니다. 이는 RFC 6874에서 URL 내 IPv6 존 주소는 `%`를 `%25`로 퍼센트 인코딩하도록 정의하고 있기 때문입니다. 즉, `http://[fe80::4%25eth0]:80`와 같이 명시적으로 인코딩해야 올바르게 처리됩니다.
이러한 문제는 단순히 Go 언어만의 문제가 아니라, 브라우저, Nginx, Requests 라이브러리 등 다양한 웹 기술 스택에서 유사한 호환성 이슈로 나타나고 있습니다. 특히 브라우저는 현재 IPv6 존을 직접 지원하지 않는데, 이는 웹의 핵심 개념인 '오리진(origin)'을 복잡하게 만들 수 있기 때문입니다. 표준화 기구들은 이 문제를 해결하기 위해 지속적으로 논의하고 있지만, 기존 시스템과의 호환성 및 복잡성 증가로 인해 해결이 더딘 상황입니다.
결과적으로, 개발자들은 IPv6 존 주소를 URL에 사용할 때 표준에 따라 `%`를 `%25`로 인코딩하는 방식을 채택해야 합니다. 이는 다소 번거롭지만, 현재로서는 가장 안정적인 해결책입니다. 이처럼 사소해 보이는 문법적 차이가 웹 생태계 전반에 걸쳐 예상치 못한 복잡성과 호환성 문제를 야기할 수 있음을 보여주며, 웹 표준 준수의 중요성을 다시 한번 상기시킵니다.