블로그 이미지
핑크대지

태그목록

공지사항

최근에 올라온 글

최근에 달린 댓글

글 보관함

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

사용자 관점에서 본 OAuth 인증과정

2008. 8. 28. 14:22 | Posted by 핑크대지

사용자 관점에서 본 OAuth 인증과정

본 문서는 사용자 관점에서 본 OAuth 인증과정을 설명하며, OAuth 공식 홈페이지의 Getting Started Part-2 의 내용을 기반으로 작성되었습니다.


OAuth는 실제 예제로 잘 설명될 수 있습니다. OAuth스팩에 있는 Appendix A와 유사한 예제이지만, 스팩에서는 HTTP 호출 문법에 촛점을 맞춘 반면, 여기에서는 사용자, 컨수머, 그리고 서비스 프로바이더 의 관점에서 OAuth세션을 중심으로 설명합니다.

Flow1g

Jane은 2주동안 스코트랜드의 여행을 마치고 돌아왔습니다. Jane은 여행을 하며 찍은 사진들을 친구들과 공유하고 싶습니다. Jane은 여행 사진을 공유하기 위해 사진 공유사이트인 Faji를 사용 합니다. 그녀는 faji.com에 로그인하고 비공개로 설정한 두장의 사진을 업로드 합니다.

OAuth에서 쓰이는 용어에 따르면 Jane은 사용자이고 Faji는 서비스 프로바이더입니다. Jane이 업로드한 2장의 사진은 보호된 데이터(Protected Resource)가 되겠죠.


Screen1

그녀의 몇몇 친구들과 사진을 공유한 다음, Jane은 그녀의 할머니와도 사진을 공유하려 합니다. 그녀는 희귀한 스코트랜드의 병 사진을 다른사람들과 공유하고 싶지는 않습니다. 하지만 할머니는 인터넷에 접속할 수 없기때문에 Jane은 그 사진을 인쇄해서 할머니에게 보내려 합니다. 이를 위해 Jane은 Beppa라는 온라인 인쇄 서비스를 사용하려 합니다.

OAuth에서 쓰이는 용어에 따르면 Beppa는 컨수머입니다. Jane이 사진을 비공개로 해 놓은 이상, Beppa가 그 사진을 인쇄하기 위해 사진을 얻기 위해서는 OAuth인증을 해야 합니다.

Jane은 beppa.com에 방문하고 인쇄 명령을 내립니다. Beppa는 Faji를 포함한 많은 외부의 사진공유 사이트들에 잇는 사진들을 가져올 수 있도록 지원합니다. Jane은 사진이 있는 곳의 서비스를 선택하고 Continue버튼을 누릅니다.

Screen2

Beppa가 Faji 사진을 가져올 수 있도록 지원하고자 한다면, Beppa 개발자는 Faji의 OAuth인증을 사용하는 API를 사용하기 위하여 Faji로부터 컨수머 키(Consumer Key)컨수머 시크릿(Consumer Secret)을 사전에 받아와야 합니다.

Jane이 Continue버튼을 누른 후, 뒷단에서는 Beppa와 Faji간의 중요한 일들이 일어납니다. Beppa는 Faji에게 리퀘스트 토큰(Request Token)을 요청합니다. 이 때, 리퀘스트 토큰(Request Token)사용자와는 전혀 상관이 없으며, Beppa가 Faji에 있는 Jane의 비공개 사진에 접근하는 것을 승인하기 위하여 사용될 뿐입니다.


Flow2g

Jane은 Continue버튼을 누르고 화면이 바뀌길 기다립니다.

Beppa가 리퀘스트 토큰(Request Token)을 받으면, Faji의 OAuth 사용자 인증 URL로 방금 받은 리퀘스트 토큰(Request Token)과 함께 리다이렉트 시키고, Jane이 승인을 하면 http://beppa.com/order로 되돌아오게 할 것을 요청합니다.

Jane은 Faji로 리다이렉트되고 사이트에 로그인할 것을 요청받습니다. OAuth는 서비스 프로바이더가 먼저 사용자를 인증하고, 컨수머에게 접근권한을 줄 것인지 승인을 받습니다.

Jane은 브라우저에 있는 URL을 통해 그녀는 지금 Faji사이트에 있다는 것을 알게 되며, 아이디와 비밀번호를 입력합니다.

Screen3

OAuth는 Jane이 그녀의 아이디와 비밀번호를 Beppa나 다른 사이트들이 공유하지 않게끔 해줍니다. Jane이 그녀의 faji에 대한 비밀정보(아이디,비밀번호)를 beppa.com에 입력하는 과정이 없기 때문이죠.

