Outsider's Dev Story

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

Twitter4j로 트위터 사용하기 #1

마이크로 블로깅으로 큰 인기를 얻고 있는 트위터는 거의 모든기능을 OpenAPI로 제공하고 있고 최근엔 그나마 나아졌지만 트위터사이트에서는 별다른 UX적인 편리함을 주는 것이 없기 때문에 대부분의 유저들은 데스크탑 클라이언트 혹은 다른 웹사이트들을 이용해서 트위터를 더 많이 사용하고 있습니다. 이렇게 클라이언트를 만들려면 트위터에서 제공하는 OpenAPI를 이용해서 개발해야 하는데 Twitter는  API문서화가 꽤 잘 되어 있는 편인데다가 다행히도 각 언어별로 상당수의 트위터 라이브러리들이 제공되고 있기에 가져다가 편리하게 쓸 수 있습니다. 이번에 M31 프로젝트를 하면서 Java로 트위터 웹클라이언트를 만들어야 해서 라이브러리들을 둘러 보았지만 Twitter4J를 선택했습니다.

 현재 Java 트위터 라이브러리로는 Twitter4J, java-twitter, jtwitter, Twitter Client의 총 4가지를 존재하고 있습니다. 이 중에서 Twitter4J를 선택한 것은 문서화가 잘 되어 있고, 지속적으로 업데이트가 되고 있기 때문입니다.



OAuth 사용하기
트위터의 외부에서의 인증을 위해서 OAuth를 사용하고 있는데 OAuth사이트에서는 OAuth를 다음과 같이 정의하고 있습니다.

An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications. (데스크탑과 웹어플리케이션에서 간단하고 표준적인 방법으로 안전한 API 인증을 하도록 하는 공개 프로토콜입니다.)

OAuth Logo

OAuth는 Identity 2.0으로 넘어오면서 OpenID와 함께 생겨난 대표적인 인증 표준이라고 할 수 있습니다. API에서 제공되는 것 내에서만 사용했기에 직접 구현한 것은 아니라서 사용했다고 하기는 뭐하지만 어쨌든 OAuth를 사용한 것은 이번이 처음이었습니다. OpenID에 대해서는 이전에 올렸던 글을 참고하시면 되겠습니다.

인증메커니즘 자체도 약간 비슷한 느낌이긴 합니다만 OpenID는 OpenID Provider가 인증을 책임지고 Consumer에서는 아이디만 Provider측에 넘겨주면 Provider가 인증된 결과를 돌려주게 됩니다. Consumer는 인증에 대해서는 전혀 책임지지 않고 로그인인증을 Provider에 위임하게 됩니다. 반면에 OAuth는 좀더 진보된 인증방식이라고 할 수 있습니다.

어떤 기술을 이해하는데는 스펙을 보는 것이 가장 정확하고 좋기는 하지만 영어권이 아닌 저희로써는 영어문서는 울렁증이나서 오래보는것이 만만치 않고 또 개발하면서 봐야할 때는 더욱 그렇습니다. 저도 스펙은 보지 못하고 그냥 여기저기 찾아서 개발을 했습니다. OAuth는 2007년 12월에 OAuth Core 1.0 파이널 드래프트 스펙이 나왔고 2009년 6월 24일 OAuth Core 1.0 Revision A가 발표되었습니다. Beginner’s Guide to OAuth ? Part I: Overview를 보면 대략적인 내용들이 나와있는데 OAuth에 대해 이해하는데 적당히 요약하겠습니다.

사용자들은 여러가지 서비스를 쓰고 있습니다. 사진은 플리커에 쓰고 동영상은 유투브에 쓰는 등 모든 것을 통합한 사이트가 더 최적화된 기능을 제공하지 못하기 때문에 여러가지 서비스를 나누어서 쓰고 있으며 사용자들은 이들을 함께 써서 더 새로운 것을 쓰고 싶어 합니다. 그렇게 하려면 서로간에 접근을 위해서 사용자간의 개인정보(아이디, 패스워드)를 공유해야하는데 이는 보안에 좋지 않기 때문에 보통은 아이디와 비밀번호로 혼합한 키를 사용하는데 대표적인 것이 OpenID입니다. 하지만 이 키는 공유하기에는 너무 강력하고 제한이 없습니다. 또한 이것은 한번 공유된 것을 취소할 수 없어 유일하게 취소할 수 있는 키변경은 특정사이트만 막지 못하고 전체사이트에 대한 접근을 모두 막아야 합니다. OAuth는 대신 토큰을 공유하고 각 토큰은 특정 리소스와 정의된 기간에 대한 특정사이트로의 접근 권한만을 받습니다.
(쓰고 보니 크게 도움될런지 잘 모르겠군요 ㅡ..ㅡ)

