OpenID는 URL


가끔 이런 질문을 받습니다. 왜 OpenID에 도메인이 붙거나 슬래시같은 것이 들어가느냐, Email(ID@Domain 형식)을 오픈아이디로 쓸 수는 없느냐. 대개 이런 질문을 하는 것은 기존의 ID 체계의 연장에서 OpenID를 생각하기 때문입니다. 오픈아이디는 (주로) URL입니다. 물론 URL을 넘어 URI 그리고 XRI로 확장되어 있지만, 가장 대중적인 URL이라고 생각해보겠습니다. (참고로, URI와 XRI는 표준화 시작 주체가 다릅니다)

Identity URL과 URL 페이지의 내용


제 Identity URL은 http://coolengineer.com/ 입니다.  또한, 이것은 제 블로그 주소이므로, 이 페이지에는 저의 인증에 대한 정보와 제 블로그의 최근 글 (혹은 커버페이지)이 나와있습니다. 즉, 용도가 두가지로 쓰인다는 것입니다.

Identity 관련 내용

<link rel="openid.server" href="http://www.idtail.com/server" />
<link rel="openid.delegate" href="http://coolengineer.idtail.com/" />
<meta http-equiv="X-XRDS-Location" content="http://coolengineer.idtail.com/xrds" />
제 홈페이지 소스에는 위와 같은 태그가 삽입되어 있습니다. 저 뜻은 이 주소는 openid 인증용으로 사용되며, 그 서버는 뭐고, 해당 ID는 무엇이다라는 내용입니다. 위 link 태그는 1.x 용으로 만들어진 것이며, meta의 XRDS 위치는 2.0에서 추가된 것입니다. 물론 2.0 초안작업이 만들어지는 동안 이미, 1.1 라이브러리에도 구현이되어 들어가 있었습니다. XRDS 파일은 URL로 할 수 있는 서비스들의 목록을 기술한 것이며, 여기에는 OpenID 뿐아니라 하나의 URL로 할 수 있는 다양한 서비스가 기술될 수 있는 확장을 가지고 있습니다. 추후 Textcube에는 XRDS 파일에 들어갈 내용을 선택할 수 있는 확장을 넣을 생각에 있습니다. 그렇게 되면, 블로그 URL하나로 할 수 있는 일들이 많아 질 것으로 예상이 됩니다. (XRDS 편집기!)

준비 운동

이야기를 풀어가기 전에 wget을 디버거로 사용하겠습니다. wget에는 URL을 호출할 때, 여러가지 옵션을 주어 원하는 동작을 할 수가 있습니다. 사실 앞의 글의 예제 중 블로그 주소만 사용하여 이미지를 가져오는 것은 불가능한 것이었지만, 의미상 다음과 같은 명령을 수행하는 것이라 생각할 수 있습니다.
wget --header="Accept: image/png" http://coolengineer.com/
즉, "http://coolengineer.com/ 에 대해서 그림으로 취급할때 얻을 수 있는 것을 가져와보라"는 뜻이겠죠. 또한, 결과에 대해 HTTP 헤더파일을 보고 싶을 때는 다음과 같이 합니다.
wget -d http://coolengineer.com/
윈도우용 wget은 여기에서 쉽사리 구할 수 있습니다.

OpenID Relying Party(Consumer)의 내부 절차

내부절차에서 관심있는 것은 서버주소와 실제 ID에 대한 것입니다. 그러면 그 이하 길다란 페이지는 무엇에 써야할까요? 인증을 원하는 쪽에서는 아무짝에 쓸모없습니다. 따라서, 되도록 앞부분에 위치시켜놓는 것이 기계들을 위해 좋을 것입니다. 현재는 2.0까지 나온 상황이므로, 2.0을 기준으로 OpenID가 입력된다음 일어나는 초기이야기를 할까 합니다.

OpenID 1.1로 로그인할 수 있는 사이트에서는 다음과 같은 초기 절차가 일어납니다.
  1. wget http://coolengineer.idtail.com/
  2. index.html 파일 분석하여 openid.server link 태그를 찾음 openid.delegate가 있다면, 그 ID를 사용하여 진행함
