Spring의 서브프로젝트 중 가장 오래됐고 활발한 활동을 하면서 거의 Spring Core Framework(SFW)만큼 인기가 있는 것을 꼽으라면 단연 Acegi Security Framework(ASF)일 것이다.

ASF를 처음 공부한 것은 Spring In Action 1판(SIA)을 통해서였다. Security와 관련된 한 chapter에서 Acegi를 설명하고 있었다. 하지만 나는 그것을 보고 반갑다기 보다는 화가났다. 가뜩이나 정보가 없던 2004년 초기에 처음으로 나온 Spring책이라고 구입했던 SIA은 내 기대와 달리 너무나 얇은 500페이지도 안되는 책이었다. 게다가 내가 가장 절실하게 정보를 많이 필요로 하는 SpringMVC에 대해서는 너무나 간단하게 밖에 설명을 하지 않았다. 그런데 그 적은 분량에 수십페이지를 Spring Core도 아닌 발음도 어떻게 할지 고민되는 이상한 이름의 프레임워크의 낭비를 하다니!

SIA의 Acegi와 관련된 내용을 읽어보았으나 감도 잘 안잡히고 이미 진행하고 있는 SFW기반의 프로젝트에서는 SpringAOP를 이용해서 구현한 자체 Security Framework이 있었기 때문에 그 이상 관심을 가지지 않게 되었다. 그 후에 Pro Spring을 읽을 때도 별로 관심이 없었으니 패스.

한참 후에 Rod Johnson이 쓴 Professional Java Development with Spring Framework를 읽어보니 또 Acegi가 한 챕터를 차지하고 있었다. 그 때부터 맘먹고 Acegi를 공부하기 시작했다. 하지만 그 부분을 여러번 읽고 정리를 해도 이를 당장 어떻게 적용해서 쓸 수 있는지 간단히 그림이 그려지지 않았다. 상당히 방대하고 확장성이 뛰어난 프레임워크인데 역시 한 챕터로 설명하기에는 부족한 것 같다. 대신 기본 인터페이스 구조와 아이디어를 정리할 수 있는 것은 수확이었다. 3가지 대표적인 보안과 DAO를 이용한 인증부분의 연동에 대한 이해는 성공.

그 후에 현재 참여하고 있는 프로젝트에 Acegi를 적용하려고 작정하고 본격적으로 연구를 시작했다. 그 사이 Acegi공부에 애를 쓰고 있는 재성님과 Acegi 별거 아니라며 우습게 보고 있는 영회님의 이야기를 들었다. 

먼저 Acegi를 다운 받아서 그 안에 있는 문서와 샘플을 보면서 공부를 시작했다.

레퍼런스 문서를 여러번 읽었지만 자세하고 깔끔하게 정리된 문서는 아니라서 그런지 완벽한 그림이 그려지지는 않았다. 대신 레퍼런스 문서를 통해서 SecurityContext가 만들어지는 과정과 그 활용에 대한 개념에 대한 정리를 깔끔하게 할 수 있었다. OSAF에서 내가 구현한 Context와 비슷한 개념이고 확장수준도 유사하면서

결국 남은 것은 실전. 문제는 Acegi가 bean한두개 설치한다고 동작하는 것이 아니라는 점이다. Security란 상당히 복잡한 기술이다. 구성요소도 많고 인증방법이나 권한설정 또 다양한 예외상황처리등의 문제들을 다 다룰 수 있고 특정 시스템에 맞게 customizing하는 작업이 필수다.

가장 좋은 출발점은 Acegi에 포함되어있는 두개의 샘플을 분석하는 것이다. Tutorial샘플은 간단한 URL기반의 웹보안 기능을 구현해 놓은 것이다. 복잡함을 피하기 위해서 유저정보는 memory dao를 이용해서 xml안에 설정해놓은 것을 사용한다.

이 샘플을 통해서 Acegi의 동작의 상세한 순서와 방법, 내부 구조등을 이해할 수 있었다.

먼저 할 일은 이 샘플에 나온 bean들간의 상관관계를 의존성 중심으로 풀어보는 것이다. 특히 간단하게 만들려고 inner bean으로 설정된 것은 다 밖으로 빼내서 보는 것이 좋다. 하지만 이 초간단 acegi설정에만 24개의 bean이 나온다는 사실.