아래 이미지가 OAuth의 인증방식에 대해서 이해하기 좋게 잘 정리되어 있어서 퍼왔습니다.

The OAuth process Diagram
Image via sitepen

Service가 인증정보를 가지고 있는 사이트(여기서는 Twitter)이고 User가 Service의 인증정보로 Consumer사이트를 이용하려는 것입니다.

  1. 사용자가 인증을 하려고 하면 Consumer가 Service에 토큰을 요청하고 Service가 토큰을 생성해서 돌려줍니다.
  2. 토큰을 받은 Consumer는 User를 서비스의 인증페이지로 요청토큰과 함께 리다이렉트시킵니다.
  3. User는 Service사이트에서 인증을 하고 Service사이트는 User를 Consumer사이트로 다시 리다이렉트 시킵니다.
  4. Consumer사이트는 엑세스토큰을 서비스에 요청하여 받으면 OAuth의 인증이 완료됩니다.
  5. 이후에는 Consumer가 이 토큰을 이용해서 리소스를 Service에 요청하여 받습니다.
Twitter는 기존의 Basic Auth를 더이상 사용하지 않기로 09년 12월에 발표하고 2010년 6월에 Basic Auth는 deprecation하기로 결정했습니다. 이전에는 사용해 본적이 없어서 그전에는 정확히 어떤 절차로 진행이 되었는지 모르지만 분위기로 보아서는 그 이전에는 서드파티서비스에서 아이디와 패스워드를 직접 입력해서 트위터로그인을 하는 것이 가능했었는데 2009년 4월에 트위터는 Sign in with Twitter기능을 추가하면서 트위터의 인증이 서드파티 사이트로 넘어가는 일이 없도록 OAuth인증을 강화했습니다. 이젠 더이상 서드파티에 직접 트위터의 아이디와 패스워드를 입력하는 것을 권장하지 않고 있습니다. 이는 보안적인 측면에서도 아주 중요한 부분이라고 생각하고 있습니다. 트위터에는 여러가지 유명한 서드파티 서비스들이 많이 좋재하지만 사용자 입장에서는 서드파티의 신뢰성을 판단하기가 쉽지 않기 때문에 그럴듯하게 사이트하나 만들어 놓고 사용자의 아이디와 패스워드를 가로챌수 있다는 의미이기도 합니다. 저도 그렇게 한번 당한적이 있어서 패스워드를 변경해 버렸더랬죠. 너무 많은 트위터 서드파티 서비스가 그런식으로 이용하고 있었기에 아무런 생각도 없이 로그인을 해버렸었습니다. ㅠ..ㅠ



트위터 클라이언트 등록하기
OAuth의 방식을 어느정도 이해했으면 이제 클라이언트 구현전에 트위터 어플리케이션 등록페이지에서 어플리케이션 등록을 해주어야 합니다. 어플리케이션 등록은 그냥 웹폼에서 간단하게 등록할 수 있습니다. 나중에 트위터 클라이언트에서 트윗을 작성했을 때 표시되는 클라이언트이름을 이곳에서 지정해 주게 되고 데스크탑 클라이언트인지 웹서비스인지를 선택해서 등록을 하면 Consumer key와 Consumer secret를 발급받을 수 있고 OAuth인증을 할때 사용합니다. 데스크탑 클라이언트는 만들어보지 않았지만 데스크탑클라이언트로 등록하면 PIN번호라는 것을 발급받게 되는 것 같습니다.



글이 길어져서 둘로 나눕니다. 이 포스팅은  Twitter4j로 트위터 사용하기 #2로 이어집니다.
2010/02/20 03:18 2010/02/20 03:18