'Software Development/JavaSE&EE'에 해당되는 글 24건


오픈 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가 꿈을 이뤄줄 하나의 발판이 되면 좋겠다.

 

참고자료

 

3 Responses to “OAuth - 오픈 API를 위한 인증 표준”

  1. 우주 Says:
    openapi 를 사이트에 지원 할려고 하는 차에 중요한 인증부분의 해법을 알려주시네요 감사합니다. 혹 추천하는 ruby 인증 프로그램 이라들지 사용법 좀 알려주실수 있을까요?
  2. deepblue Says:
    루비라면 위 예제코드처럼 oauth gem을 사용하시면 쉽게 구현하실 수 있습니다. 프로바이더 구현은 http://humbroll.com/103 이 글이 도움이 되실 것 같습니다.
  3. 스프링로그 Says:
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,
 Exception 중에, 다른 Exception 은, throw 할 때, 해당 함수가 public void someFunction() throws XXXException 처럼, throws 를 반드시 명시해야 하지만, RuntimeException 은, 함수가 throws 를 정의하지 않아도 에러가 나지 않는다. 특수한 속성이 있어서 그런 듯 하다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,



1. Prologue

 JAVA 개발하면서, log4j 를 모르는 사람은 없을듯 하다. 그만큼 오래전부터 사용 해 왔고, 성능또한 검증이 되었고, 사용법도 그리 어렵지 않아서인 듯 하다. 실제로 많은 오픈소스 프레임웍이나 라이브러리에서, log4j 에 dependency 를 걸고 있는 것만 보아도 그렇다.

 사내 프레임워크의 경우, log4j 를 사용하지는 않지만, Concept 을 다소 가져다가 쓰는 부분들이 있다. 하지만 사실 설정이나 사용 편의성, 기능의 확장성 등의 측면에서, 사내 프레임웍이 조금은 나은 듯 하기도 하다. Log4J 는 Inherit 개념으로 인해 살짝 불필요한 고민을 아키텍트나 개발자가 하게 만드는 것 같다.

 뭐 아직 많이 사용해보지는 않았으니, 내가 잘 모르는 뭔가가 있을수도..

 이번 Log4J 를 분석해가면서 한가지 원칙을 정한게 있다. "책은 안본다" 라는 원칙인데, 공부하기 싫다는건 아니고, 오픈소스 라이브러리들이 대부분 보면, Help 가 빈약하다는 느낌이다. 이것저것 쓰다보면, 안그래도 좋지않은 머리가 사용법을 다 기억하고 있는것도 아니고, Help 를 봐가면서 작업해야 하는데, MSDN 처럼 정리된 Help 가 있는것도 아니라서 난감할 때가 한두번이 아니다.

 책을 보면, 참 친절하게 설명하고는 있으나, 책 보면서 하려면, 책 없으면 못한다라는 결론이 내려져서, 이번부터는 책 없이 해보려 한다. 그래서, 여기저기를 뒤져가면서 (아 왜 지들이 만들고 사용법은 신경을 안서 그랴..) 나만의 사용법 등을 정리 해 나가기로 했다.

2. 설치 및 관련 파일

 log4j 는 apache 의 logging 프로젝트로 들어가면 된다. logging.apache.org 들어가면, log4j, log4cxx, log4net 등이 있고, 현재는 log4php 가 incubation 상태이다.

  log4j 1.2 버전을 받고 (1.3은 중단됐고, 2.0은 실험용이란다), 압축을 푼다. 현재 최신 버전은 1.2.15 버전이다.
요놈을 받아서 풀면, 아래와 같은 디렉토리 나오겠다.


- contribs 에는, 개발한 애들의 이름 밑에, 갸들의 샘플 코드들이 있고 (나중에 시간나면 뭔 코든지나 좀 살펴봐야 할듯)
- examples 에는, 샘플이 있긴 한데, 정말 별 쓰잘떼기 없는 샘플들이다. 특히, 난 lf5 밑에 있는 코드들이 예시를 든 잘된 코드구나.. 생각했드니만, 죄다 log force 5 라는 로그 보여주는, 패키지 내의 툴을 띄워서 보여줄 목적으로 만든 코드들이다.
- site 는, 지들 사이트의 문서들을 offline 에서 볼수있도록 해놓은 것들이고. (introduction 과 API 만 볼만함)
- src 는 log4j 의 소스코드
- tests 는 지들의 log4j 라이브러리 테스트 코드들을 넣어놨다. 그런데, 대부분의 properties 및 XML 설정파일들이 여기에 가지별로 있다. 하지만, XML 내에 어떤 element 가 어떤것인지는 안써있다는거~

나머지 뭐 빌드하고 자시고 할 것 없이, Eclipse 에 프로젝트 만들어서 Sample 몇개 돌려보면 될것이다. 어차피 샘플로 얻어지는 것은 별로 없더라는..

이노무 Ceki Gulcu 라는 놈이, 지 책 팔아먹을라고 제대로 된 매뉴얼은 책으로 만들어놓은듯..

3. Log4J 의 핵심 개념 몇가지

(1) Logger
 

(2) Appender

(3) Layout



반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

log4j 를 분석하다가, log4j 의 lf5 의 예제에서는, properties 파일을, 패키지 내부에 넣고,
예를 들어, 소스의 패키지가 lf5.sample 일 때, "/lf5/sample/log4j_sample.properties" 로 접근이 되는데, 내가 만든 클래스 내에서는, PropertyConfigurator.configure("/simpleTest/myapp2.log4j.properties"); 하면, 계속 파일 없다고 나오길래, lf5 의 예제 코드를 보니, 이런 부분이 있었더라는..

우선, 사용하려는 파일의 위치는 아래와 같고


잘 되는 소스코드는 이렇다.. 아래의 코드에서 무식하게 그냥 PropertyConfigurator.configure("/simpleTest/myapp2.log4j.properties");  해서 될게 아니다라는걸 깨닿게 된다.

public static final String resource = "/simpleTest/myapp2.log4j.properties";

public static URL configurationFileURL = MyApp2.class.getResource(resource);
	
	public static void main(String[] args) {
		/**
		 * 아래와 같이, property 파일을 직접 명시해주거나, 아니면, 
		 * src 의 root 에, log4j.properties 이름으로 두고, Configurator 설정을 안하면
		 * 된다~!
		 */
		PropertyConfigurator.configure(configurationFileURL);

위에서 public static URL configurationFileURL = MyApp2.class.getResource(resource); 요 부분이 핵심이다.

패키지 내부에 있는 리소스를 찾아서, URL 로 리턴해주는데,
logger.debug("Config file URL : " + configurationFileURL);
logger.debug("Config file URI : " + configurationFileURL.getFile());

위 코드로 확인해보면, 이렇게 나온다.
Config file URL : file:/E:/JavaProject/webproject/log4jtest/build/classes/simpleTest/myapp2.log4j.properties
Config file URI : /E:/JavaProject/webproject/log4jtest/build/classes/simpleTest/myapp2.log4j.properties

참 좋은 Method 같네. 담부터는 잘 활용해 먹어야 겠구만.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,