spring camp 발표자료
TRANSCRIPT
Spring����������� ������������������ Security����������� ������������������ 활용과����������� ������������������ 사례����������� ������������������
KSUG 이수홍 [email protected]
1
목차
����������� ������������������ Spring����������� ������������������ Security����������� ������������������ 소개
����������� ������������������ Spring����������� ������������������ Security����������� ������������������ Architecture
����������� ������������������ 요구사항1����������� ������������������ (인증정보����������� ������������������ DB로����������� ������������������ 관리하기)
����������� ������������������ 요구사항2����������� ������������������ (페이스북����������� ������������������ 인증����������� ������������������ 연동하기)
����������� ������������������ 요구사항3����������� ������������������ (URL권한정보����������� ������������������ DB로����������� ������������������ 관리하기)
2
Spring Security?
•Spring����������� ������������������ Framework����������� ������������������ 기반����������� ������������������ 인증,����������� ������������������ 권한프레임워크
•구현은����������� ������������������ Servlet����������� ������������������ Filter����������� ������������������ 및����������� ������������������ Spring����������� ������������������ AOP����������� ������������������ 기반
•유연한����������� ������������������ 설계로����������� ������������������ 다양한����������� ������������������ 확장����������� ������������������ 및����������� ������������������ 커스터마이징����������� ������������������ 가능
•비지니스����������� ������������������ 로직과����������� ������������������ 인증,����������� ������������������ 권한����������� ������������������ 로직을����������� ������������������ 90%(?)이상����������� ������������������ 분리����������� ������������������ 가능����������� ������������������ (Case����������� ������������������ by����������� ������������������ case)
• 구축된 프레임워크의 재활용과 기존 Spring 기반의 레거시 시스템에 적용할 때 유용
3
<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
실행!!!
5
끝
6
그럴리가 없겠죠?
7
•로그인����������� ������������������ 페이지����������� ������������������ 변경
•인증����������� ������������������ 성공����������� ������������������ 및����������� ������������������ 인증실패에����������� ������������������ 대한����������� ������������������ 후처리
•권한실패����������� ������������������ 및����������� ������������������ 접근실패����������� ������������������ 처리����������� ������������������ 다양화
•인증����������� ������������������ 정보의����������� ������������������ 외부화
•자동로그인����������� ������������������ 여부
우리는 ...
8
끝이 없이 ..
•동시����������� ������������������ 로그인����������� ������������������ 및����������� ������������������ 세션����������� ������������������ 제어����������� ������������������
•로그인����������� ������������������ 방법����������� ������������������ 다양화
•LDAP을����������� ������������������ 통한����������� ������������������ Login
•SSO를����������� ������������������ 통한����������� ������������������ Login
•OAuth����������� ������������������ 및����������� ������������������ 소셜����������� ������������������ 로그인����������� ������������������ (����������� ������������������ 페이스북,����������� ������������������ 트위터����������� ������������������ 등����������� ������������������ )
•그����������� ������������������ 외����������� ������������������ 등등
9
10
하지만 Spring Security Filter chain 컨트롤 할 수 있으면 당신은 Security Master!!!
11
Spring Security Architecture
보호����������� ������������������ 받는����������� ������������������ Resource
Spring����������� ������������������ Security����������� ������������������ Filter����������� ������������������ Chain
분리
12
Spring Security Architecture
13
비지니스요구!?
14
요구사항 1
인증(Authentication)����������� ������������������ 정보를����������� ������������������ Database로����������� ������������������ 관리해����������� ������������������ 주세요!
15
기본설정으로 지원!
16
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
내부적으로는����������� ������������������ 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
사용자
Login����������� ������������������ 요청
Filter1
WAS
Filter2
Filter3
Servlet����������� ������������������ (����������� ������������������ Spring����������� ������������������ mvc����������� ������������������ )
Jdbc����������� ������������������ 인증����������� ������������������ Filter
...요청(request)
응답(re
sponse)
DB
인증����������� ������������������ 데이타����������� ������������������ 요청����������� ������������������
인증데이타 ...Filter4
Login����������� ������������������ 결과����������� ������������������ 응답
JDBC 인증 Flow
19
결론
내부����������� ������������������ 지원����������� ������������������ ->����������� ������������������ 쉽게연동����������� ������������������
20
요구사항 2
인증(Authentication)����������� ������������������ 하는����������� ������������������ 부분을����������� ������������������ 다각화����������� ������������������ 해주세요
최근����������� ������������������ 많이����������� ������������������ 하는����������� ������������������ 페이스북����������� ������������������ 인증과����������� ������������������ 연동이����������� ������������������ 필요합니다.
21
2.����������� ������������������ OAuth����������� ������������������ 2.0
1.����������� ������������������ Open����������� ������������������ API
3.����������� ������������������ Spring����������� ������������������ Security
인증정보를����������� ������������������
을����������� ������������������ 통해����������� ������������������ 가져와서����������� ������������������
시스템에����������� ������������������ 적용����������� ������������������ ����������� ������������������
연동����������� ������������������ 하기����������� ������������������ 위해서는?
22
사용자
Facebook����������� ������������������ Login����������� ������������������ 요청
Filter1
WAS
Filter2
OAuth2ClientContextFilter
Servlet����������� ������������������ (����������� ������������������ Spring����������� ������������������ mvc����������� ������������������ )
요청(request)
페이스북인증필터
...
응답(re
sponse)
AccessToken
...Filter3
Login����������� ������������������ 결과����������� ������������������ 응답
페이스북 인증 Flow
사용자����������� ������������������ 정보����������� ������������������ 요
청
����������� ������������������ (+Ac
cessTo
ken)
사용자����������� ������������������ 정보(JS
ON)
페이스북����������� ������������������ 로그인
페이스북
요청(request����������� ������������������ +����������� ������������������ Token)
인증����������� ������������������ 예외����������� ������������������ 발생����������� ������������������ !!
23
OAuth2.0 연동
Oauth2.0����������� ������������������ 인증����������� ������������������ 부분은����������� ������������������ Spring����������� ������������������ Security����������� ������������������ OAuth2����������� ������������������ 사용
http://projects.spring.io/spring-security-oauth/
24
<!--����������� ������������������ 페이스북����������� ������������������ 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
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
OAuth 2.0과 연동 완료!
27
페이스북 인증 Filter Flow
페이스북����������� ������������������ 인증����������� ������������������ Filter
페이스북����������� ������������������ 인증����������� ������������������ 토큰����������� ������������������ 전달����������� ������������������ (Provider����������� ������������������ 선택을����������� ������������������ 위한)
페이스북����������� ������������������ 인증����������� ������������������ Provider
사용자����������� ������������������ 정보����������� ������������������ API����������� ������������������ 호출(OAuth����������� ������������������ 2.0)
인증����������� ������������������ 정보����������� ������������������ 전달
페이스북����������� ������������������ Service
사용자����������� ������������������ 정보����������� ������������������ JSON전달
페이스북����������� ������������������ 사용자����������� ������������������ DTO����������� ������������������ 전달
페이스북사용자����������� ������������������ 정보����������� ������������������ 요청
Provider에서����������� ������������������ 전달����������� ������������������ 받은����������� ������������������ 인증����������� ������������������ 정보를����������� ������������������ 통해����������� ������������������ 로그인!
28
class����������� ������������������ 페이스북����������� ������������������ Filter����������� ������������������ {
}
class����������� ������������������ AuthenticationManager����������� ������������������ {
}
class����������� ������������������ ProviderManager����������� ������������������ {
}
class����������� ������������������ XxxAuthenticationProvider����������� ������������������ {...
}
class����������� ������������������ XxxAuthenticationProvider����������� ������������������ {...
}
class����������� ������������������ 페이스북Provider����������� ������������������ {
}
class����������� ������������������ 페이스북Service����������� ������������������ {
����������� ������������������ //����������� ������������������ 페이스북����������� ������������������ Open����������� ������������������ API와����������� ������������������ OAuth2.0으로����������� ������������������ ����������� ������������������ 연동해서����������� ������������������ 사용자����������� ������������������ 정보를����������� ������������������ 가지고����������� ������������������ 온다.
페이스북����������� ������������������ 인증����������� ������������������ 토큰����������� ������������������ 발행����������� ������������������
Request Flow
29
class����������� ������������������ UsernamePasswordAuthenticationFilter����������� ������������������ {
}
class����������� ������������������ AuthenticationManager����������� ������������������ {
}
class����������� ������������������ ProviderManager����������� ������������������ {
}
class����������� ������������������ XxxAuthenticationProvider����������� ������������������ {...
}
class����������� ������������������ XxxAuthenticationProvider����������� ������������������ {...
}
class����������� ������������������ DaoAuthenticationProvider����������� ������������������ {
}
class����������� ������������������ UserService����������� ������������������ {
}
class����������� ������������������ JdbcUserDetails...����������� ������������������ {����������� ������������������ ...����������� ������������������ }
UsernamePasswordAuthenticationToken����������� ������������������ 발행����������� ������������������
Request Flow
30
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
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
<!-- 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
참고 Oauth2ContextClientFilter
Spring����������� ������������������ Security����������� ������������������ OAuth2����������� ������������������ 모듈로
OAuth����������� ������������������ 2.0����������� ������������������ 통신����������� ������������������ 할����������� ������������������ 때����������� ������������������ 발생한����������� ������������������ 예외를����������� ������������������ 처리����������� ������������������ 하는����������� ������������������ Filter
보통����������� ������������������ 주로����������� ������������������ 사용목적은인증받지����������� ������������������ 않은����������� ������������������ 요청이����������� ������������������ 왔을����������� ������������������ 때����������� ������������������ (미리
저장된)����������� ������������������ 인증����������� ������������������ 페이지를����������� ������������������ 호출!����������� ������������������ ����������� ������������������
34
Spring����������� ������������������ Security����������� ������������������ 인증����������� ������������������ Flow도����������� ������������������ 대부분����������� ������������������ 유사
35
페이스북 인증 예제
•간단한����������� ������������������ 해당����������� ������������������ 기능,����������� ������������������ 불필요한����������� ������������������ 부분은����������� ������������������ 생략����������� ������������������
•Maven����������� ������������������ 필요
•직접����������� ������������������ Facebook����������� ������������������ App을����������� ������������������ 생성����������� ������������������ 및����������� ������������������ 연동����������� ������������������ 추천!
•Github����������� ������������������ 소스����������� ������������������ 주소����������� ������������������
•https://github.com/sbcoba/spring-camp-spring-security-session
36
요구사항 3
URL����������� ������������������ 권한����������� ������������������ (Authorization)����������� ������������������ 정보를����������� ������������������ DB����������� ������������������ 로����������� ������������������ 관리해����������� ������������������ 주세요!
37
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
기본 설정으로 확장이 불가능!
39
URL 권한 데이타 전환
FilterSecurityInterceptor
권한����������� ������������������ 관련����������� ������������������ Filter
FilterInvocationSecurityMetadataSource
<intercept-url pattern="/member/**" access="hasRole('member')"/><intercept-url pattern="/school/**" access="isAuthenticated()" /><intercept-url pattern="/**" access="permitAll" />...
DB전환
40
사용자
Request����������� ������������������ 요청
Filter1
WAS
Filter2
FilterSecurityInterceptor
Servlet����������� ������������������ (����������� ������������������ Spring����������� ������������������ mvc����������� ������������������ )
요청(request)
응답(re
sponse)
...
결과����������� ������������������ 응답
URL 권한 정보 DB연동 Flow
ExceptionTranslationFilter
jdbcFilterSecurityInterceptor
ExpressionBasedFilterInvocationSecurityMetadataSource
DB
권한����������� ������������������ Meta����������� ������������������ Data����������� ������������������ 요청����������� ������������������
권한����������� ������������������ Meta����������� ������������������ Data
41
커스텀 권한 Filter를 추가 해보자 1
<bean id="jdbcFilterSecurityInterceptor" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor" />
1. 추가할 Filter를 생성
2. URL권한 정보를 관리하는 Class를 Customizing
여기서 예제는 expression 을 사용하는 SecurityMetadataSource클래스를 이용
42
커스텀 권한 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
DB SecurityMetadataSource Flow
FilterInvocationSecurityMetadataSource
AuthorizationMetaService
URL 권한 객체 요청
URL 권한 데이터 전송
DB 쿼리
Spring Security내부에서 사용 하는 인터페이스 전환 후 전달
DB
44
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
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
<http>... <custom-filter ref="JdbcFilterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR" />...<http>
JdbcFilterSecurityInterceptor
ExceptionTranslationFilter
FilterSecurityInterceptor
JdbcFilterSecurityInterceptor
순서 중요 !!
도식화
47
여기서 팁!!
<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
앞에����������� ������������������ 있는����������� ������������������ 권한����������� ������������������ Filter����������� ������������������ 부분이����������� ������������������ 먼저����������� ������������������ 적용된����������� ������������������ 후����������� ������������������
뒷부분����������� ������������������ 권한����������� ������������������ Filter가����������� ������������������ 적용!
권한����������� ������������������ 적용����������� ������������������ 우선����������� ������������������ 순위����������� ������������������ 확인����������� ������������������ 꼭����������� ������������������ 필요!
49
정리
•Spring����������� ������������������ Security은����������� ������������������ Filter����������� ������������������ Chain으로����������� ������������������ 이루어진����������� ������������������ 시스템이다.
•인증(Authentication)����������� ������������������ DB연동은����������� ������������������ 기본����������� ������������������ 지원으로����������� ������������������ 인해����������� ������������������ 쉽게����������� ������������������ 가능
•외부����������� ������������������ 인증은����������� ������������������ 직접����������� ������������������ 인증����������� ������������������ Filter를����������� ������������������ 추가����������� ������������������ 및����������� ������������������ 확장하여����������� ������������������ 이루어진다.
•
50
참고자료•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
부록
52
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
Spring Security 주요 Filter order list
- 특정 URI(기본: /j_spring_security_check)에서 Username (보통ID), Password를 통한 인증 프로세스를 진행- 인증(Login)프로세스 관련 부분은 AuthenticationManager에게 위임- 인증 성공(SuccessHandler) 및 실패(FailureHandler) 후처리 등을 진행- SpringSecurity에서 가장 핵심적이면서 많은 확장 포인트가 존재
- 인증 성공 후 기존 요청을 찾아가기 위해 기존 요청을 저장하기 위해 사용- 기본 적으로 Session을 사용한다.
4. UsernamePasswordAuthenticationFilter
5. RequestCacheAwareFilter
54
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
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
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