이것을 풀어나가면서 이해하기 위해서 내가 새로운 기술을 학습할 때 애용하는 방법을 적용했다. 그것은 동작하는 가장 심플한 샘플로 만들기. 이 샘플의 xml설정을 내가 기능 테스트용으로 사용하는 심플한 Spring프로젝트에 적용을 했다.

먼저 목표는 에러가 나지 않는 가장 간단한 Acegi설정 만들기. Spring의 bean을 servlet filter로 만들어주는 FilterToBeanProxy를 web.xml에 설정해주고 이를 FilterChainProxy에 연동시켰다.

FilterChainProxy는 그 이름이 말해주듯이 여러개의 security용 filter bean들을 순처적으로 적용시켜주는 역할을 한다.

초간단 왕초보용 샘플에 있는 필터의 갯수는

  • httpSessionContextIntegrationFilter
  • logoutFilter
  • authenticationProcessingFilter
  • securityContextHolderAwareRequestFilter
  • rememberMeProcessingFilter
  • anonymousProcessingFilter
  • exceptionTranslationFilter
  • filterInvocationInterceptor

총 8개. 이것을 하나씩 각개격파하면서 진행을 해야한다.

이해하기 가장 쉬운 방법은 일단 최소한의 필터만 남겨보는 것. logout은 나중에 해도 되니까 logoutFilter빼고, rememberMe도 없어도 되니까 빼고. exceptionTranslation은 이름이 왠지 예외에만 적용되는 것 같아 빼고 httpSessionContextIntegration도 이름이 기니까 빼고. 등등의 작업을 통해서 정리해보면 1-2개의 필터만 남겨 놓아도 동작을 한다.(그게 뭐였는지는 지금 기억이 나지 않는다. -_-  하나도 안남기고 제외하면 에러가 난다. 그 상태에서 의존 jar파일들을 하나씩 체크해서 추가한다. 일단 인증동작은 하지 않더라도 deploy되는 것을 성공시킨다.

그리고 하나씩 필터의 역할을 추적해가면서 다음 작업 목표를 선택한다.

두번째는 login창 띄우기. 이부분을 추적하는 것이 좀 시간이 걸렸는데 그 이유는 exceptionTranslationFilter을 무시했던 탓이다. exceptionTranslationFilter는 filterInvocationInterceptor을 통해서 인증,권한에서 익셉션이 발생하면 그것을 캐치해서 적절한 동작을 하도록 해주는 역할을 한다. Throw – Catch구조가 filter chain사이에서 발생하는 구조라고 생각하면 쉽다. 인증정보가 전혀 없다면 authenticationEntryPoint로 처리해주는데 여기서 다양한 인증프로세스를 적용할 수 있다. 가장 쉬운 것은 html form을 이용하는 것. 그 외에 인증은 됐으나 권한이 없을 경우 적용할 수 있는 accessDeniedHandler도 등록을 해주면 된다.

처음에 테스트 해볼 때는 exceptionTranslationFilter빼고 exception이 밖으로 던져지게 하는 것이 좋다. 그러면 어떤 exception이 발생하는지를 직접 확인할 수 있기 때문이다. 그리고 나서 간단한 인증form을 만들어 적용해보고 그리로 redirect되는지 확인한다.

여기까지하면 가장 기초가 되는 부분에 대한 이해 성공.

이제 좀 디테일한 부분으로 들어가서 URL기반의 웹보안을 담당하는 FilterSecurityInterceptor을 세밀히 들여다본다. 여기서 ROLE과 URL Path의 설정구조를 확인할 수 있다. 재밌는 것은 그 설정부분이 그냥 단순 텍스트로 되어있다는 것.

<property name=”objectDefinitionSource”>
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/extreme/**=ROLE_SUPERVISOR
/secure/**=IS_AUTHENTICATED_REMEMBERED
/**=IS_AUTHENTICATED_ANONYMOUSLY
</value>
</property>

바로 체크해볼 것은 저런 텍스트로 표현된 것을 받아들이는 PropertyEditor를 찾는 것이다. FilterInvocationDefinitionSourceEditor이 해당 PropertyEditor이다. 이를 확인해보는 것은 샘플과 같이 xml에 Path-Role을 설정하면 상관없지만 DB등에 그 정보를 넣거나 외부 파일에서 가져오는 등의 필요가 있다면 이를 확장해서 써야 하기 때문이다. 나는 고객의 요구에 따라 ROLE등록부터 설정까지를 모두 다이나믹하게 해야 한다. PathBasedFilterInvocationDefinitionMap를 확장해서 DAO를 통해서 Path-URL정보를 생성해서 넘겨주면 OK. 포럼에 가서 유사한 질문이 있었나 확인한다. 역시 비슷한 질문이 여럿있다. 내가 찾은 방법이 맞는 것을 확인한다. Acegi를 만든 Ben Alex의 답변까지 확인했으니 이대로 가면 되는 것을 확인 끝.

보통 Acegi자료나 문서에는 UserDetail이나 인증쪽을 확장하는 것은 많이 있지만 이 secure url정보를 확장하는 것에 대한 언급은 없다. 하지만 샘플을 잘 분석하면 Acegi의 수많은 확장 포인트가 보인다. 쉽게 적용가능한 것은 역시 의존성을 맘대로 설정할 수 있는 Spring IoC덕분이다.

다음은 인증부분. 인증쪽은 쉽다. authenticationManager bean을 설정한 후 AuthenticationProvider를 등록해주면 된다. Acegi의 장점은 여러가지 인증기능을 조합해서 사용할 수 있다는 것이다. 기본 샘플만해도 daoAuthenticationProvider, AnonymousAuthenticationProvider, RememberMeAuthenticationProvider세가지의 인증을 모두 적용해놨다. 먼저 DAO를 통해서 인증을 체크하고 실패하면 Anonymous와 RememberMe를 적용한다.

DAOAuthentication은 기본 틀만 유지한채로 간단히 확장할 수도 있고 이미 Acegi에 구현되어있는 DAOAuthenticationProvider를 간단히 확장해서 사용해도 된다. 샘플은 AppFuse에 잘 되어있다. :)

마지막으로 httpSessionContextIntegrationFilter. 이것은 인증정보를 session에 담아서 저장하는 것을 처리한다. 단일서버에 유저가 많지 않을 경우 적용하면 적당한 방법이다. Clustering을 위한 non-session기반의 기능도 포함되어있다. 좀 더 다른 방식의 인증정보보존 방법을 사용하려 한다면 ContextIntegrationFilter를 확장해서 만들면 되겠지라고 생각했으나 소스를 보니 확장구조가 없다. 참조해서 직접 만들어야 할 것 같다. 아니면 관련 기능을 만들어 놓은 사례를 찾아보거나.

그 외에도 Channel(HTTP, HTTPS)보안이나 다양한 인증연동방법(LDAP, JAAS, WAS…) 등의 다양한 기능도 한번씩 살펴보면 좋겠다. Acegi의 유연한 확장성을 활용하면 새로운 보안기능을 추가하는 것은 아주 간단하다.

이제 남은 것은 이렇게 인증과정과 웹보안 과정을 거쳐서 생성된 SecurityContext정보를 활용하는 것이다. SecurityContext는 ThreadLocal로 저장된다. 필요하면 애플리케이션에서 직접 User정보를 얻어서 활용해도 된다. 나의 다음 작업은 OSAF의 Context.User정보와 Acegi의 SecurityContext의 Principal정보를 연동하게 하는 것. User인터페이스를 확장해서 SecurityContext에서 정보를 끌어오게 만드는 것으로 끝. OSAF의 확장성도 쓸만하다.

Service layer의 메소드 권한체크나 Acl을 통한 DomainObject보안은 그런 응용사례의 하나이다.

이제 contacts-fiulter샘플을 볼 차례이다. 여기서는 method 권한체크와 Acl을 통한 Domain object권한기능을 적용한 좀 더 복잡한 샘플을 볼 수 있다.

이 정도 과정을 거치면 Acegi에 대한 기본적인 이해를 할 수 있을 것이다.

그 후에 할 일은 각각 시스템에 어떤 보안정책을 적용할 것인지에 대한 결정과 그에 따른 Acegi의 확장부분을 개발하는 일이다.

최근에 Spring2.0을 통해서 AspectJ의 활용도가 높아졌다. 이로 인해서 AspectJ를 이용한 각종 보안기법들이 사용되기 시작했는데 앞으로 AspectJ를 본격적으로 활용한 각종 보안부분과 Acegi가 어떻게 결합되어서 사용되어질지가 흥미롭다.

Acegi는 ‘애씨지’ 또는 ‘아씨지’라고 발음한다. Acegi Technology라는 회사를 통해 IT컨설팅일을 하던 호주(앗싸 또 호주다)의 Ben Alex가 만들었고 Acegi라는 이름은 고대 신화에 나오는 신의 이름의 하나이기도 하고 알파벳 a부터 하나씩 건너뛰어서 만든 이름이라고도 한다. 별 뜻은 없다. :)

소스코드를 통해서 본 Acegi의 코드품질은 Spring만큼 완벽에 가까운 것은 아니다. 하지만 복잡한 보안쪽을 매우 유연하게 설계한 점에서 인정!

어제 물개가 Acegi를 가르쳐 달라고 해서… 그 대신으로 공부방법을 가르쳐 주기로 하고 정리한 글 끝.

Related posts:

  1. Spring Framework 2.5 Released
  2. Spring Framework 3.0.3 릴리스 & 의존 라이브러리
  3. Spring Framework 1.1.3 released
  4. Java Web Framework 비교(Struts, Spring, WebWork, Tapestry, JSF)
  5. Spring Framework 1.1.2 released
  6. Application Framework 개발의 원칙
  7. A Framework is… / Kent Beck
  8. 스프링과 하이버네이트를 이용한 RAD프레임워크 – OSAF(OpenSprout App. Framework) 공개
  9. The Spring Experience 둘째날
  10. Spring 3.0 (35) Spring 3.0 Reference Document 공개
  11. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  12. Spring 3.0 (38) Spring Reference 업데이트
  13. Spring 3.0 (44) Spring 3.0과 JEE6
  14. Spring 3.0 (26) Spring Expression Language와 @Value
  15. Spring 공부 다시 시작

Facebook comments:

to “나의 Spring Acegi Security Framework 학습기”

  1. Every after in a even though we opt for blogs that we study. Listed beneath are the newest sites that we select

  2. very few websites that come about to be comprehensive beneath, from our point of view are undoubtedly properly worth checking out

  3. Aw, this was a really good post. Taking the time and actual effort to create a top notch article… but what can I say… I hesitate a lot and never manage to get anything done.

  4. check beneath, are some absolutely unrelated web-sites to ours, on the other hand, they are most trustworthy sources that we use

  5. check below, are some totally unrelated internet sites to ours, on the other hand, they are most trustworthy sources that we use

  6. Online Pharm http://cialibuy.com – Buy Cialis Zithromax Swollen Lymph Nodes cialis Levitra Patient Education

  7. one of our visitors just lately encouraged the following website

  8. that would be the finish of this article. Right here youll locate some internet sites that we believe you will enjoy, just click the links over

  9. That is a really good tip particularly to those new to the blogosphere. Short but very accurate info… Many thanks for sharing this one. A must read article.

  10. below youll come across the link to some websites that we believe it is best to visit

  11. Dolore Testicoli Finasteride Propecia http://cialibuy.com – Cialis What Is The Structure Of Amoxicillin Buy Cialis Amoxicillin Dental Graft

  12. check below, are some absolutely unrelated web sites to ours, having said that, they are most trustworthy sources that we use

  13. A person essentially help to make seriously posts I would state.
    That is the very first time I frequented your web page
    and thus far? I amazed with the analysis you made to
    create this particular submit amazing. Excellent job!

  14. very few internet websites that occur to be detailed beneath, from our point of view are undoubtedly very well really worth checking out

  15. I couldn’t refrain from commenting. Exceptionally well written!

  16. Here is an excellent Blog You might Uncover Exciting that we Encourage You

  17. please stop by the web sites we stick to, like this one particular, as it represents our picks through the web

  18. Side Effects Of Amoxicillin In Infant http://cialibuy.com – Cialis Thyroxine cialis canada Amoxicillin Potassium Clavulanate

  19. Howdy! I just want to give you a big thumbs up for the excellent information you’ve got right here on this post. I will be coming back to your blog for more soon.

  20. Sites of interest we’ve a link to

  21. we came across a cool site which you may take pleasure in. Take a look should you want

Leave a Reply to Michaelvat Cancel reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha