절대경로가 "//"로 시작하는 URL은 스펙 위반일까?

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/barhttp://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.

위 메일의 전문은 여기서 확인할 수 있다.

Advertisements

절대경로가 "//"로 시작하는 URL은 스펙 위반일까?”에 대한 2개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중