spring camp 발표자료

57
Spring Security 활용과 사례 KSUG 이수홍 [email protected] 1

Upload: -

Post on 24-May-2015

4.502 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Spring camp 발표자료

Spring����������� ������������������  Security����������� ������������������  활용과����������� ������������������  사례����������� ������������������  

KSUG 이수홍 [email protected]

1

Page 2: Spring camp 발표자료

목차

����������� ������������������  Spring����������� ������������������  Security����������� ������������������  소개

����������� ������������������  Spring����������� ������������������  Security����������� ������������������  Architecture

����������� ������������������  요구사항1����������� ������������������  (인증정보����������� ������������������  DB로����������� ������������������  관리하기)

����������� ������������������  요구사항2����������� ������������������  (페이스북����������� ������������������  인증����������� ������������������  연동하기)

����������� ������������������  요구사항3����������� ������������������  (URL권한정보����������� ������������������  DB로����������� ������������������  관리하기)

2

Page 3: Spring camp 발표자료

Spring Security?

•Spring����������� ������������������  Framework����������� ������������������  기반����������� ������������������  인증,����������� ������������������  권한프레임워크

•구현은����������� ������������������  Servlet����������� ������������������  Filter����������� ������������������  및����������� ������������������  Spring����������� ������������������  AOP����������� ������������������  기반

•유연한����������� ������������������  설계로����������� ������������������  다양한����������� ������������������  확장����������� ������������������  및����������� ������������������  커스터마이징����������� ������������������  가능

•비지니스����������� ������������������  로직과����������� ������������������  인증,����������� ������������������  권한����������� ������������������  로직을����������� ������������������  90%(?)이상����������� ������������������  분리����������� ������������������  가능����������� ������������������  (Case����������� ������������������  by����������� ������������������  case)

• 구축된 프레임워크의 재활용과 기존 Spring 기반의 레거시 시스템에 적용할 때 유용

3

Page 4: Spring camp 발표자료

<http pattern="/resources/**" security="none"/><http use-expressions="true"> <intercept-url pattern="/member/**" access="hasRole('member')"/> <intercept-url pattern="/school/**" access="isAuthenticated()" /> <intercept-url pattern="/**" access="permitAll" /> <form-login/> <logout logout-url="/logout" logout-success-url="/"/> <remember-me /></http><authentication-manager alias="authenticationManager"> <authentication-provider> <user-service> <user name="member" password="test" authorities="member" /> <user name="user" password="user" authorities="user" /> </user-service> </authentication-provider></authentication-manager>

Spring Security 기본적인 설정

Authorization����������� ������������������  권한정보

Authentication����������� ������������������  인증정보

4

Page 5: Spring camp 발표자료

실행!!!

5

Page 6: Spring camp 발표자료

6

Page 7: Spring camp 발표자료

그럴리가 없겠죠?

7

Page 8: Spring camp 발표자료

•로그인����������� ������������������  페이지����������� ������������������  변경

•인증����������� ������������������  성공����������� ������������������  및����������� ������������������  인증실패에����������� ������������������  대한����������� ������������������  후처리

•권한실패����������� ������������������  및����������� ������������������  접근실패����������� ������������������  처리����������� ������������������  다양화

•인증����������� ������������������  정보의����������� ������������������  외부화

•자동로그인����������� ������������������  여부

우리는 ...

8

Page 9: Spring camp 발표자료

끝이 없이 ..

•동시����������� ������������������  로그인����������� ������������������  및����������� ������������������  세션����������� ������������������  제어����������� ������������������  

•로그인����������� ������������������  방법����������� ������������������  다양화

•LDAP을����������� ������������������  통한����������� ������������������  Login

•SSO를����������� ������������������  통한����������� ������������������  Login

•OAuth����������� ������������������  및����������� ������������������  소셜����������� ������������������  로그인����������� ������������������  (����������� ������������������  페이스북,����������� ������������������  트위터����������� ������������������  등����������� ������������������  )

•그����������� ������������������  외����������� ������������������  등등

9

Page 10: Spring camp 발표자료

10

