OpenID와 관련해서 지난번 글 말미에 환상을 품을 만한 실험에 대해 얘기했습니다. 사실, 낚시성 멘트였구요. 환상 정도는 아니지만, 재밌는 실험입니다.

1.
스패머들이 자신의 주소를 숨기기 위해 야후를 사용했던 방식을 이용한 방식으로 신뢰하는 도메인을 야후로 만들어 보겠습니다.

2.
지난 글에서 단일 사용자 로그인을 수행하는 OpenID의 질문중에 세번째로 인증 정보를 전달할 도메인을 확인하는 과정이 있다고 하였습니다. 인증정보를 확인하기 위한 질문까지 가기위해서 로그인사이트(이하 RP; Relying Party;Consumer site)에서는 OpenID를 접수 받고서, OpenID의 발급자(이하 IdP; ID Provider)에게 페이지를 리다이렉트합니다. 대개 사용하시는 분들은, 아이디는 로그인사이트에 넣지만, 비밀번호는 항상 발급자 홈페이지에 넣기 때문에 안심(?)스러운 광경을 연출되는 것을 보게 됩니다.

물론, 연출만이 아니라 모든 인증이 끝난 뒤에도, 실제로 비밀번호는 RP 사이트에 전달되지 않기 때문에 안심이죠.

3.
이렇게 비밀번호를 확인하고 마지막 단계로, RP 사이트에 대한 "신뢰하는 root url"을 보여주게 되고, 이 사이트가 정말 당신이 로그인하고 있는 사이트가 맞는지 확인하는 작업을 수행합니다. 사이트를 1회만 승인하던, 계속 승인하던간에 IdP에서는 RP로 다시 리다이렉트를 하게 됩니다. 이것은 처음 IdP로 건너 올 때, 되돌아갈 위치를 return_to라는 변수에 실어왔기 때문에 가능한 것입니다.

만약, 많은 사람들이 현재 사용하는 me2day나 스프링노트를 항상 승인하도록 설정해둔다면, 사이트에서 오픈아이디를 도입하고자 하는 개발자가 신뢰하는 root url을 me2day 로 해 놓고, 승인 시도를 하게된다면, 마지막 단계없이 로그인 할 수 있지 않겠습니까? 그러나, 이 경우에는 return_to의 url과 신뢰하는 root가 다른 hostname을 갖게 됩니다. 이에 대한 간단한 내용이 사양서의 노트에 기록되어 있지요.
The openid.return_to URL MUST descend from the openid.trust_root, or the Identity Provider SHOULD return an error. Namely, the URL scheme and port MUST match.
즉, 최종적으로 신뢰한 사이트를 돌려 받을 주소(return_to)는 반드시 trust_root로 부터 만들어져야하는 것입니다. 예를 들어,
trust_root=http://www.me2day.net&return_to=http://myservice.org/openid/finish
와 같은 방법으로 앞뒤를 다르게 서비스를 개설할 수 없다는 것입니다.

4.
서문이 너무 길었군요. 다시 처음에 언급한 야후를 이용하여 송신지를 숨기는 스패머들 얘기를 꺼내 보겠습니다. 야후에서 검색을 하고 난 결과 목록에서 원하는 링크를 누르면, 항상 다시 야후로 간다음 목적지로 리다이렉트 됩니다. 편의상 이것을 YR-Hack(Yahoo redirection hack) 이라고 합시다. 아마도, 이 YR핵은 통계를 내거나 클릭 기반의 데이터를 쌓아서 다음 결과에 반영하려고 그런것인지는 잘 모르겠습니다만, 다음과 같은 테스트를 해볼 수 있습니다.
http://rds.yahoo.com/*-http://coolengineer.com/
위와 같이 야후를 이용하여 제 홈에 오는 방법이 가능합니다. 아차!

5.
그럼 신뢰하는 root url을 rds.yahoo.com 혹은 *.yahoo.com 으로 한다면, 야후로 승인받고, 제 홈에 올 수 있다는 얘기 아닙니까. 예를 들면,
trust_root=http://*.yahoo.com/&return_to=http://rds.yahoo.com/*-http://myservice.org/openid/finish
와 같은 형식으로 하면, trust domain을 yahoo로 하고 return_to 에 씌여지는 url이 정상적으로 동작하는 것이라면, 그 앞에 http://rds.yahoo.com/*- 을 붙여주면, myservice.org 서비스에 로그인이 가능하게 됩니다.

자,자, 무슨 얘기인지 차근차근 따져봅시다. YR 핵의 핵심은 rds.yahoo.com 서버가 하는 일은 단지 "*-" 뒤에 있는 페이지로 redirection한다는 것이고, 이 서비스를 이용하면, trust 경로를 yahoo로 할 수 있다는 것인데. 일반적으로 사이트에서 오픈아이디를 지원하려면, 굳이 야후로 할 이유가 없습니다. 그러나, 악의적으로 사이트를 개설하고, 오픈아이디를 로그인 하도록 만들어 놓았는데, 신뢰하는 사이트가 야후로 보인다면? 자신의 신상 정보를 쉽사리 줄 수가 있겠지요. 보안에 취약해지는 부분입니다. 물론, 이런 YR 핵을 이용하여 만든 것들이 얼마나 퍼질지는 모르겠습니다.