Faji에서 로그인에 성공하면, Jane은 Beppa에게 Faji에 접근할 수 있는 권한을 부여하기 위한 승인을 하게 됩니다. Faji는 Jane에게 누가 접근요청을 하는지(여기서는 Beppa가 되겠죠) 알려주며 승인을 할 것인지 묻습니다. Jane은 승낙하거나 거절할 수 있습니다.

Jane은 Beppa가 필요한 만큼만 제한적으로 접근할 수 있게 해줍니다. 그녀는 Beppa가 그녀의 사진을 수정하거나 다른 일들을 하는 것을 원하지 않습니다. 또한, Beppa가 Faji에 있는 그녀의 사진을 가져오는데는 1시간이면 충분하다는 것을 알고 있습니다.

Screen4

Jane이 요청을 승낙하면 Faji는 리퀘스트 토큰(Request Token)을  Jane으로부터 "사용자 승인이 된" 토큰으로 표시합니다. Jane의 브라우저는 리퀘스트 토큰(Request Token)과 함께 보내온 http://beppa.com/order 주소로 리다이렉트 시킵니다. 이는 Beppa가 Jane의 사진을 가져오는 작업을 계속 할 수 있다는 것을 알려주는 것입니다.

Jane은 Beppa가 Faji 계정으로부터 사진을 가져오는 것을 기다립니다.

Screen5

Jane이 기다리는 동안, Beppa는 인증된 리퀘스트 토큰(Request Toekn)액세스 토큰(Access Token)을 교환홥니다. 리퀘스트 토큰(Request Token)은 사용자의 승인을 얻어내기 위해 사용될 뿐이며, 액세스 토큰(Access Token)보호된 자원(Protected Resource : 여기에서는 Jane의 사진이 되겠죠)에 접근하기 위해 사용됩니다. 첫 번째 요청에서, Beppa는 리퀘스트 토큰(Request Token)액세스 토큰(Access Token)으로 바꾸고, 두 번째로 사진을 요청(여러번 요청이 될 수 있겠죠. 한번은 사진의 리스트를, 다른한번은 각 사진을 가지고 오는 등...)합니다.

Flow3g


Beppa가 작업을 마치면 Jane의 브라우저는 작업을 다 마쳤음을 보여주는 화면으로 바뀝니다.

Beppa는 성공적으로 Jane의 사진을 가져왔습니다. 그녀의 사진을 선택할 수 있도록 썸네일로 보여줍니다.

Jane은 Beppa가 그녀의 아이디와 비밀번호를 모르는데도 불구하고 그녀의 사진을 가져왓다는 것에 놀랍니다. 그녀는 화면에서 시키는데로 인쇄요청을 합니다.

Screen6



여기까지 사용자 관점에서 본 OAuth 인증과정을 살펴보았습니다. 이제 이러한 인증과정에 맞춘 컨수머 개발을 하기 위해서 OAuth프로토콜 관점에서본 OAuth인증 과정을 살표보시기 바랍니다.(보러가기)

OAuth - 오픈 API를 위한 인증 표준

2008. 8. 28. 14:12 | Posted by 핑크대지

오픈 API를 설계할 때 가장 고민되는 부분이 인증이다. 그 이유는 '보안' 때문이다. 일반적인 웹사이트에서는 사용자가 직접 자신이 설정한 암호를 통해 암호를 발급받은 사이트에서 직접 인증한다. 제3자가 이 암호를 알기는 쉽지 않다. 하지만 매시업은 이야기가 전혀 다르다. 대부분의 매시업 애플리케이션들이 사용자를 대신해 인증을 수행한다. 그리고 사용자에게 인증에 필요한 정보를 요구한다.


매시업 개발자들에게 내 암호를 고스란히 알려줘도 될까? 절대 안된다. 내 데이터에 대한 권한은 철저하게 내 관리하에 있어야한다. 여기서 고민이 시작된다.


48/182645566_104bea290c.jpg

사용자가 안전하게 매시업을 사용할 수 있도록! (출처)


그래서 많이 사용하는 방식이 개발자에게 애플리케이션키를 발급받게 하고, 사용자는 해당 키를 가진 매시업에 권한을 부여하는 사용자키를 발급받는 식이다. 대부분의 오픈API 제공자들이 이런 방식을 택하고 있다. 하지만 새부 구현을 하나하나 들여다보면 모든 사이트들이 자신들만의 방법이 있다. 일례로 스프링노트는 (농담으로) ias-deepblue 방식을 사용한다. 이는 HTTP Basic Authentication을 사용하되, 사용자명에 사용자 오픈ID, 비밀번호에 애플리케이션키.사용자키를 넣는 방식이다. 어떤 곳은 HTTP 매개변수에 만료 시간이 정해진 토큰을 담기도 한다. 구현 방식을 크게보면 모두 같은데 조금씩 다른 구현체들 탓에 손실이 발생한다.


  • 오픈 API 개발자: 보안을 일일이 고려해서 인증 방식을 직접 설계해야 한다. 매우 신중하게.
  • 매시업 개발자: 모든 API를 사용하기에 앞서 그들의 인증 방식을 공부하고 이해해야한다.
  • 매시업 사용자: 매시업을 사용하는 일이 안전한 것인가 고민해봐야 한다.