Page 11: Spring camp 발표자료

하지만 Spring Security Filter chain 컨트롤 할 수 있으면 당신은 Security Master!!!

11

Page 12: Spring camp 발표자료

Spring Security Architecture

보호����������� ������������������  받는����������� ������������������  Resource

Spring����������� ������������������  Security����������� ������������������  Filter����������� ������������������  Chain

분리

12

Page 13: Spring camp 발표자료

Spring Security Architecture

13

Page 14: Spring camp 발표자료

비지니스요구!?

14

Page 15: Spring camp 발표자료

요구사항 1

인증(Authentication)����������� ������������������  정보를����������� ������������������  Database로����������� ������������������  관리해����������� ������������������  주세요!

15

Page 16: Spring camp 발표자료

기본설정으로 지원!

16

Page 17: Spring camp 발표자료

Database 연동을 위한 Custom Tag 제공

<authentication-manager> <authentication-provider> <!--<user-service> <!-- 인메모리 부분 제거 --> <user name="member" password="test" authorities="member" /> <user name="user" password="user" authorities="user" /> </user-service>--> <jdbc-user-service data-source-ref="datasource객체" users-by-username-query="username으로 사용자 정보를 가져오는 쿼리"

authorities-by-username-query="username으로 사용자 권한 정보를 가져오는 쿼리"/>

</authentication-provider></authentication-manager>

17

Page 18: Spring camp 발표자료

내부적으로는����������� ������������������  UsernamePasswordAuthenticationFilter����������� ������������������  

의����������� ������������������  AuthenticationManager����������� ������������������  내부의����������� ������������������  AuthenticationProvider����������� ������������������  추가

class����������� ������������������  UsernamePasswordAuthenticationFilter����������� ������������������  {

}

class����������� ������������������  AuthenticationManager����������� ������������������  {

}

class����������� ������������������  ProviderManager����������� ������������������  {

}

class����������� ������������������  XxxAuthenticationProvider����������� ������������������  {...

}

class����������� ������������������  XxxAuthenticationProvider����������� ������������������  {...

}

class����������� ������������������  DaoAuthenticationProvider����������� ������������������  {

}

class����������� ������������������  UserService����������� ������������������  {

}class����������� ������������������  JdbcUserDetails...����������� ������������������  {����������� ������������������  ...����������� ������������������  }

변경

class����������� ������������������  InMemoryDao...����������� ������������������  {����������� ������������������  ...����������� ������������������  }Request Flow

UsernamePasswordAuthenticationToken����������� ������������������  발행����������� ������������������  

Token 전달

인증 Token 타입별로 AuthenticationProvider 선택

18

Page 19: Spring camp 발표자료

사용자

Login����������� ������������������  요청

Filter1

WAS

Filter2

Filter3

Servlet����������� ������������������  (����������� ������������������  Spring����������� ������������������  mvc����������� ������������������  )

Jdbc����������� ������������������  인증����������� ������������������  Filter

...요청(request)

응답(re

sponse)

DB

인증����������� ������������������  데이타����������� ������������������  요청����������� ������������������  

인증데이타 ...Filter4

Login����������� ������������������  결과����������� ������������������  응답

JDBC 인증 Flow

19

Page 20: Spring camp 발표자료

결론

내부����������� ������������������  지원����������� ������������������  ->����������� ������������������  쉽게연동����������� ������������������  

20

Page 21: Spring camp 발표자료

요구사항 2

인증(Authentication)����������� ������������������  하는����������� ������������������  부분을����������� ������������������  다각화����������� ������������������  해주세요

최근����������� ������������������  많이����������� ������������������  하는����������� ������������������  페이스북����������� ������������������  인증과����������� ������������������  연동이����������� ������������������  필요합니다.

21

Page 22: Spring camp 발표자료

2.����������� ������������������  OAuth����������� ������������������  2.0

1.����������� ������������������  Open����������� ������������������  API

3.����������� ������������������  Spring����������� ������������������  Security

인증정보를����������� ������������������  

을����������� ������������������  통해����������� ������������������  가져와서����������� ������������������  

