Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Java로 OpenID Consumer 서비스 구현하기 #1 : OpenID란?

지난 번에 얘기하는 데로 진행중인 프로젝트에서 주민등록번호를 빼고 어찌하다보니 OpenID를 도입하게 되었다. 빡빡한 일정에 4일만에 구현해야 하는 상황... 너무 단순히 생각하고 얘기를 했던 것인지 그리 만만해 보이지는 않았다. 일단 OpenID에 대해서 보자... 알아야 구현을 하든지 말든지...

OpenID Logo
Web 2.0에서 Identity 2.0이 거론 되면서 항상 같이 나오는 것이 OpenIDOAuth이다. OepnID에 대해서는 어느정도 알고 있었지만 솔직히 OAuth에 대해서는 이름만 들어봤을 뿐 거의 아는 바가 없다.


OpenID를 알게 되었을 때부터 그 개념이 맘에 들었고(각 사이트들이 주민등록번호를 받는것이 애초부터 맘에 안들었었기 때문에...) myID가 생긴 이래는 죽~ 써오고 있다. 물론 오픈아이디로 사용할 수 있는 사이트가 그리 많은 것은 아니지만... ㅎㅎㅎ 하지만 이번에 준비를 하면서 여러 자료를 찾다 보니 내가 알고 있는 것은 아주 기초적인 개념 뿐이었다. 관련 이슈도 거의 알지 못했고....

내가 알고 있던 거는 OpenID가 기술 표준이고 각 사이트는 도메인형태의 오픈아이디를 넘기면 아이디를 이용해서 OpenID서버쪽에서 인증을 대신해서 인증결과만 넘겨주는 것이다. 같은 정보를 수십가지의 사이트에 넣을 필요도 없고 문제가 새겼을때 일일이 비밀번호를 바꾸러 돌아다닐 필요도 없다. 일단 주민등록 번호자체가 안들어가니까 큰 문제도 없고..... 웹 1.0시대에는 회원수가 곡 사이트판매 가격을 결정지었기 때문에 회원이 허위인지 아닌지가 무척 중요했고 그랬기 때문에 진위여부를 판단하려 들었다. 이 풍토가 그대로 남아 조그만한 사이트까지도 주민등록번호에 주소에 전화번호까지 다 받으려고 하고 있고 그에 따른 개인정보 유출이 심해지는데 여기에 오픈아이디는 꽤나 흥미롭다. 주민등록번호가 없어서 문제가 되면 해외사이트는 다 망했지.. ㅋㅋ




일단 개발하기전에 개념을 확실히 이해할 필요가 있어서 자료를 모았다. 국내에는 OpenID 커뮤니티한국OpenID 사이트가 있다. 굳이 사이트가 2개나 운영될 만큼 활발한 것 같지는 않지만 어쨌든 2개가 존재하고 있다. 글이 아주 많은 것은 아니지만 OpenID에 대한 전파를 하고 오해가 없도록 해결하고 각종 표준문서와 기술문서를 제공해서 OpenID가 더욱 보급되도록 노력하고 있다.


개발을 하려면 무엇인지부터 이해를 해야한다. OpenID는 아이덴티티 2.0을 표방하는 새로운 인증시스템(?)에 대한 표준기술이다. 나는 오픈아이디를 제공하는 곳에서 오픈아이디를 만들고 내 오픈아이디를 가지고 오픈아이디를 지원하는 다른 사이트에 가입을 한다. 사이트에는 오픈아이디만 입력하고 비밀번호 인증은 오픈아이디를 제공하는 곳에서 인증을 해주고 사이트가 요청한 정보를 내 허락하에 사이트에 넘긴다. 비밀번호 관리를 한 곳에서 할 수 있다는 편리함과 사이트를 이용하기 위해서 무분별하고 불편한 가입이 적어져서 개인정보를 유출의 위험속에 내놓지 않을 수 있게 된다. 각 사이트마다 다른 아이디를 쓰는 것이 아니라 하나의 오픈아이디를 통해서 웹전체에서 사용함으로써 온라인에서의 하나의 아이덴티티를 갖는 역할도 할수 있다.(물론 여러개를 만들수도 있지만...)





OpenID는(내가 이번에 짧은 시간동안 공부하면서 이해한 거라서 약간의 실수나 오류가 있을 수도 있다.) End-User와 Consumer, Provider로 나뉜다.

  • End-User는 말그대로 OpenID를 이용해서 접속하려고 하는 사용자를 말한다.
  • Consumer는 OpenID를 통해서 자신의 사이트에(End-User가 접속하려는 사이트) 로그인할 수 있게 제공하는 사이트쪽을 말하고 RP 즉 Relying Party라고도 부른다. 국내에서는 Textcube, ZeroboardXE, 스프링노트, 라이프팟 등이 이에 속한다.)
  • Provider는 OpenID의 인증을 담당하는 서버측을 얘기한다. OpenID Provider(OP)라고 하면 Identity Provider라고 해서 IdP라고도 부른다. RP측에서 OpenID를 넘겨주면 End-User로부터 비밀번호를 받아서 인증을 하고 결과값을 다시 RP측으로 넘겨준다.




OpenID는 우리가 흔히보는 URL형태로 되어 있다.(정확히는 URI라고 해야 하나?) rockdoli.myid.net과 같은 형태로 사용하고 실제로 RP나 OP는 이걸 http://rockdoli.myid.net/ 과 같은 형태로 바꾸어서 사용한다.(Normalized Indetifier) rockdoli가 내 아이디를 뜻하고 myid.net가 내 오픈아이디를 인중해줄 OP를 나타내고 있다. 이런 형태가 일반적이고 몇몇 사이트들은 domain.com/id 같은 형태를 사용하기도 한다.

