OAuth - 오픈 API를 위한 인증 표준
May 14th, 2008
오픈 API를 설계할 때 가장 고민되는 부분이 인증이다. 그 이유는 '보안' 때문이다. 일반적인 웹사이트에서는 사용자가 직접 자신이 설정한 암호를 통해 암호를 발급받은 사이트에서 직접 인증한다. 제3자가 이 암호를 알기는 쉽지 않다. 하지만 매시업은 이야기가 전혀 다르다. 대부분의 매시업 애플리케이션들이 사용자를 대신해 인증을 수행한다. 그리고 사용자에게 인증에 필요한 정보를 요구한다.
매시업 개발자들에게 내 암호를 고스란히 알려줘도 될까? 절대 안된다. 내 데이터에 대한 권한은 철저하게 내 관리하에 있어야한다. 여기서 고민이 시작된다.
사용자가 안전하게 매시업을 사용할 수 있도록! (출처)
그래서 많이 사용하는 방식이 개발자에게 애플리케이션키를 발급받게 하고, 사용자는 해당 키를 가진 매시업에 권한을 부여하는 사용자키를 발급받는 식이다. 대부분의 오픈API 제공자들이 이런 방식을 택하고 있다. 하지만 새부 구현을 하나하나 들여다보면 모든 사이트들이 자신들만의 방법이 있다. 일례로 스프링노트는 (농담으로) ias-deepblue 방식을 사용한다. 이는 HTTP Basic Authentication을 사용하되, 사용자명에 사용자 오픈ID, 비밀번호에 애플리케이션키.사용자키를 넣는 방식이다. 어떤 곳은 HTTP 매개변수에 만료 시간이 정해진 토큰을 담기도 한다. 구현 방식을 크게보면 모두 같은데 조금씩 다른 구현체들 탓에 손실이 발생한다.
- 오픈 API 개발자: 보안을 일일이 고려해서 인증 방식을 직접 설계해야 한다. 매우 신중하게.
- 매시업 개발자: 모든 API를 사용하기에 앞서 그들의 인증 방식을 공부하고 이해해야한다.
- 매시업 사용자: 매시업을 사용하는 일이 안전한 것인가 고민해봐야 한다.
DRY를 믿는 우리에게는 악몽같은 일이다. 이 때 생각나는 좋은 단어가 있다. 표준! 그래, 우리에게 필요한 것은 많은 사이트에서 재사용할 수 있는 표준 방식이다. 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를 사용해 매시업을 개발하려한다.
일단, 애플리케이션을 등록해야한다.
그렇게 하면 컨슈머 토큰과 시크릿을 얻을 수 있다. 이 값은 매시업 자체를 인증하기 위한 토큰이다. 나 너네한테 등록한 그 매시업인데 인증 좀 하게 도와줄래?라고 물을 때 이 컨슈머 토큰을 제시하면 된다.
인증의 시작은 리퀘스트 토큰을 얻는 것이다. 하나의 세션을 새롭게 여는 것이라고 봐도 무방하다.
- %w(rubygems oauth oauth/consumer).
- each{|l| require l}
- @consumer = OAuth::Consumer.new \
- CONSUMER_TOKEN, CONSUMER_SECRET,
- :site => "https://api.openmaru.com"
- req_token = @consumer.get_request_token
- # => #<OAuth::RequestToken:0x527114 @token="...", @secret="...">
- %w(rubygems oauth oauth/consumer).
each{|l| require l}
@consumer = OAuth::Consumer.new \
CONSUMER_TOKEN, CONSUMER_SECRET,
:site => "https://api.openmaru.com"
req_token = @consumer.get_request_token
# => #<OAuth::RequestToken:0x527114 @token="...", @secret="...">
이제 다음은 사용자에게 정중하게 허락을 구해야 한다. 당신의 데이터에 제가 접근해도 되겠습니까?
- open_browser req_token.authorize_url
- # => "https://api.openmaru.com/oauth/authorize?oauth_token=t2eh..."
- open_browser req_token.authorize_url
- # => "https://api.openmaru.com/oauth/authorize?oauth_token=t2eh..."
사용자가 허락하면 이 때 매시업은 권한을 담은 토큰을 받아올 수 있다. 바로 액세스 토큰이다.
- access_token = req_token.get_access_token
- => #<OAuth::RequestToken:0x78223 @token="...", @secret="...">
-
access_token = req_token.get_access_token
=> #<OAuth::RequestToken:0x78223 @token="...", @secret="...">
이제 액세스 토큰을 가지고 제한된 리소스를 사용할 수 있게 되었다.
- @consumer.options.merge!(:site => "https://api.springnote.com")
- access_token.get("http://deepblue.springnote.com/pages/1154148.xml?domain=deepblue").body
- => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<page xmlns=\"http://api.springnote.com\">\n..."
- @consumer.options.merge!(:site => "https://api.springnote.com")
- access_token.get("http://deepblue.springnote.com/pages/1154148.xml?domain=deepblue").body
- => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<page xmlns=\"http://api.springnote.com\">\n..."
굵게 표시한 용어들과 위의 4단계만 이해하면 쉽게 오픈 API를 사용할 수 있다. 정리해보자.
- 애플리케이션 등록 => 컨슈머 토큰
- 세션 시작 => 리퀘스트 토큰
- 사용자 동의
- 액세스 토큰 획득
언제나 그렇듯 나도 매시업이 번창하는 리믹스할 수 있는 웹을 꿈꾼다. OAuth가 꿈을 이뤄줄 하나의 발판이 되면 좋겠다.
참고자료
- http://del.icio.us/byblue/oauth
- 액티브 리소스에서 OAuth 사용하기
- SpringnoteResources 0.6 - OAuth, git와 만나다
- 데스크탑 애플리케이션에서의 OAuth 인증
- Whisper - 귓속말 루비 라이브러리
3 Responses to “OAuth - 오픈 API를 위한 인증 표준”
'Software Development > JavaSE&EE' 카테고리의 다른 글
JSP 페이지를 직접 URL로 접근하지 못하게 하려면? (꽁수) (0) | 2009.10.16 |
---|---|
변수명 표기법 종류 (0) | 2009.10.12 |
RuntimeException 의 특성 (0) | 2009.08.12 |
log4j 기본 익히기 (1) | 2009.07.26 |
Java 의 Package Name 내부에 있는 파일 접근 방법 (0) | 2009.07.26 |
May 7th, 2008 at 12:07 PM openapi 를 사이트에 지원 할려고 하는 차에 중요한 인증부분의 해법을 알려주시네요 감사합니다. 혹 추천하는 ruby 인증 프로그램 이라들지 사용법 좀 알려주실수 있을까요?
May 7th, 2008 at 12:07 PM 루비라면 위 예제코드처럼 oauth gem을 사용하시면 쉽게 구현하실 수 있습니다. 프로바이더 구현은 http://humbroll.com/103 이 글이 도움이 되실 것 같습니다.
October 21st, 2008 at 12:47 PM