1066963360.pngDRY를 믿는 우리에게는 악몽같은 일이다. 이 때 생각나는 좋은 단어가 있다. 표준! 그래, 우리에게 필요한 것은 많은 사이트에서 재사용할 수 있는 표준 방식이다. OAuth가 답이다! OAuth는 기존 API 인증 방식들의 베스트 프랙티스를 모아 하나의 안으로 만든 것이다. OAuth를 도입하면,


  • 오픈 API 개발자: 선배들이 보안과 여러가지 사용자 경험을 고려해 설계한 내용을 토대로 짧은 시간에 더 나은 API를 설계할 수 있다.
  • 매시업 개발자: 하나의 표준만 이해하면 오픈 API를 쉽게 사용할 수 있다. 진입 장벽이 낮아진다.
  • 매시업 사용자: 믿고 쓸 수 있다.

공식 사이트의 소개문에 한번 읽어볼만한 내용이 있어서 인용한다.


Is OAuth a New Concept?


No. OAuth is the standardization and combined wisdom of many well established industry protocols. It is similar to other protocols currently in use (Google AuthSub, AOL OpenAuth, Yahoo BBAuth, Upcoming API, Flickr API, Amazon Web Services API, etc). Each protocol provides a proprietary method for exchanging user credentials for an access token or ticker. OAuth was created by carefully studying each of these protocols and extracting the best practices and commonality that will allow new implementations as well as a smooth transition for existing services to support OAuth.


오픈마루는 앞으로 OAuth를 적극 지원할 예정이다. 기존의 모든 API가 다 바뀔 수는 없겠지만, 지금 새로운 오픈 API를 설계하고 있다면 OAuth를 꼭 한번씩 고려해주길 바란다.


OAuth 띄엄띄엄 보기

간단하게 OAuth를 살펴보자. 스프링노트 API를 사용해 매시업을 개발하려한다.


일단, 애플리케이션을 등록해야한다.


그림_1.png


그렇게 하면 컨슈머 토큰과 시크릿을 얻을 수 있다. 이 값은 매시업 자체를 인증하기 위한 토큰이다. 나 너네한테 등록한 그 매시업인데 인증 좀 하게 도와줄래?라고 물을 때 이 컨슈머 토큰을 제시하면 된다.


그림_2.png


인증의 시작은 리퀘스트 토큰을 얻는 것이다. 하나의 세션을 새롭게 여는 것이라고 봐도 무방하다.


  1. %w(rubygems oauth oauth/consumer).  
  2.   each{|l| require l}  
  3.  
  4. @consumer = OAuth::Consumer.new \  
  5.   CONSUMER_TOKEN, CONSUMER_SECRET,  
  6.   :site => "https://api.openmaru.com" 
  7.  
  8. req_token = @consumer.get_request_token  
  9. # => #<OAuth::RequestToken:0x527114 @token="...", @secret="..."> 

이제 다음은 사용자에게 정중하게 허락을 구해야 한다. 당신의 데이터에 제가 접근해도 되겠습니까?


  1. open_browser req_token.authorize_url  
  2. # => "https://api.openmaru.com/oauth/authorize?oauth_token=t2eh..." 

그림_3.png


사용자가 허락하면 이 때 매시업은 권한을 담은 토큰을 받아올 수 있다. 바로 액세스 토큰이다.


  1. access_token = req_token.get_access_token  
  2. => #<OAuth::RequestToken:0x78223 @token="...", @secret="...">  

이제 액세스 토큰을 가지고 제한된 리소스를 사용할 수 있게 되었다.


  1. @consumer.options.merge!(:site => "https://api.springnote.com")  
  2.    
  3. access_token.get("http://deepblue.springnote.com/pages/1154148.xml?domain=deepblue").body  
  4. => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<page xmlns=\"http://api.springnote.com\">\n..." 

굵게 표시한 용어들과 위의 4단계만 이해하면 쉽게 오픈 API를 사용할 수 있다. 정리해보자.


  1. 애플리케이션 등록 => 컨슈머 토큰
  2. 세션 시작 => 리퀘스트 토큰
  3. 사용자 동의
  4. 액세스 토큰 획득

언제나 그렇듯 나도 매시업이 번창하는 리믹스할 수 있는 웹을 꿈꾼다. OAuth가 꿈을 이뤄줄 하나의 발판이 되면 좋겠다.