시스템에����������� ������������������  적용����������� ������������������  ����������� ������������������  

연동����������� ������������������  하기����������� ������������������  위해서는?

22

Page 23: Spring camp 발표자료

사용자

Facebook����������� ������������������  Login����������� ������������������  요청

Filter1

WAS

Filter2

OAuth2ClientContextFilter

Servlet����������� ������������������  (����������� ������������������  Spring����������� ������������������  mvc����������� ������������������  )

요청(request)

페이스북인증필터

...

응답(re

sponse)

AccessToken

...Filter3

Login����������� ������������������  결과����������� ������������������  응답

페이스북 인증 Flow

사용자����������� ������������������  정보����������� ������������������  요

����������� ������������������  (+Ac

cessTo

ken)

사용자����������� ������������������  정보(JS

ON)

페이스북����������� ������������������  로그인

페이스북

요청(request����������� ������������������  +����������� ������������������  Token)

인증����������� ������������������  예외����������� ������������������  발생����������� ������������������  !!

23

Page 24: Spring camp 발표자료

OAuth2.0 연동

Oauth2.0����������� ������������������  인증����������� ������������������  부분은����������� ������������������  Spring����������� ������������������  Security����������� ������������������  OAuth2����������� ������������������  사용

http://projects.spring.io/spring-security-oauth/

24

Page 25: Spring camp 발표자료

<!--����������� ������������������  페이스북����������� ������������������  OAuth����������� ������������������  2.0����������� ������������������  설정����������� ������������������  정보����������� ������������������  --><oauth:resource id="facebook" type="authorization_code" client-id=".." client-secret="..." access-token-uri="https://graph.facebook.com/oauth/access_token" user-authorization-uri="https://www.facebook.com/dialog/oauth" ... />

Spring security OAuth 2 연동 설정

페이스북 개발자 사이트 https://developers.facebook.com/

Spring Security OAuth2를 사용한 페이스북 Client설정

<!--����������� ������������������  Facebook����������� ������������������  서버에����������� ������������������  접속하기����������� ������������������  위한����������� ������������������  RestTemplate����������� ������������������  -->����������� ������������������  <oauth:rest-template resource="facebook" id="facebookRestTemplate" />

페이스북����������� ������������������  OAuth����������� ������������������  2.0����������� ������������������  인증����������� ������������������  관련����������� ������������������  

OAuth����������� ������������������  2.0����������� ������������������  통신����������� ������������������  가능한����������� ������������������  RestTemplate����������� ������������������  생성

<!--����������� ������������������  Facebook����������� ������������������  에서����������� ������������������  데이터를����������� ������������������  가져����������� ������������������  오기����������� ������������������  위한����������� ������������������  Service����������� ������������������  --><bean id="facebookService" class="...FacebookServiceImpl"> <property name="facebookRestTemplate" ref="facebookRestTemplate" /> <property name="profileUri" value="인증정보를 가져오는 URI" /></bean>

페이스북����������� ������������������  API����������� ������������������  접근사용자����������� ������������������  정보����������� ������������������  get

25

Page 26: Spring camp 발표자료

public class FacebookServiceImpl implements FacebookService{ // 중략

private String profileUri; private RestTemplate facebookRestTemplate;

// 중략 @Override public FacebookUser findUser() { FacebookUser facebookUser = facebookRestTemplate.getForObject(

profileUri, FacebookUser.class); return facebookUser; }}

페이스북 API 호출

사용자정보����������� ������������������  API����������� ������������������  호출����������� ������������������  통신

Spring����������� ������������������  Security����������� ������������������  OAuth2����������� ������������������  형태로����������� ������������������  확장된����������� ������������������  RestTemplate����������� ������������������  

26

Page 27: Spring camp 발표자료

OAuth 2.0과 연동 완료!

27

Page 28: Spring camp 발표자료

페이스북 인증 Filter Flow

페이스북����������� ������������������  인증����������� ������������������  Filter

페이스북����������� ������������������  인증����������� ������������������  토큰����������� ������������������  전달����������� ������������������  (Provider����������� ������������������  선택을����������� ������������������  위한)