OpenID 2.0의  XRDS 를 지원하는 사이트라면,
  1. wget http://coolengineer.idtail.com/
  2. index.html 파일을 분석하여 X-XRDS-Location meta 태그를 찾아 xrds의 위치를 얻음(http://coolengineer.idtail.com/xrds라 가정)
  3. wget http://coolengineer.idtail.com/xrds
  4. OpenID 관련 서비스를 찾아 서버 주소와 위임 정보를 찾아 진행함.
라고, 생각할 수 있습니다. 그러나, meta 태그의 의미를 잘 살펴보시면 알겠지만, http-equiv 입니다. 이것은 곧 HTTP 헤더에 있는 것을 그대로 기술하는데 그 의미가 있습니다. 즉,
  1. wget -d http://coolengineer.idtail.com/
  2. Header 출력중에 X-XRDS-Location 이라는 헤더가 있는지 찾아 xrds의 위치를 얻음.
  3. wget http://coolengineer.idtail.com/xrds
  4. 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. wget --header="Accept: application/xrds+xml" http://coolengineer.idtail.com/
  2. OpenID 관련 서비스를 찾아 서버 주소와 위임 정보를 찾아 진행함.
단계가 줄어 들었음을 알 수가 있습니다. 다시 예제를 통해서 살펴볼까요?
wget --header="Accept: application/xrds+xml" -d -O - http://coolengineer.idtail.com/

---request begin---
GET / HTTP/1.0
User-Agent: Wget/1.7
Host: coolengineer.idtail.com
Accept: */*
Connection: Keep-Alive
Accept: application/xrds+xml

---request end---
HTTP request sent, awaiting response... HTTP/1.1 200 OK
Date: Sat, 22 Mar 2008 17:57:35 GMT
Set-Cookie: IDTAIL_SESSION=XXXXXXXX; expires=Sat, 29 Mar 2008 17:57:35 GMT; path=/; domain=idtail.com
Content-Length: 505
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/xrds+xml

<?xml version="1.0" encoding="UTF-8" ?><xrds:XRDS
    xmlns:xrds="xri://$xrds"
    xmlns:openid="http://openid.net/xmlns/1.0"
    xmlns="xri://$xrd*($v*2.0)">
    <XRD>
    <Service priority="0">
        <Type>http://openid.net/signon/1.0</Type>
        <Type>http://openid.net/signon/1.1</Type>
        <Type>http://openid.net/sreg/1.0</Type>
        <URI>http://www.idtail.com/server</URI>
        <openid:Delegate>http://coolengineer.idtail.com/</openid:Delegate>
    </Service>
    </XRD>

즐거운 일이 일어나고 있습니다. 1편에서 안되던 일이었던, 하나의 URL에 여러 리소스의 역할이 충실히 일어나고 있습니다. 즉, 대부분에게는 제 mydtail 페이지가 나올듯한 것이, OpenID 로그인 진행에 필요한 의사 표현을 하게되니, 다른 내용이 전달되어 나오는 것이군요.

정말 장황한글 읽어주셔서 감사합니다...... 오늘은 맛있는거 드세요.
신고
  1. StudioEgo 2008.03.27 02:36 신고

    좋은 글 잘 읽었습니다. OpenID를 쓰는데 OpenID를 제공하는 회사에서 주는 URL대신에 자기 URL로 OpenID를 쓸수 있는 방법에 대해 이해를 못했다가 이 포스트로 약간이나마 해결된것 같네요. :)

  2. 언제나 즐거운 나 2009.02.13 00:47 신고

    안녕하세요^^ 김지혜 입니당.
    잘 지내시죠??
    역시나 멋지세요...ㅋ
    졸업논문 쓰면서 개념 정리 하는데 구글에서 검색결과 가장 첫 번째 !!
    감사합니다~
    제가 정리하는 곳에 링크 걸어놔도 되나요??이미 걸긴했는데
    불편하시면 내리겠습니다.. 고럼 수고하세요~

+ Recent posts