http://example.org//foo/bar 와 같이 path의 절대경로가 //로 시작하는 것은, URI의 정의에 대한 최신 명세인 RFC 3986을 위반한 것이다. 절대 경로는 “//”로 시작해서는 안된다.
path-absolute ; begins with "/" but not "//"
그러나 HTML에서 <a href="//foo/bar">test</a>
와 같은 상대경로를 사용하는 것은 아무 문제가 없는데, 왜냐하면 HTML의 가장 최신 표준인 4.01(아직 5는 드래프트)은 RFC 3986보다 훨씬 오래된 RFC 1808에 따라 상대경로를 해석하기 때문이다. RFC 1808의 “2.4.3. Parsing the Network Location/Login”에 보면 url이 //로 시작하는 경우, // 이후부터 다음번 / 이전까지의 문자열을 net_loc(network location과 login information)로 삼게 되어있으므로, //foo/bar
는 http://foo/bar
로 해석된다.
또한 HTTP/1.1 역시 URI를 해석할 때 RFC 3986이 아닌 그보다 오래된 RFC 2396을 따르므로 앞의 URL은 HTTP/1.1 명세를 위반한 것도 아니다.
그러나 HTTP/1.1은 곧 개정될 예정이며, 이 개정될 HTTP/1.1은 RFC 3986을 따르므로 결국 명세를 위반하는 것이 되지 않을까 걱정이 살짝 되는데, 다행히도 HTTP Working Group에서 몇 주 전에 이 문제를 발견하고서는 논의를 거친 끝에 절대경로가 //로 시작해도 되는 것으로 예외처리를 했기 때문에 위반이 아니게 될 것이다. 다만 그렇다고 해도 어디까지나 이건 HTTP에 국한된 이야기이므로, HTTP 응용프로그램이 아닌 소프트웨어를 개발할 때는 //로 시작하는 절대경로를 사용하면 RFC 3986을 위반하게 된다는 점을 신경써야 할 것이다.
그리고 마지막으로, 로이 필딩에 따르면 RFC 3986이 절대경로가 //로 시작할 수 없도록 막은 것은, URI 규칙을 새로운 ABNF로 재작성하는 과정에서 발생한 사고(accident)라고 한다.
> Roy, do you recall whether there's a reason why we would
> want to rule out a path starting with "//"?
No, it is an accident of the transition to new URI ABNF and
should be raised as an issue. There are several different ways to
fix it, depending on how lenient we want to be with parsing.
위 메일의 전문은 여기서 확인할 수 있다.
와웅 역시 멋진 글이네요 ㅋㅋ
좋아요좋아요
고맙습니다 🙂
좋아요좋아요