Trac 은, 이슈 관리 + 심플한 프로젝트 관리 시스템으로, Eclipse 의 Mylyn 플러그인과 함께 사용하여
더욱 강력한 기능을 발휘한다.

자세한 것은 향후 사용하면서 논해보도록 하고, 우선 trac 설치하기 작업부터 시작한다.

Trac 을 설치하기 위해서는, 먼저 설치되어야 할 것들이 있다.

1. Apache HTTPD 설치

[사이트] http://httpd.apache.org/ 

HTTPD 서버를 다운로드 받아 설치한다


설치를 완료하고 나서, Windows Service 에 등록되고,  apache 가 동작하는것을 확인한다.


위와 같이 localhost 접속해서, It works! 나오면, apache 동작하는것임.

2. python 설치

Trac 이 Python 으로 만들어졌으므로, Python 을 설치해줘야 한다. 2.5 버전대 받으면 된다.
최신 버전은 2.6 버전과 3.x 버전이 있으나, 아래의 mod_python 이 Windows 용 바이너리의 경우
Python 2.5 용 밖에 없어서, 2.5 용으로 다운로드 받는다.

[다운로드] http://www.python.org/download/

3. mod_python 설치

Apache 에서 Python 실행하기 위한 모듈을 설치한다. 3.3 대 버전 받으면 된다.
HTTPD 2.0 과 2.2 는 mod_python 3.3 버전대를, HTTPD 1.3 은 2.7 버전대를 받는다.

Windows 용 바이너리는, Python 버전과 Apache 버전에 맞는 mod_python 을 다운받아야 한다.

[사이트] http://www.modpython.org/

설치 완료 후에,
Apache 설치 디렉토리의 conf/httpd.conf 파일에서

LoadModule python_module modules/mod_python.so
라인을 추가해준다. 그리고, Apache 를 재시작 시켜서 정상적으로 뜨면, 모듈 설치가 된것이다.

4.Genshi 설치
Python 을 지원하는 Velocity 나 Freemarker 와 같은 템플릿 엔진이다. Trac 설치 시에 필요하다.

[사이트] http://genshi.edgewall.org/
[다운로드] http://genshi.edgewall.org/wiki/Download

Genshi 0.5 에, Python 2.5 용으로 다운로드 받아 설치한다.

5.pysqlite 섩치
Trac 은 SQLite DB 를 사용한다. pysqlite는 Python 으로 sqlite DB 에 접근하기 위한 라이브러리 이다.
MySQL 과 MariaDB 를 지원하지만 아직 실험적 단계라고 한다.  MySQL 을 사용할때는, http://sf.net/projects/mysql-python 에서 MySQLDb 를 다운받아서 진행한다.

SQLite 는, Python 설치 시에 함께 설치되므로, 별도 설치할 필요는 없다.

[사이트] http://trac.edgewall.org/wiki/PySqlite
[다운로드] http://oss.itsystementwicklung.de/trac/pysqlite/wiki

Python 2.5 용으로 다운로드 받으면 된다. 현재, pysqlite 2.5.5 버전을 설치하였다.

6.setuptools 설치
Python 으로 만든 프로그램을 자동 다운 로드 및 설치 지원하는 툴이다.
Trac 의 플러그인을 설치할 때 유용하게 사용할 수 있다.

"egg" 확장자를 가지는 Python 패키지를 설치할 수 있다.

[사이트] http://peak.telecommunity.com/DevCenter/setuptools
[다운로드] http://peak.telecommunity.com/dist/ez_setup.py

python 으로 작성된 프로그램으로, Installer 가 있는게 아니다. 다운받은 파일을
특정 디렉토리에 저장한다.

그리고, python 디렉토리를 Path 에 추가하고,
>python ez_setup.py
하여, 실행시킨다.

그러면, setuptools egg를 자동으로 다운로드 하고, 설치해준다.

7.trac 설치
trac 을 설치한다. Windows 용 Installer 다운받아서 설치하면 된다. 현재 최신버전은 1.11.5 버전이다.

[사이트] http://trac.edgewall.org/
[다운로드] http://trac.edgewall.org/wiki/TracDownload

8.SVN 설치 및 Repository 생성

SVN 은 1.6.5 버전을 설치한다.

설치했으면, E:\TeamBuild\repository\teamjoon 디렉토리 만들고, Repository 초기화 한다

9.SVN-python 모듈 설치

Python 용 SVN 모듈을 설치한다. Python 을 2.5 버전 설치했으므로, 2.5 용으로 다운로드 한다

------------

이렇게 해서, trac 의 설치를 완료한다.
다음은 trac 의 신규 프로젝트를 생성하고 본격적으로 사용해 본다.
반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,

오픈 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

