claimed ID 와 302 redirection
http://blog.myid.net/14#comment22 에 올라온 문의 사항인데요, 많은 분들이 관심이 있을 것 같아서 소개드립니다.
개인 도메인의 블로그를 운영하시는데요 (예를 들면 http://star.pe.kr 이라고 합시다), 기존에는 http://star.pe.kr 을 치면 서버 리디렉션 302 로 http://star.pe.kr/wp 로 보냅니다. 아마, wordpress 가 설치된 URL 같습니다. 일단 톱 url 을 블로그 url 로 보내고자 하시는 것 같습니다.
이분은 당연히, http://star.pe.kr 을 자신의 OpenID 로 쓰시고 싶으실 겁니다. (이경우 이 ID 를 claimed ID 라고 합니다.). 대개의 경우 직접 OpenID 서버를 운영하시지 않기 때문에, http://star.myopenid.com 에 delegation 해서 사용하십니다. 그런데, wordpress delegation 플러그인으로 지정할 경우, http://star.pe.kr/wp 에 delegation head 태그들이 들어갑니다.
어떤 consumer (오픈아이디 인증을 지원하는 사이트) 에 http://star.pe.kr 을 넣고 로그인 합니다. 작동안합니다. 스펙에 따라 다른데요, 현재 1.1 에 consumer 가 반드시 redirect 를 따라가야 된다고 명시되 있지만 크게 강조되 있지 않습니다. 따라서, 어떤 consumer 는 지원하지 않는 것도 있습니다. 스펙2.0 에는 consumer 가 반드시 redirect 를 따라가야 한다고 'Normalization' 섹션에 강조 되어있습니다. 하지만, 이경우에, redirect 최종 URL 이 claim ID 로 쓰게 되어 있기 때문에, 애초에 로그인 입력란에 넣은 URL 이 아닐 수 있습니다. 이경우, 위의 케이스에서 사용자의 의도와 다른 효과가 되는 것 입니다.
그래서, 위의 경우에는 http://star.pe.kr 을 200 html 페이지 출력으로 하시고, 거기에 delegation head 들을 달고, 대신 기존 302 redirect 효과를 client side redirection 을 권해 드렸습니다.
(물론, 이경우, 접근성 항목과 충돌이 나는 것으로 주장할 수도 있습니다만, 해당 접근성항목의 목적을 어떻게 해석하느냐에 따라 논쟁의 여지가 많습니다.)
물론, redirect 최종 URL 을 자신의 identity 로 인정하고, 원칙적으로 redirect 를 따라가지 않는 consumer 들이 잘못된 것이니 무시하고, 방문하지 않는 것도 다른 대안일 수 도 있겠습니다. ^^;
당장 이 포럼에 댓글을 쓰려고 했더니만, 이곳도 redirect를 지원하지 않는 듯 해서 하위 디렉토리명까지 적어 주어야 했습니다 ^^
저는 root디렉토리에 index.html 파일에다가
<?php
header ("Location:./wiki");
?>
이렇게 redirect를 시키고 있었는데, 이걸 200 html 출력으로 하라는 건 정확히 어떻게 해야 되는 건지요?
아 그리고, http://www.openidenabled.com/openid/use-your-own-url-as-an-openid/ 이 글의 하단에
Delegation via the HTTP headers is also supported, however, its not widely adopted yet (as of 11/30/2006 sites like LiveJournal do not have support for it) as it requires at least OpenID v1.1 support on the relying party. To do this, you need to add the X-XRDS-Location HTTP header, with it's contents pointing to the location of your XRDS file:
X-XRDS-Location: http://yourname.myopenid.com/xrds
라는 말이 있어서
<?php
header ("X-XRDS-Location: http://raymundo.myid.net/xrds");
header ("Location:./wiki");
?>
이렇게 고쳐봤는데, 제가 잘못한건지 (php나 HTTP 같은 거 잘 몰라서요 =.=;) 아니면 consumer가 지원을 안 해서 그런건지 여전히 안 되는 곳은 안 되더군요.
먼저 나중질문에 답변드리겠습니다.
스펙상 HTTP header 로 delegation 가능합니다. header 와 html 에 모두 있는 경우, header 가 우선이구요. 다만. 사용자가 넣은 문자열을 normalization 완료후에 결과 URL 로 접근된 response 의 header 와 html 을 따라 갑니다. 문제는 이 normalization 과정의 마지막 절차에 모든 서버쪽 redirection 을 모두 따라가는 것이 포함된다는 점입니다. 따라서 위에서 시도하신 방법은 302 redirection 의 response 에 XRDS header 를 넣으신 것으로, (저희도 실험을 해본 결과) 무시됩니다. 결국, 안되는 것이지요 --;
첫번째 질문의 답변은 비교적 잘 알려진 것입니다. html 의 header 블럭안에 meta 와 javascript 로 아래와 같이 지정하시는 것도 한가지 방법입니다. (meta 태그는 javascript 비작동시 대안이구요.)
<head>
<script type='text/javascript'>
document.location.replace('http://you-host/wiki');
</script>
<meta http-equiv='refresh' content="0;url=http://you-host/wiki" />
</head>
물론, client side redirection 기법은 접근성 논란이 가능합니다.