6.
자, 환상은 무엇이고 재미는 무엇이란 말입니까?

환상은 분산환경에서 단일 사용자 로그인(SSO)을 구현해 봄직한 구멍이 보인다는 것입니다.지난 글과 서두에 언급한 세번째 질문을 처음가는 사이트라 할 지라도 비슷한 사이트에서 승인처리를 해놓았다면 야후라는 이름으로 승인될 수 있다는 것입니다.

재미는 무엇입니까? 야후 기록만 살펴봐도 어디에 누가 깔려 얼마나 많은 사용자가 로그인하고 있는지 알 수 있다는 것입니다. 분산환경에서 집중화된 로그인 기록!

자, 우리 대화를 YR 핵 대신 서비스를 만드는 사람이 중앙에서 리다이렉션해주는, 이런 비슷한 처리하는 서버를 두는 것으로 바꾸고 생각해봅시다.

환상과 재미가 취약한 보안(?)과 함께 느껴지시나요?

기회가 되면 적용할만한 꺼리와 보안을 고려하여 좀 익은다음 뒷 얘기를 더 해보겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 하늘이 2007.04.09 15:51

    오오오오...+_+)=b 흥미진진한 글 잘 읽었습니다!

    • 최호진 2007.04.09 18:56

      너무 감동하시는거 아니에욧! ^^;

      감사합니다. 이렇게 댓글을 달아 주시니 늘 읽던 씨이오 블로그가 갑자기 양방향이 된 듯한 느낌입니다.

  2. http://coolengineer.com/tt 2007.04.11 00:26

    많이 어렵습니다 ;;

  3. 유역비 2007.04.11 11:37

    consumer측에서 OpenID 로그인인 한후에 consumer쪽에서 로그아웃을 하게되면, 보통 세션을 날리는거 같은데요, 그렇게되면, Provider쪽에는 아직 로그인 상태로 남아있어서, 아이디만 알고 OpenID유효한 시간이면, 누구라도 Provider쪽 마이페이지로 접근가능하네요? Provider쪽도 같이 로그아웃 시키는 방법은 없나요?

    • coolengineer 2007.04.11 19:25

      Consumer 는 한 둘이 아니고, 동시에 여러곳에 로그인될 수도 있습니다. 이런 경우라면 아주 복잡해지지 않을까요?
      Provider에서 로그아웃하면 Consumer 사이트들도 모두 로그아웃해야하는 상황도 상상가능하죠...

      사실상, Provider와 Consumer는 인증 외에는 별개의 사이트로 뭔가 주고 받는 것이 전혀 없답니다.

  4. MilKyWAY 2007.04.19 12:44

    히잉.. 어려워요 ㅡㅡ;;

  5. ayo 2007.05.16 12:51

    재미있는 아이디어네요^^ 실험해봐야겠습니다~

    • 최호진 2007.05.16 19:17

      RSS로 먼저 읽고나서 댓글이 달린 것을 알았습니다. ^^
      사실, 곳곳에 깔려 있는 태터툴즈의 싱글 사인온을 궁리하다가 생각해낸 것이었습니다만..
      이렇게 하지 않아야 윤리적인것 같고, 인증 영역에 대한 개념을 해치지 않는 것 같습니다.

  6. komunamu.myid.net 2007.05.17 00:43

    흥미 있는 글 잘 읽었습니다. 미국쪽 사이트에서는 아직 못본 내용인것 같은데 영문으로 올리시는건 어떤지 모르겠습니다. 사용자에게 SP사이트에 대한 신뢰여부를 물을때 CardSpace 처럼 SP 의 Certificate에 대한 Verification 결과를 명확하게 보여주는 기능이 OpenID에 추가되어야 하지 않을까 생각이 드네요. 그럼 너무 무거워지나요?

    • 최호진 2007.05.21 05:22

      비슷한 내용이 논의 된 것을 OpenID 쪽 메일링 리스트에서 읽은 적이 있습니다. 저야 테스트를 해보았으니 정리된 문장이 바로 이해되었는데, 처음 토론하였던 쓰레드는 찾을 생각도 안했군요.

    • 최호진 2007.05.21 05:25

      어쩌면, SP입장에서 Verification당한다고 생각하면, 사용률이 뚝떨어질것 같습니다.
      passport가 그런 결과아니었을까요?

  7. BlueWorld 2007.05.17 11:23

    흥미로운 글이네요 ^^
    문제점은 있는데 해결이 아직 안되었으니 일단 로그인시 조심해야겠네요 ^^

    • 최호진 2007.05.21 05:28

      네, 조심해야하죠. 그러나, 유명(?)한 사이트에서 trust root를 만들때 조심만해주면 사용자 모르게 넘어가는 일은 없을 겁니다. 위의 예에서도 야후가 기본적으로 *.yahoo.com 으로 trust root를 배포한적이 없으면 다른 사이트에서도 모르게 이용할 수는 없겠지요.
      그래도.. yahoo를 사칭할 수 있다는 점에서는 머리굴리는 사람에게는 홀이 보일지도.

  8. 2007.05.31 14:03

    비밀댓글입니다

+ Recent posts