,
1. Action, Interceptor, ValueStack 과 Struts Tag 와의 관계
 Tag 의 Value 에 들어가는 문자열은, 무조건 객체를 지칭하는 표현식이다 그냥 value="abc" 하면, ValueStack 의 루트객체(액션컨텍스트)의 getAbc() 가 Call 된다.!

 %{} 표현식
  <s:textfield label="%{getText('label.postalCode')}" name="postalCode"/> 처럼 %{함수} 를 통하여, Action 의 함수를 직접 Call 할 수 있다.
   getText() 는, ActionSupport 를 상속받으면 쓸 수 있으며, Resource Bundle 에서 문자열을 가져오는 기능을 한다.

2. 태그의 Value 속성은 객체다
 <s:textfield name="city" value="SEOUL"/> 되어 있으면, "SEOUL" 이라는 문자열이 값이 되는게 아니고, OGNL 로 인식하여, Action 의 getSeoul() 이라는 함수로 프로퍼티를 가져오려 한다.

  문자열로 쓰려면, <s:textfield name="city" value="%{'SEOUL'}"/> 과 같이 써야 한다. 아니면 value="'SEOUL'" 로 쓸수도 있으나, 앞의 방법을 따르라~

  모든 value="" 안의 값은 기본적으로 Struts2 에서는 OGNL 로 인식하므로, <s:if test="age > 19"/>...</s:if> 처럼 사용하면 된다. 위의 경우에는, <s:if test="%{age > 19}"/>...</s:if> 도, boolean 식으로 표현해도 똑같아 진다.

3. 표현식 언어의 표기법

 JSTL 표준
 표준 Request Context 에 저장된 자바 빈 객체 참조 법
 <p>사용자 이름: ${user.username}</p>

 ValueStack 에 저장된 프로퍼티 참조법
 <s:textfield name="username"/>

 ValueStack 에 저장된 프로퍼티 참조법 2
 <s:url id="ko" action="hello">
<s:param name="request_locale">ko</s:param>
 </s:url>
 <s: a href="%{ko}">Korea</s:a>

 Session 컨텍스트에 있는 프로퍼티 참조법
 <s:property value="#session.user.username" />

 정적인 Map 을 사용하는 방법
 <s:select name="checkedName" list="#{'username' : '이름1', 'username' : '이름2'}"/>

4. OGNL 기본

 OGNL 은, 컨텍스트를 Map 형태로 관리한다. Map 에는
  - application
  - session
  - value stack (루트)
  - request
  - parameters
  - attr (page -> request -> session -> application 순으로 검색)
 의 컨텍스트들이 존재하며, 루트를 제외한 다른 컨텍스트는, #컨텍스트키.프로퍼티 방법으로 접근하고, 루트 컨텍스트(Value Stack 에 있는 Bean)의 프로퍼티는 #없이, 프로퍼티 이름으로만 접근한다.

 액션은 Value Stack 에 저장되므로, Action 의 abc 라는 프로퍼티는
 <s:property value="abc"/> 
 로 가져올 수 있고,

 세션컨텍스트에 username 이라는 프로퍼티는,
  <s:property value="#session.username"/> 으로 가져올 수 있다.
  <s:property value="#session['myKey']"/>
  <s:property value="#request['myKey']"/>
 와 같이 쓸 수 있다는 말이다.

 [Action 클래스에서 컨텍스트 가져오기]
  Action 클래스에서는 ActionContext.getContext().getSession().put("myKey", myObject); 
 와 같이 Context 를 접근할 수 있다.

5. OGNL 사용 예

 myObject 가 루트 객체로 설정되어있다고 가정할 때,

 #myObject.property : myObject.getProperty() 호출됨
 #yourObject.property : youtObject.getProperty() 호출됨
 property : myObject.getProperty() 호출됨
 
[Value Stack 의 상황에 따른 접근]

 현재 Value Stack 에 다음과 같은구조로 객체가 들어가 있을 때

 animal (name, species) <-- stack 의 top [0]
 person (name, salary)
 아래와 같이 접근할 수 있다.

 species --> animal.getSpecies() 호출
 salary --> person.getSalary() 호출
 name --> animal.getName() 호출

 만약, stack 의 특정 번째 top 의 객체의 프로퍼티 가져오려면,
 0.name : animal.name() 호출
 1.name : person.name() 호출
 과 같이 한다.

[static 프로퍼티 / 메소드 참조]
 OGNL 은 static 프로퍼티와 메소드를 호출하는 방법을 제공한다.

 @example.ClassName@myStaticProperty
 @example.ClassName@myStaticMethod()

 와 같이 사용한다.

[파라미터, 요청(request), 세션, 어플리케이션 컨텍스트 참조 방법]

 #parameters['key'] 또는 #parameters.key
  request.getParameter("key") 호출

 #request['key'] 또는 #request.key
  request.getAttribute("key") 호출

 #session['key'] 또는 #session.key
  session.getAttribute("key") 호출

 #application['key'] 또는 #application.key
  key 값으로 저장된 ServletContext 의 속성값 참조

 #attr['key'] 또는 #attr.key
  Page, Request, Session, Application 순으로 속성 값 검색하여 일치하는 키 값 출력





반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,