가끔 이런 질문을 받습니다. 왜 OpenID에 도메인이 붙거나 슬래시같은 것이 들어가느냐, Email(ID@Domain 형식)을 오픈아이디로 쓸 수는 없느냐. 대개 이런 질문을 하는 것은 기존의 ID 체계의 연장에서 OpenID를 생각하기 때문입니다. 오픈아이디는 (주로) URL입니다. 물론 URL을 넘어 URI 그리고 XRI로 확장되어 있지만, 가장 대중적인 URL이라고 생각해보겠습니다. (참고로, URI와 XRI는 표준화 시작 주체가 다릅니다)
Identity URL과 URL 페이지의 내용
제 Identity URL은 http://coolengineer.com/ 입니다. 또한, 이것은 제 블로그 주소이므로, 이 페이지에는 저의 인증에 대한 정보와 제 블로그의 최근 글 (혹은 커버페이지)이 나와있습니다. 즉, 용도가 두가지로 쓰인다는 것입니다.
제 홈페이지 소스에는 위와 같은 태그가 삽입되어 있습니다. 저 뜻은 이 주소는 openid 인증용으로 사용되며, 그 서버는 뭐고, 해당 ID는 무엇이다라는 내용입니다. 위 link 태그는 1.x 용으로 만들어진 것이며, meta의 XRDS 위치는 2.0에서 추가된 것입니다. 물론 2.0 초안작업이 만들어지는 동안 이미, 1.1 라이브러리에도 구현이되어 들어가 있었습니다. XRDS 파일은 URL로 할 수 있는 서비스들의 목록을 기술한 것이며, 여기에는 OpenID 뿐아니라 하나의 URL로 할 수 있는 다양한 서비스가 기술될 수 있는 확장을 가지고 있습니다. 추후 Textcube에는 XRDS 파일에 들어갈 내용을 선택할 수 있는 확장을 넣을 생각에 있습니다. 그렇게 되면, 블로그 URL하나로 할 수 있는 일들이 많아 질 것으로 예상이 됩니다. (XRDS 편집기!)
준비 운동
이야기를 풀어가기 전에 wget을 디버거로 사용하겠습니다. wget에는 URL을 호출할 때, 여러가지 옵션을 주어 원하는 동작을 할 수가 있습니다. 사실 앞의 글의 예제 중 블로그 주소만 사용하여 이미지를 가져오는 것은 불가능한 것이었지만, 의미상 다음과 같은 명령을 수행하는 것이라 생각할 수 있습니다.
내부절차에서 관심있는 것은 서버주소와 실제
ID에 대한 것입니다. 그러면 그 이하 길다란 페이지는 무엇에 써야할까요? 인증을 원하는 쪽에서는 아무짝에 쓸모없습니다.
따라서, 되도록 앞부분에 위치시켜놓는 것이 기계들을 위해 좋을 것입니다. 현재는 2.0까지 나온 상황이므로, 2.0을 기준으로
OpenID가 입력된다음 일어나는 초기이야기를 할까 합니다.
OpenID 1.1로 로그인할 수 있는 사이트에서는 다음과 같은 초기 절차가 일어납니다.
wget http://coolengineer.idtail.com/
index.html 파일 분석하여 openid.server link 태그를 찾음 openid.delegate가 있다면, 그 ID를 사용하여 진행함
OpenID 2.0의 XRDS 를 지원하는 사이트라면,
wget http://coolengineer.idtail.com/
index.html 파일을 분석하여 X-XRDS-Location meta 태그를 찾아 xrds의 위치를 얻음(http://coolengineer.idtail.com/xrds라 가정)
wget http://coolengineer.idtail.com/xrds
OpenID 관련 서비스를 찾아 서버 주소와 위임 정보를 찾아 진행함.
라고, 생각할 수 있습니다. 그러나, meta 태그의 의미를 잘 살펴보시면 알겠지만, http-equiv 입니다. 이것은 곧 HTTP 헤더에 있는 것을 그대로 기술하는데 그 의미가 있습니다. 즉,
wget -d http://coolengineer.idtail.com/
Header 출력중에 X-XRDS-Location 이라는 헤더가 있는지 찾아 xrds의 위치를 얻음.
wget http://coolengineer.idtail.com/xrds
OpenID 관련 서비스를 찾아 서버 주소와 위임 정보를 찾아 진행함.
이라는 것입니다. 실제로 OpenID서비스 제공자들은 저 헤더를 항상 넣습니다. 확인해보자면,
wget -d http://coolengineer.idtail.com/
HTTP request sent, awaiting response... HTTP/1.1 200 OK Date: Sat, 22 Mar 2008 17:40:52 GMT Set-Cookie: IDTAIL_SESSION=XXXXX; expires=Sat, 29 Mar 2008 17:40:52 GMT; path=/; domain=idtail.com X-XRDS-Location: http://coolengineer.idtail.com/xrds Content-Type: text/html
아니, 정말 그러하지 않습니까? 정작 관심있는 것은 http://coolengineer.idtail.com/ 을 통해서 얻을 수 있는 내용에 있는 것이 아니라 저 xrds 파일에 있습니다. 따라서, http://coolengineer.idtail.com/ 을 얻으려고 할 때, 저 xrds가 바로 날아 오면 얼마나 좋겠습니까?
그래서 이렇게 시도한다는 얘기 입니다. xrds의 Content-type은 "application/xrds+xml" 입니다.
즐거운 일이 일어나고 있습니다. 1편에서 안되던 일이었던, 하나의 URL에 여러 리소스의 역할이 충실히 일어나고 있습니다. 즉, 대부분에게는 제 mydtail 페이지가 나올듯한 것이, OpenID 로그인 진행에 필요한 의사 표현을 하게되니, 다른 내용이 전달되어 나오는 것이군요.
FOAF나 XFN을 구현하기 위한 분들에게 간단한 도움을 드리고자 한 가지 메모를 남겨봅니다. 이 기술들은 모두 URL 기반으로 친구관계를 설정합니다. 즉, 인터넷에서의 사람을 구별하는 방법으로 URL이 사용된다는 것입니다. 따라서, 어떤 사이트가 FOAF, XFN을 지원한다면, 개인 페이지(Profile page)가 필요한것이고, 이 페이지의 URL을 기반으로 네트워크를 만들어가는 것입니다. 즉, 오해하기 쉬운 것은, HTML 내에 마이크로포맷이랍시고 한 사람의 친구관계에 있는 URL이 나타나면 항상 XFN 속성이나, FOAF 검출기능을 추가하는 것은 좋지 않습니다. 왜냐하면, 역방향 링크를 구축한다고 보면, 내가 작성한 많은 페이지에서 한사람에게 향하는 링크를 따라 다시 오는 것을 생각할 경우 한 곳으로만 오도록 하는 것이 좋기 때문입니다. 이번 Textcube 1.6에서는 위 생각에 의거하여 개인 페이지라 할 수 있는 블로그의 첫화면, 즉 뒤에 아무런 경로가 추가되지 않은 최상위 페이지를 출력할 때(커버페이지를 사용하는 사람은 그 페이지에서)만, XFN 속성을 넣고, FOAF 검출 태그를 넣습니다. 예를 들어, XFN이 적용되어 있는 블로그롤(북마크 혹은 링크 목록)의 소스를 보시면
몇 년 전까지만 해도 인터넷에서 한 사람을 대표하는 수단은 당연히 "메일 주소"였다. 손쉽게 가질 수 있고 인터넷을 사용하는 사람이면 누구나 한 개 쯤은 가지고 있기에 개인을 대표하는 수단으로 적절했다. 이 때문에 가입 시 메일로 인증하기, 그라바타1, 메일을 로그인용 ID로 사용하는 서비스 등 메일을 기반으로 사용자를 인증하는 경향이 나타났다. (편의상 이 시대를 1세대라고 부르자.)하지만 최근 1인 1 블로그 시대가 다가오면서 개인을 대표하는...