OpenID사용 사이트에 대해서는 국내 OpenID사이트에 올라온 글에서 확인을 할 수 있다.


그럼 어떻게 인증을 하는가? 다음 그림을 보면 약간 이해가 될지도 모르겠다.

OpenID Authentication Flow

출처 : http://www.devx.com/opensource/Article/37692

  1. End User가 RP 사이트에 OpenID를 입력한다.
  2. RP는 OpenID를 분석해서 OP의 주소를 찾아낸다.(Normalize)
  3. RP와 OP가 통신을 한다.
  4. RP가 엔드유저를 OP로 리다이렉트 시킨다.
  5. 엔드유저가 OP에 접속해서 인증절차를 거친다.
  6. OP가 필요한 정보를 엔드유저에게 담아서 다시 RP로 리다이렉트 시킨다.
  7. RP는 자신이 가지고 있던 키(?)와 엔드유저가 OP로 부터 받아온 키를 비교해서 인증을 허락한다.

어려운건 잘 모르겠다. 대충 얘기하자면 이런 순서로 걸쳐기고 RP와 OP가 직접 정보를 주고 받지 않기(확실한건지는 모르겠다. 스펙을 다 본게 아니라.. ㅡ..ㅡ) 보안에 비교적 안전하다.



다음은 OpenID 1.1의 Protocol Flow이다.

OpenID 1.1 Protocol Flow

http://openid.net/pres/protocolflow-1.1.png

TheServerSide.com에도 OpenID의 인증과정에 대해서 상당히 자세히 나와있다. 많은 기술적인 부분까지 자세히 설명하고 있기 때문에 다 이해를 못하더라도 꽤 도움이 되었다. (OpenID가 꽤 보급되고 있다고 생각했음에도 아직 국내자료는 많이 부족하다. 별수 없다. 그냥 영어보는 수밖에...)

다음은 OpenID 관련 링크들이다.

어떻게 작동하나?  - OpenID커뮤니티의 OpenID에 대한 설명

OpenID 관련 스펙들  - 이상하게 IE7에서는 그냥 하얗게만 나온다. Firefox에서는 잘나온다.(인코딩만 UTF-8로 바꿔주면.. ㅡ..ㅡ) 나도 잘 그러지 못하지만 역시 중요한 순간에는 스펙을 확인하는건 상당히 중요하다고 생각한다. 많은 분들의 노력으로 기대이상으로 한글화도 꽤 되어 있다. (해외사이트는 여기 )

OpenID 에 대한 큰 오해 - UN 여권이 아닙니다.: kayflow님의 OpenID관련 오해에 대한 글

Relying Party Best Practices (ko) - 실제 구현에 관한 부분은 아니지만 OpenID Consumer를 구축할 때 정책적으로 결정해야 할 부분에 대해서 어떤 정책으로 어떤 기능을 구현해야 할지 자세히 설명해 주고 있고 OpenID가 추구하려는 사상(?)에 대해 잘 얘기해 주고 있다고 생각한다. OpenID 서비스라면 이런 기능을 제공해라! 정도랄까?

OpenID가 가져오는 시스템의 변화 - OpenID를 적용해봐야지 하고 실제하려고 할때 드는 여러가지 생각들을 최호진님이 정리해 주신 내용. OpenID를 구현하려고 하면 비슷한 고민들을 가지게 되더라는;;;;

OpenID 라이브러리  -  라이브러리 리스트! C#, C++, Java, Perl, Phthon, Ruby, PHP, Coldfusion 등 대부분의 언어의 라이브러리를 제공하고 있다.

OpenID.net의 개발자 가이드 - 내용이 너무 많고 순 영어긴 하지만 디비에 대한 구분까지 꽤나 구체적으로 얘기해주고 있다. 영어 되시는 분들은.... 보세요.. ㅎ




사이트가 RP의 역할을 하려고 하면 OpenID 보급에 적극적인 자세를 띄고 있는 myID가 괜찮은 프로그램을 가지고 있다. Joint Singup 이라는 프로그램이다. 간단한 등록정보만으로 회원가입, 로그인, 안내페이지를 제공해 주고 몇번 문의를 했었는데 답변도 상당히 빠른 편이다. 아직 다 적용르 해보진 않았지만 이걸 사용해도 사이트에 구현을 해야하는 부분이 있지만 확실히 훨씬 편리한 프로세스로 적용을 시킬 수 있다.



신청하면 위와같은 OpenID에 프로토콜에 대한 이해를 돕는 파워포인트를 제공해 준다. 아주 이쁘게 제작된건 아니지만 OpenID에 적용하는 데 이해를 도울 많은 정보를 담고 있다.

오픈아이디에 대해서 알고 있다고 생각했지만 자료를 찾다 보니 내가 알고 있던 부분은 극히 일부분일 뿐이고 상당히 많은 부분을 담고 있었다.(여전히 모르는 부분이 더 많지만...) 이것저것 자료를 참고하다보니 오픈아이디의 방식에 대해서 많이 알게 되었고 생각지 못했던 오픈아이디가 가지고 있는 이슈들에 대해서도 알게 되었다. 원래는 코딩에 대한 부분을 쓰려고 했는데 그냥 냅다 쓰기보다는 개념 정리가 좀 필요할 듯해서....


덧) 몇일뒤에 쓸지 모르지만 consumer 구현은 속편에서.. ㅎㅎㅎ

덧) 잘못된 부분있으면 말씀해 주세요.. ㅜ..ㅜ
2008/07/08 02:27 2008/07/08 02:27