페이스북����������� ������������������  인증����������� ������������������  Provider

사용자����������� ������������������  정보����������� ������������������  API����������� ������������������  호출(OAuth����������� ������������������  2.0)

인증����������� ������������������  정보����������� ������������������  전달

페이스북����������� ������������������  Service

사용자����������� ������������������  정보����������� ������������������  JSON전달

페이스북����������� ������������������  사용자����������� ������������������  DTO����������� ������������������  전달

페이스북사용자����������� ������������������  정보����������� ������������������  요청

Provider에서����������� ������������������  전달����������� ������������������  받은����������� ������������������  인증����������� ������������������  정보를����������� ������������������  통해����������� ������������������  로그인!

28

Page 29: Spring camp 발표자료

class����������� ������������������  페이스북����������� ������������������  Filter����������� ������������������  {

}

class����������� ������������������  AuthenticationManager����������� ������������������  {

}

class����������� ������������������  ProviderManager����������� ������������������  {

}

class����������� ������������������  XxxAuthenticationProvider����������� ������������������  {...

}

class����������� ������������������  XxxAuthenticationProvider����������� ������������������  {...

}

class����������� ������������������  페이스북Provider����������� ������������������  {

}

class����������� ������������������  페이스북Service����������� ������������������  {

����������� ������������������  //����������� ������������������  페이스북����������� ������������������  Open����������� ������������������  API와����������� ������������������  OAuth2.0으로����������� ������������������  ����������� ������������������  연동해서����������� ������������������  사용자����������� ������������������  정보를����������� ������������������  가지고����������� ������������������  온다.

페이스북����������� ������������������  인증����������� ������������������  토큰����������� ������������������  발행����������� ������������������  

Request Flow

29

Page 30: Spring camp 발표자료

class����������� ������������������  UsernamePasswordAuthenticationFilter����������� ������������������  {

}

class����������� ������������������  AuthenticationManager����������� ������������������  {

}

class����������� ������������������  ProviderManager����������� ������������������  {

}

class����������� ������������������  XxxAuthenticationProvider����������� ������������������  {...

}

class����������� ������������������  XxxAuthenticationProvider����������� ������������������  {...

}

class����������� ������������������  DaoAuthenticationProvider����������� ������������������  {

}

class����������� ������������������  UserService����������� ������������������  {

}

class����������� ������������������  JdbcUserDetails...����������� ������������������  {����������� ������������������  ...����������� ������������������  }

UsernamePasswordAuthenticationToken����������� ������������������  발행����������� ������������������  

Request Flow

30

Page 31: Spring camp 발표자료

public class 페이스북인증Filter extends AbstractAuthenticationProcessingFilter{ // 중략 public 페이스북인증Filter() { super("/facebook_login"); //����������� ������������������  해당����������� ������������������  URI가����������� ������������������  요청이����������� ������������������  오면����������� ������������������  페이스북����������� ������������������  인증을����������� ������������������  진행! } //����������� ������������������  인증을����������� ������������������  진행����������� ������������������  메소드 public Authentication attemptAuthentication(...) throws ... { 페이스북인증토큰 authRequest = new 페이스북인증토큰()

// 중략 return this.getAuthenticationManager().authenticate(authRequest); } // 중략 }

페이스북 인증 Filter

public 페이스북인증Filter() { super("/facebook_login"); //해당 URI가 요청이 오면 페이스북 인증을 진행!}페이스북인증토큰 authRequest = new 페이스북인증토큰()// 중략return this.getAuthenticationManager() .authenticate(authRequest);

31

Page 32: Spring camp 발표자료

public class 페이스북인증Provider implements AuthenticationProvider { private 페이스북Service facebookService;// 중략 ...

@Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { Collection<GrantedAuthority> authorities = generateAuthorities();

// Facebook API에서 사용자 정보를 가져온다. FacebookUser user = facebookService.findUser();

// 사용자 정보를 가져온 토대로 인증 Token을 생성한다. FacebookAuthenticationToken token =

new FacebookAuthenticationToken(user.getName(), null, authorities);

token.setDetails(user); return token; }// 중략 ...}

페이스북 인증 Provider

private 페이스북Service facebookService;// 중략FacebookUser user = facebookService.findUser();

FacebookAuthenticationToken token = new FacebookAuthenticationToken( user.getName(), null, authorities);token.setDetails(user);

32

Page 33: Spring camp 발표자료

<!-- OAuth 2.0 Client를 연동 시키기 위한 Filter 생성 --><oauth:client id="oauth2ContextClientFilter"/><http> <custom-filter ref="oauth2ContextClientFilter" after="EXCEPTION_TRANSLATION_FILTER"/> <custom-filter ref="facebookAuthenticationFilter" before="FILTER_SECURITY_INTERCEPTOR"/>...<http>

페이스북 인증 Filter 위치

ExceptionTranslationFilter

oauth2ClientContextFilter

FilterSecurityInterceptor

페이스북인증Filter

순서 중요 !!

도식화

33

Page 34: Spring camp 발표자료

참고 Oauth2ContextClientFilter

Spring����������� ������������������  Security����������� ������������������  OAuth2����������� ������������������  모듈로

OAuth����������� ������������������  2.0����������� ������������������  통신����������� ������������������  할����������� ������������������  때����������� ������������������  발생한����������� ������������������  예외를����������� ������������������  처리����������� ������������������  하는����������� ������������������  Filter

보통����������� ������������������  주로����������� ������������������  사용목적은인증받지����������� ������������������  않은����������� ������������������  요청이����������� ������������������  왔을����������� ������������������  때����������� ������������������  (미리

저장된)����������� ������������������  인증����������� ������������������  페이지를����������� ������������������  호출!����������� ������������������  ����������� ������������������  

34

Page 35: Spring camp 발표자료

Spring����������� ������������������  Security����������� ������������������  인증����������� ������������������  Flow도����������� ������������������  대부분����������� ������������������  유사

35

Page 36: Spring camp 발표자료

페이스북 인증 예제

•간단한����������� ������������������  해당����������� ������������������  기능,����������� ������������������  불필요한����������� ������������������  부분은����������� ������������������  생략����������� ������������������  

•Maven����������� ������������������  필요

•직접����������� ������������������  Facebook����������� ������������������  App을����������� ������������������  생성����������� ������������������  및����������� ������������������  연동����������� ������������������  추천!

•Github����������� ������������������  소스����������� ������������������  주소����������� ������������������  

•https://github.com/sbcoba/spring-camp-spring-security-session

36

Page 37: Spring camp 발표자료

요구사항 3

URL����������� ������������������  권한����������� ������������������  (Authorization)����������� ������������������  정보를����������� ������������������  DB����������� ������������������  로����������� ������������������  관리해����������� ������������������  주세요!

37

Page 38: Spring camp 발표자료

URL 권한 정보

•사용자(User)가����������� ������������������  가지고����������� ������������������  있는����������� ������������������  “정보”를����������� ������������������  가지고����������� ������������������  어떤����������� ������������������  곳에����������� ������������������  접근(Access)할����������� ������������������  수����������� ������������������  있는지����������� ������������������  가지고����������� ������������������  있는����������� ������������������  정보

•자체����������� ������������������  커스터마이징����������� ������������������  할����������� ������������������  수����������� ������������������  있는����������� ������������������  XML태그가����������� ������������������  존재X����������� ������������������  (SpringSecurity����������� ������������������  3.1.4����������� ������������������  버전����������� ������������������  기준)

<intercept-url pattern="/member/**" access="hasRole('member')"/><intercept-url pattern="/school/**" access="isAuthenticated()" /><intercept-url pattern="/**" access="permitAll" />...

38

Page 39: Spring camp 발표자료

기본 설정으로 확장이 불가능!

39

Page 40: Spring camp 발표자료

URL 권한 데이타 전환

FilterSecurityInterceptor

권한����������� ������������������  관련����������� ������������������  Filter

FilterInvocationSecurityMetadataSource

<intercept-url pattern="/member/**" access="hasRole('member')"/><intercept-url pattern="/school/**" access="isAuthenticated()" /><intercept-url pattern="/**" access="permitAll" />...

DB전환

40

Page 41: Spring camp 발표자료

사용자

Request����������� ������������������  요청

Filter1

WAS

Filter2

FilterSecurityInterceptor

Servlet����������� ������������������  (����������� ������������������  Spring����������� ������������������  mvc����������� ������������������  )

요청(request)

응답(re

sponse)

...

결과����������� ������������������  응답

URL 권한 정보 DB연동 Flow

ExceptionTranslationFilter

jdbcFilterSecurityInterceptor

ExpressionBasedFilterInvocationSecurityMetadataSource

DB

권한����������� ������������������  Meta����������� ������������������  Data����������� ������������������  요청����������� ������������������  

권한����������� ������������������  Meta����������� ������������������  Data

41

Page 42: Spring camp 발표자료

커스텀 권한 Filter를 추가 해보자 1

<bean id="jdbcFilterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor" />

1. 추가할 Filter를 생성

2. URL권한 정보를 관리하는 Class를 Customizing

여기서 예제는 expression 을 사용하는 SecurityMetadataSource클래스를 이용

42

Page 43: Spring camp 발표자료

커스텀 권한 Filter를 추가 해보자 2

3. Simple한 DB구조 ( table명 : auth_meta )

id: seq ( PK )path: varcharexpression: varcharordering: number

id path expression ordering

1 /member/** hasRole('member') 10

2 /school/** isAuthenticated() 20... ... ... ...

-����������� ������������������  QuerySELECT����������� ������������������  id,����������� ������������������  path,����������� ������������������  expression,����������� ������������������  order����������� ������������������  FROM����������� ������������������  ����������� ������������������  ����������� ������������������  ����������� ������������������  auth_metaORDER����������� ������������������  BY����������� ������������������  ordering,����������� ������������������  id

순서 중요 !!

43

Page 44: Spring camp 발표자료

DB SecurityMetadataSource Flow

FilterInvocationSecurityMetadataSource

AuthorizationMetaService

URL 권한 객체 요청

URL 권한 데이터 전송

DB 쿼리

Spring Security내부에서 사용 하는 인터페이스 전환 후 전달

DB

44

Page 45: Spring camp 발표자료

public class JdbcExpressionFilterInvocationDefinitionSourceFactoryBean implements FactoryBean<ExpressionBasedFilterInvocationSecurityMetadataSource> { private AuthorizationMetaService authorizationMetaService;... public ExpressionBasedFilterInvocationSecurityMetadataSource getObject() { return new ExpressionBasedFilterInvocationSecurityMetadataSource( this.executeResourceMap(), new DefaultWebSecurityExpressionHandler()); } protected LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>

executeResourceMap() { Map<String, String> resourceMap = authorizationMetaService.findAllAuthMetaData(); LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> requestMap = //... 중략 for (Map.Entry<String, String> entry : resourceMap.entrySet()) {

// 중략 ... ( Spring Security에서 사용하는 포멧으로 변경 ) requestMap.put(matcher, attrList); } return requestMap; }...

private 권한메타Service 권한메타MetaService;// 중략 ...Map<String, String> resourceMap = // DB에서 가져오기 authorizationMetaService.findAllAuthMetaData();

LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> requestMap = //... 중략 for (Map.Entry<String, String> entry : resourceMap.entrySet()) {

// 중략 ... ( Spring Security 내부 인터페이스로 Converting ) requestMap.put(matcher, attrList); } return requestMap;

45

Page 46: Spring camp 발표자료

jdbcFilterSecurityIntercept

ExpressionBasedFilterInvocationSecurityMetadataSource

LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> ...

<bean id="jdbcFilterSecurityInterceptor" class="...FilterSecurityInterceptor"> <property name="securityMetadataSource"

ref="jdbcInvocationDefinitionSource"/></bean><bean id="jdbcInvocationDefinitionSource" class="...JdbcExpressionFilterInvocationDefinitionSourceFactoryBean"> <constructor-arg index="0" ref="authorizationMetaService"/></bean>

<property>로 셋팅

46

Page 47: Spring camp 발표자료

<http>... <custom-filter ref="JdbcFilterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR" />...<http>

JdbcFilterSecurityInterceptor

ExceptionTranslationFilter

FilterSecurityInterceptor

JdbcFilterSecurityInterceptor

순서 중요 !!

도식화

47

Page 48: Spring camp 발표자료

여기서 팁!!

<intercept-url pattern="/member/**" access="hasRole('member')"/><intercept-url pattern="/school/**" access="isAuthenticated()" /><intercept-url pattern="/**" access="permitAll" />...

JdbcFilterSecurityInterceptor

+

=<http once-per-request="true">...</http>

48

Page 49: Spring camp 발표자료

앞에����������� ������������������  있는����������� ������������������  권한����������� ������������������  Filter����������� ������������������  부분이����������� ������������������  먼저����������� ������������������  적용된����������� ������������������  후����������� ������������������  

뒷부분����������� ������������������  권한����������� ������������������  Filter가����������� ������������������  적용!

권한����������� ������������������  적용����������� ������������������  우선����������� ������������������  순위����������� ������������������  확인����������� ������������������  꼭����������� ������������������  필요!

49

Page 50: Spring camp 발표자료

정리

•Spring����������� ������������������  Security은����������� ������������������  Filter����������� ������������������  Chain으로����������� ������������������  이루어진����������� ������������������  시스템이다.

•인증(Authentication)����������� ������������������  DB연동은����������� ������������������  기본����������� ������������������  지원으로����������� ������������������  인해����������� ������������������  쉽게����������� ������������������  가능

•외부����������� ������������������  인증은����������� ������������������  직접����������� ������������������  인증����������� ������������������  Filter를����������� ������������������  추가����������� ������������������  및����������� ������������������  확장하여����������� ������������������  이루어진다.

50

Page 51: Spring camp 발표자료

참고자료•Spring����������� ������������������  Security����������� ������������������  공식사이트����������� ������������������  레퍼런스����������� ������������������  (http://docs.spring.io/spring-

security/site/reference.html)

•Spring����������� ������������������  Security����������� ������������������  OAuth����������� ������������������  공식사이트����������� ������������������  (http://projects.spring.io/spring-security-oauth/)

•스프링����������� ������������������  시큐리티����������� ������������������  3����������� ������������������  :����������� ������������������  스프링����������� ������������������  프레임워크����������� ������������������  기반����������� ������������������  표준����������� ������������������  보안����������� ������������������  솔루션����������� ������������������  (서적����������� ������������������  http://www.yes24.com/24/goods/4425736?scode=032&OzSrank=1)

•고종봉님����������� ������������������  Spring����������� ������������������  Security����������� ������������������  Filter����������� ������������������  Chain����������� ������������������  도식����������� ������������������  

•행복한����������� ������������������  눈물����������� ������������������  -����������� ������������������  리히텐슈타인(http://en.wikipedia.org/wiki/Happy_Tears_(Roy_Lichtenstein))

•절규����������� ������������������  -����������� ������������������  뭉크����������� ������������������  (http://en.wikipedia.org/wiki/The_Scream)

51

Page 52: Spring camp 발표자료

부록

52

Page 53: Spring camp 발표자료

1. SecurityContextPersistenceFilter

2. ConcurrentSessionFilter

3. LogoutFilter

Spring Security 주요 Filter order list

- SecurityContext 즉 사용자 인증 및 권한 정보를 저장할 위치를 지정 (기본 설정: HttpSession )- <http> 태그의 ”security-context-repository-ref” 속성으로 확장 가능

- 현재 Session이 유효여부를 파악하여 유효하지 않는 세션에 대한 후처리- 유효하지 않은 경우는 보통 동시접속자가 발생하여 해당 세션이 무효화 및 Session 유효시간 지나는 등의 문제가 발생할 때 무효화 처리- SessionManagementFilter와 연동 처리

- 특정 URI(기본:/j_spring_security_logout)를 체크하여 Logout을 실행- Logout을 할 때 처리(LogoutHandler)- Logout 성공 후 처리(LogoutSuccessHandler)

53

Page 54: Spring camp 발표자료

Spring Security 주요 Filter order list

- 특정 URI(기본: /j_spring_security_check)에서 Username (보통ID), Password를 통한 인증 프로세스를 진행- 인증(Login)프로세스 관련 부분은 AuthenticationManager에게 위임- 인증 성공(SuccessHandler) 및 실패(FailureHandler) 후처리 등을 진행- SpringSecurity에서 가장 핵심적이면서 많은 확장 포인트가 존재

- 인증 성공 후 기존 요청을 찾아가기 위해 기존 요청을 저장하기 위해 사용- 기본 적으로 Session을 사용한다.

4. UsernamePasswordAuthenticationFilter

5. RequestCacheAwareFilter

54

Page 55: Spring camp 발표자료

Spring Security 주요 Filter order list

- Servlet Api에서 HttpServletRequest 의 “getRemoteUser”, “getUserPrincipal”, “isUserInRole”, ”isGranted” 메소드를 Spring Security 인증, 및 권한된 정보에 맞도록 Overriding- <http> 태그의 “servlet-api-provision” 속성이 true일때 활성화 (기본값: true)

- RememberMe란? 보통 한번 인증 후 다시 해당 조건에 만족 되면 인증 정보가 필요 없이 자동으로 로그인- 이 Filter는 해당 요청이 RememberMe 조건에 맞으면 자동으로 인증 (기본값은 특정cookie값이 존재할 때)- RememberMe 프로세스 순서 (1) UsernamePasswordAuthenticationFilter에서 인증 후 해당 인증값 바탕으로 암호화 된 Cookie기록 (2) RememberMe 요청 조건에 맞는 요청시 해당 조건(기본 Cookie)를 기초로 인증 (3) Logout시 해당 쿠키를 제거

6. SecurityContextHolderAwareRequestFilter

7. RememberMeAuthenticationFilter

55

Page 56: Spring camp 발표자료

Spring Security 주요 Filter order list

- 이 Filter의 순서가 될때까지 인증이 되지 않았다면 익명의 사용자를 추가- 기본적으로 인증을 받지않은 사용자도 내부적으로 기본“익명의”사용자로 판단- 기본값 username: “anonymousUser”, role: “ROLE_ANONYMOUS”- <http> 태그 안의 <anonymous> 태그와 관련

8. AnonymousAuthenticationFilter

9. SessionManagementFilter

- Session 정보의 보안 및 동시 접속 등 전반적인 Session 추적 및 정보 관리- 로그인시 기존 Session 존재할 시 기존 세션을 무효화 하고 새롭게 생성할 것인지 무조건 새로운 세션 추가 할 것인지 등 처리- 동시 접속자를 허용할지, 몇 명까지 허용할 것인지 여부, 허용하지 않거나 허용된 Session의 수가 넘었을 때 처리 ( Session 무효화 처리 )- <http>의 “create-session” 속성 및 내부 <session-management> 태그와 관련

56

Page 57: Spring camp 발표자료

Spring Security 주요 Filter order list

- 이 Filter는 현재 이 Filter 이후의 모든 Process 내부에서 발생한 ”AuthenticationException”(인증 Exception), “AccessDeniedException”(권한 Exception) 찾아내어 처리- <http>의 “entry-point-ref”, “access-denied-page”와 내부 <access-denied-handler> 태그와 관련

10. ExceptionTranslationFilter

11. FilterSecurityInterceptor

- 권한 프로세스를 처리하는 Filter부분으로 실질적인 처리는 부모 Class인 “AbstractSecurityInterceptor” 에서 대부분을 처리- 내부 권한처리는 AccessDecisionManager Class를 통해 진행- 권한 관련 메타 정보는 FilterInvocationSecurityMetadataSource 인터페이스 기반 Class에서 관리- 기본은 <http> 내부의 <intercept-url> 태그의 내용을 기준으로 권한을 처리- <http>의 “access-decision-manager-ref”, “once-per-request“ 속성과 내부의 <intercept-url> 태그와 관련

57