요약

  • # 뒤의 내용은 문서를 가져오는 주소와 분리되며, 브라우저가 받은 문서의 형식에 맞춰 해석한다.
  • HTML의 이름 붙은 앵커에서 출발한 방식은 일반 텍스트의 줄과 글자 범위를 가리키는 방법으로도 확장됐다.

긴 보고서의 첫 페이지를 가리키는 링크는 사실상 “나머지는 직접 찾아보세요”라는 부탁이다. 주소 끝에 #과 목표를 붙이면 손가락으로 필요한 문장을 짚어 주는 링크가 된다. 서버는 문서를 보내고, 링크를 쓴 사람은 도착 지점을 고르며, 브라우저는 둘을 이어 준다. 한 문단마다 서버에 별도 주소를 만들 필요가 없다.

이 역할 분담은 1995년 6월의 RFC 1808에 이미 드러난다. 상대 URL을 해석하는 과정에서 #과 뒤따르는 조각을 먼저 떼어 낸 뒤 나머지 주소를 처리한다. 같은 해의 HTML 2.0 규격 RFC 1866은 익숙한 쓰임새를 설명했다. #fragment는 문서 안의 앵커를 가리킬 수 있고, 당시 HTML에서는 일치하는 NAME 값을 가진 A 요소가 목적지가 됐다. 네트워크로는 문서 전체가 왔어도 읽기는 중간에서 시작할 수 있었다.

Tim Berners-Lee는 1997년 4월의 W3C 설계 메모에서 서버가 표현물을 돌려주면 클라이언트가 그 조각을 해당 미디어 형식을 이해하는 프로그램에 넘긴다고 설명했다. HTTP 서버는 조각을 받지 않는다. 그는 ‘fragment’라는 말 자체가 너무 좁을 수 있다고도 봤다. 형식에 따라 일부, 특정한 보기, 다른 대상을 가리킬 수 있기 때문이다. 책갈피는 쉬운 비유일 뿐, 설계의 전부는 아니다.

2005년의 RFC 3986은 이를 간접 참조로 정리했다. 기본 자원을 통해 부차적인 대상을 식별하고, 받은 표현물의 미디어 형식이 조각의 뜻을 결정한다. 여기에는 글을 인용하는 사람의 선택권이 담겨 있다. 게시자가 모든 문단에 서버 경로를 마련해 두지 않아도, 링크 작성자는 이미 공개된 자료의 특정 부분을 골라 독자를 보낼 수 있다. 게시자는 내용을 만들고, 인용자는 첫 시선을 정한다.

활용은 HTML 앵커에서 멈추지 않았다. 2008년에 나온 RFC 5147은 text/plain 파일의 글자 위치와 줄 위치, 그 범위를 조각 식별자로 표현하는 방법을 정했다. 일반 텍스트에는 HTML 요소의 ID가 없지만 줄과 글자는 셀 수 있다. 문서의 종류에 따라 같은 # 뒤에 다른 지도를 펼치는 셈이다.

그 경계는 현재 HTTP 의미론을 담은 RFC 9110에도 남아 있다. 조각은 요청으로 전송되는 대상 URI에 포함되지 않는다. 원 서버는 기본 자원의 요청을 받고, 브라우저는 받은 문서에서 조각이 가리키는 위치를 해석한다. 게시자가 앵커 이름을 바꾸거나 줄을 옮기면 오래된 책갈피는 빗나갈 수 있다. 문서 내부의 이름을 안정적으로 관리해야 인용도 오래 산다.

키보드에서 #은 작은 자리를 차지한다. 그러나 긴 문서를 읽는 사람에게는 꽤 당당한 권한을 준다. 게시자가 정문을 꾸며 놓아도 링크를 쓰는 사람은 말할 수 있다. 오늘 보러 온 것은 저 안쪽 진열장이라고.