SlideShare a Scribd company logo
1 of 27
Download to read offline
스프링 시큐리티 구조 이해
(웹 어플리케이션 중심)
신림 프로그래머, 최범균, 2014-07-09
목표
● 스프링 시큐리티의 구성 요소와 동작 방식 이
해
○ 이를 통한 커스터마이징 포인트 잡기!
기본 구성 요소
보안 관련 3요소
● 접근 주체(Principal)
○ 보호된 대상에 접근하는 사용자
● 인증(Authenticate)
○ 현재 사용자가 누군인지 확인하는 과정
○ 일반적으로 아이디/암호를 이용해서 인증을 처리
● 인가(Authorize)
○ 현재 사용자가 특정 대상(URL, 기능 등)을 사용(접근)
할 권한이 있는지 검사하는 것
스프링 시큐리티와 보안 3요소의 매칭
접근 주체
인증
인가
Authentication
Authentication
Manager
Security
Interceptor
Authentication와 SecurityContext
● Authentication의 용도
○ 현재 접근 주체 정보를 담는 목적
○ 인증 요청할 때, 요청 정보를 담는 목적
● SecurityContext
○ Authentication을 보관
○ 스프링 시큐리티는 현재 사용자에 대한
Authentication 객체를 구할 때 SecurityContext로부
터 구함
SecurityContextHolder
● SecurityContext를 보관
○ 기본: 쓰레드로컬에 SecurityContext를 보관
● 전형적인 SecurityContext 설정 코드
Authentication auth = someMethodForGettingAuth(req, resp);
try {
SecurityContextHolder.getContext().setAuthentication(auth);
chain.doFilter(request, response); // 이후 코드에서 동일 SecurityContext 사용
} finally {
SecurityContextHolder.clearContext();
}
스프링 시큐리티가 유사한 필터 이미 제공
참고, Authentication의 주요 메서드
● Authentication의 주요 메서드
○ String getName(): 사용자의 이름
○ Object getCredential(): 증명 값 (비밀번호 등)
○ Object getPrincipal(): 인증 주체 정보
○ boolean isAuthenticated(): 인증되었는지 여부
○ Collection<GrantedAuthority) getAuthorities(): 현재
사용자가 가진 권한(GrantedAuthority)
AuthenticationManager
● 인증을 처리함
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication)
throws AuthenticationException;
}
● 인증에 성공하면 인증 정보를 담고 있는 Authentication 객체 리턴
○ 스프링 시큐리티는 리턴한 Authentication 객체를 SecurityContext에
보관 및 인증 상태를 유지하기 위해 세션에 보관
● 인증 실패시 AuthenticationException을 발생시킴
(Abstract)SecurityInterceptor
● 인가를 처리
○ 웹의 경우 FilterSecurityInterceptor 구현 사용
○ AccessDecisionManager에 권한 검사 위임
public interface AccessDecisionManager {
void decide(Authentication authentication, // 사용자
Object object, // 접근 자원
Collection<ConfigAttribute> configAttributes) // 보안 설정
throws AccessDeniedException, InsufficientAuthenticationException;
boolean supports(ConfigAttribute attribute);
boolean supports(Class<?> clazz);
}
● 사용자가 자원의 보안 설정 기준으로, 접근 권한이 없을 경우 익셉션 발생
SecurityFilterChain
웹 어플리케이션 보안 지원
● 보인 필터 체인를 이용한 보안 처리
FilterChainProxy
보안 필터 체인
실제 자원
주로 다음 기능을 제공
- Authentication 정보 생성
- 접근 권한 검사
- 인증 요청 처리
<sec:http use-expressions="true">
<sec:intercept-url pattern="/admin/**"
access="hasAuthority('ROLE_ADMIN')" />
<sec:intercept-url pattern="/manager/**"
access="hasRole('ROLE_MANAGER')" />
<sec:intercept-url pattern="/member/**"
access="isAuthenticated()" />
<sec:intercept-url pattern="/**"
access="permitAll"/>
<sec:form-login />
<sec:logout />
</sec:http>
생성
생성
스프링 빈으로 등록된 필터
(springSecurityFilterChain)
웹 요청을 FilterChainProxy 적용
<filter>
<filter-name>
springSecurityFilterChain
</filter-name>
<filter-class>
o...filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
FilterChainProxy
보안 필터 체인
DelegatingFilterProxy
보안 필터 체인
보안 필터 체인의 주요 구성 요소
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor접근 권한 검사
익셉션 처리
로그인 폼 출력
인증 요청 처리
로그아웃 요청 처리
Authentication 로딩 ● 필터 체인은 순서대로 실
행
● 필터에 따라 요청을 처리
하고 체인 실행을 끝내기
도 함
임의 사용자 처리
접근 권한 없을 때 처리, 인증 전
보안 필터 체인
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
1. 요청
Access
Decision
Manager 2. 권한 검사
요청
4. 익셉션 발생
Authentication
EntryPoint
5. 인증 과
정 시작 처
리
<sec:form-login
login-page="/user/loginform"
/>
접근 권한 없을 때 처리, 인증 상태
보안 필터 체인
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
1. 요청
Access
Decision
Manager 3. 권한 검사
요청
4. 익셉션 발생
AccessDenied
Handler
5. 접근 거부
응답 처리
<sec:access-denied-handler
error-page="/accessDenied"/>
SecurityContext
Repository
2. 보관된 SecurityContext를
로딩
기본 로그인 폼 제공
보안 필터 체인
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
1. /spring_security_login 경
로 요청
2. 로그인 폼
응답 전송
인증 요청 처리 과정 (성공시)
보안 필터 체인
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
1. 인증 요청
Authentication
Manager
2. 인증 실행
SecurityContext
3. Authentication 보관
Authentication
SuccessHandler
4. 성공 후처리
SecurityContext
Repository
5. SecurityContext 보관
<sec:form-login
login-processing-url="/user/login"
username-parameter="userid"
password-parameter="password"
default-target-url="/index"
/>
인증 요청 처리 과정 (실패시)
보안 필터 체인
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
1. 인증 요청
Authentication
Manager
2. 인증 실행
Authentication
FailureHandler
3. 실패 후처리
<sec:form-login
...
authentication-failure-url="/user/loginform?error=true"
/>
로그아웃 요청 처리 과정
보안 필터 체인
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
1. 로그 아웃
요청
LogoutSuccess
Handler
3. 로그아웃 후
처리
LogoutHandler
2. 로그아웃 처
리
<sec:logout logout-url="/user/logout"
logout-success-url=”/”
/>
AuthenticationManager
AuthenticationManager 구조1
<sec:authentication-manager>
<sec:authentication-provider>
...
</sec:authentication-provider>
</sec:authentication-manager>
사용자 정보 제공사용자 암호 비교
AuthenticationProvider에 위임
AuthenticationManager 구조2
<sec:authentication-provider>
<sec:user-service>
<sec:user name="bkchoi" password="1234"
authorities="ROLE_USER" />
</sec:user-service>
</sec:authentication-provider>
<sec:authentication-provider>
<sec:jdbc-user-service
data-source-ref="dataSource"
id="jdbcUserService" />
</sec:authentication-provider>
커스텀 구현 설정
<sec:authentication-manager >
<!-- AuthenticationProvider의 커스텀 구현 사용 -->
<sec:authentication-provider ref="customAuthenticationProvider" />
<!-- DaoAuthenticationProvider 구현 사용 →
<!-- UserDetailsService의 커스텀 구현 사용 -->
<sec:authentication-provider
user-service-ref="customUserDetailsService" />
</sec:authentication-manager>
FilterSecurityInterceptor
&
AccessDecisionManager
FilterSecurityInterceptor
<sec:http use-expressions="true">
<sec:intercept-url pattern="/user/loginform" access="permitAll" />
<sec:intercept-url pattern="/user/login" access="permitAll" />
<sec:intercept-url pattern="/admin/usermanager/**"
access="hasAuthority('USER_MANAGER')" />
...
</sec:http>
AccessDecisionManager
<sec:http use-expressions="true">
...
</sec:http>

More Related Content

What's hot

Hunting for security bugs in AEM webapps
Hunting for security bugs in AEM webappsHunting for security bugs in AEM webapps
Hunting for security bugs in AEM webappsMikhail Egorov
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020Ji-Woong Choi
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정Arawn Park
 
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)Ji-Woong Choi
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리라한사 아
 
Spring security oauth2
Spring security oauth2Spring security oauth2
Spring security oauth2axykim00
 
Understanding JWT Exploitation
Understanding JWT ExploitationUnderstanding JWT Exploitation
Understanding JWT ExploitationAkshaeyBhosale
 
Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기GunHee Lee
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기Yungon Park
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계Jinho Yoo
 
우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스Arawn Park
 
Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자Kyoung Up Jung
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOPDzmitry Naskou
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정Arawn Park
 
Spring boot - an introduction
Spring boot - an introductionSpring boot - an introduction
Spring boot - an introductionJonathan Holloway
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Younghan Kim
 

What's hot (20)

Hunting for security bugs in AEM webapps
Hunting for security bugs in AEM webappsHunting for security bugs in AEM webapps
Hunting for security bugs in AEM webapps
 
Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020[오픈소스컨설팅] 스카우터 사용자 가이드 2020
[오픈소스컨설팅] 스카우터 사용자 가이드 2020
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
[오픈소스컨설팅]Scouter 설치 및 사용가이드(JBoss)
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
 
Spring security oauth2
Spring security oauth2Spring security oauth2
Spring security oauth2
 
Understanding JWT Exploitation
Understanding JWT ExploitationUnderstanding JWT Exploitation
Understanding JWT Exploitation
 
Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기Open source APM Scouter로 모니터링 잘 하기
Open source APM Scouter로 모니터링 잘 하기
 
Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 
우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스
 
Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자Django로 쇼핑몰 만들자
Django로 쇼핑몰 만들자
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
JSON Web Token
JSON Web TokenJSON Web Token
JSON Web Token
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정점진적인 레거시 웹 애플리케이션 개선 과정
점진적인 레거시 웹 애플리케이션 개선 과정
 
Spring boot - an introduction
Spring boot - an introductionSpring boot - an introduction
Spring boot - an introduction
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 

Similar to 스프링 시큐리티 구조 이해

Spring Security
Spring SecuritySpring Security
Spring Securityymtech
 
01.windows 보안(접근제어모델 리뷰) 2016.05.25
01.windows 보안(접근제어모델 리뷰)   2016.05.2501.windows 보안(접근제어모델 리뷰)   2016.05.25
01.windows 보안(접근제어모델 리뷰) 2016.05.25InGuen Hwang
 
Spring camp 발표자료
Spring camp 발표자료Spring camp 발표자료
Spring camp 발표자료수홍 이
 
Spring Security
Spring SecuritySpring Security
Spring SecurityETRIBE_STG
 
오피스세이퍼 소개자료
오피스세이퍼 소개자료오피스세이퍼 소개자료
오피스세이퍼 소개자료silverfox2580
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육NAVER D2 STARTUP FACTORY
 
내부자정보유출방지 : 엔드포인트 통합보안
내부자정보유출방지 : 엔드포인트 통합보안 내부자정보유출방지 : 엔드포인트 통합보안
내부자정보유출방지 : 엔드포인트 통합보안 시온시큐리티
 
201412 문서보안제안서 시온
201412 문서보안제안서 시온201412 문서보안제안서 시온
201412 문서보안제안서 시온시온시큐리티
 
IoT 공통 보안가이드
IoT 공통 보안가이드IoT 공통 보안가이드
IoT 공통 보안가이드봉조 김
 
네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...
네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...
네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...NAVER CLOUD PLATFORMㅣ네이버 클라우드 플랫폼
 
Spring Security
Spring SecuritySpring Security
Spring SecurityDataUs
 
웨일 보안 이야기
웨일 보안 이야기웨일 보안 이야기
웨일 보안 이야기NAVER D2
 
클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...
클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...
클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...Amazon Web Services Korea
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 
[하시코프] Vault 소개자료 (국문) Nov2021
[하시코프] Vault 소개자료 (국문) Nov2021[하시코프] Vault 소개자료 (국문) Nov2021
[하시코프] Vault 소개자료 (국문) Nov2021Jin Sol Kim 김진솔
 
Openstack security(2018)
Openstack security(2018)Openstack security(2018)
Openstack security(2018)Gasida Seo
 
[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)
[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)
[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)james yoo
 
[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩
[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩
[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩GDGCampusKorea
 
HTML5_security_(next_generation_threats)
HTML5_security_(next_generation_threats)HTML5_security_(next_generation_threats)
HTML5_security_(next_generation_threats)한익 주
 

Similar to 스프링 시큐리티 구조 이해 (20)

Spring Security
Spring SecuritySpring Security
Spring Security
 
01.windows 보안(접근제어모델 리뷰) 2016.05.25
01.windows 보안(접근제어모델 리뷰)   2016.05.2501.windows 보안(접근제어모델 리뷰)   2016.05.25
01.windows 보안(접근제어모델 리뷰) 2016.05.25
 
Spring camp 발표자료
Spring camp 발표자료Spring camp 발표자료
Spring camp 발표자료
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
오피스세이퍼 소개자료
오피스세이퍼 소개자료오피스세이퍼 소개자료
오피스세이퍼 소개자료
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
 
내부자정보유출방지 : 엔드포인트 통합보안
내부자정보유출방지 : 엔드포인트 통합보안 내부자정보유출방지 : 엔드포인트 통합보안
내부자정보유출방지 : 엔드포인트 통합보안
 
201412 문서보안제안서 시온
201412 문서보안제안서 시온201412 문서보안제안서 시온
201412 문서보안제안서 시온
 
OWASP TOP 10 in 2007
OWASP TOP 10 in 2007OWASP TOP 10 in 2007
OWASP TOP 10 in 2007
 
IoT 공통 보안가이드
IoT 공통 보안가이드IoT 공통 보안가이드
IoT 공통 보안가이드
 
네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...
네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...
네이버클라우드플랫폼 온라인 교육 시리즈 - Fluentd를 이용한 네이버클라우드플랫폼 Object Storage 로그 저장하기(윤성훈 클라...
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
웨일 보안 이야기
웨일 보안 이야기웨일 보안 이야기
웨일 보안 이야기
 
클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...
클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...
클라우드 핀테크 규제 준수를 위한 AWS 서비스 – 김지민 AWS 스타트업 솔루션즈 아키텍트, 박범준 AWS 스타트업 어카운트 매니저:: ...
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
[하시코프] Vault 소개자료 (국문) Nov2021
[하시코프] Vault 소개자료 (국문) Nov2021[하시코프] Vault 소개자료 (국문) Nov2021
[하시코프] Vault 소개자료 (국문) Nov2021
 
Openstack security(2018)
Openstack security(2018)Openstack security(2018)
Openstack security(2018)
 
[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)
[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)
[발표용 '15.11.27]정보보안 전문가 되는길 new(최종_요약본)
 
[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩
[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩
[Devfest Campus Korea 2021]보안과 함께 하는 개발, 시큐어코딩
 
HTML5_security_(next_generation_threats)
HTML5_security_(next_generation_threats)HTML5_security_(next_generation_threats)
HTML5_security_(next_generation_threats)
 

More from beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기beom kyun choi
 

More from beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 

스프링 시큐리티 구조 이해

  • 1. 스프링 시큐리티 구조 이해 (웹 어플리케이션 중심) 신림 프로그래머, 최범균, 2014-07-09
  • 2. 목표 ● 스프링 시큐리티의 구성 요소와 동작 방식 이 해 ○ 이를 통한 커스터마이징 포인트 잡기!
  • 4. 보안 관련 3요소 ● 접근 주체(Principal) ○ 보호된 대상에 접근하는 사용자 ● 인증(Authenticate) ○ 현재 사용자가 누군인지 확인하는 과정 ○ 일반적으로 아이디/암호를 이용해서 인증을 처리 ● 인가(Authorize) ○ 현재 사용자가 특정 대상(URL, 기능 등)을 사용(접근) 할 권한이 있는지 검사하는 것
  • 5. 스프링 시큐리티와 보안 3요소의 매칭 접근 주체 인증 인가 Authentication Authentication Manager Security Interceptor
  • 6. Authentication와 SecurityContext ● Authentication의 용도 ○ 현재 접근 주체 정보를 담는 목적 ○ 인증 요청할 때, 요청 정보를 담는 목적 ● SecurityContext ○ Authentication을 보관 ○ 스프링 시큐리티는 현재 사용자에 대한 Authentication 객체를 구할 때 SecurityContext로부 터 구함
  • 7. SecurityContextHolder ● SecurityContext를 보관 ○ 기본: 쓰레드로컬에 SecurityContext를 보관 ● 전형적인 SecurityContext 설정 코드 Authentication auth = someMethodForGettingAuth(req, resp); try { SecurityContextHolder.getContext().setAuthentication(auth); chain.doFilter(request, response); // 이후 코드에서 동일 SecurityContext 사용 } finally { SecurityContextHolder.clearContext(); } 스프링 시큐리티가 유사한 필터 이미 제공
  • 8. 참고, Authentication의 주요 메서드 ● Authentication의 주요 메서드 ○ String getName(): 사용자의 이름 ○ Object getCredential(): 증명 값 (비밀번호 등) ○ Object getPrincipal(): 인증 주체 정보 ○ boolean isAuthenticated(): 인증되었는지 여부 ○ Collection<GrantedAuthority) getAuthorities(): 현재 사용자가 가진 권한(GrantedAuthority)
  • 9. AuthenticationManager ● 인증을 처리함 public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; } ● 인증에 성공하면 인증 정보를 담고 있는 Authentication 객체 리턴 ○ 스프링 시큐리티는 리턴한 Authentication 객체를 SecurityContext에 보관 및 인증 상태를 유지하기 위해 세션에 보관 ● 인증 실패시 AuthenticationException을 발생시킴
  • 10. (Abstract)SecurityInterceptor ● 인가를 처리 ○ 웹의 경우 FilterSecurityInterceptor 구현 사용 ○ AccessDecisionManager에 권한 검사 위임 public interface AccessDecisionManager { void decide(Authentication authentication, // 사용자 Object object, // 접근 자원 Collection<ConfigAttribute> configAttributes) // 보안 설정 throws AccessDeniedException, InsufficientAuthenticationException; boolean supports(ConfigAttribute attribute); boolean supports(Class<?> clazz); } ● 사용자가 자원의 보안 설정 기준으로, 접근 권한이 없을 경우 익셉션 발생
  • 12. 웹 어플리케이션 보안 지원 ● 보인 필터 체인를 이용한 보안 처리 FilterChainProxy 보안 필터 체인 실제 자원 주로 다음 기능을 제공 - Authentication 정보 생성 - 접근 권한 검사 - 인증 요청 처리 <sec:http use-expressions="true"> <sec:intercept-url pattern="/admin/**" access="hasAuthority('ROLE_ADMIN')" /> <sec:intercept-url pattern="/manager/**" access="hasRole('ROLE_MANAGER')" /> <sec:intercept-url pattern="/member/**" access="isAuthenticated()" /> <sec:intercept-url pattern="/**" access="permitAll"/> <sec:form-login /> <sec:logout /> </sec:http> 생성 생성 스프링 빈으로 등록된 필터 (springSecurityFilterChain)
  • 13. 웹 요청을 FilterChainProxy 적용 <filter> <filter-name> springSecurityFilterChain </filter-name> <filter-class> o...filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> FilterChainProxy 보안 필터 체인 DelegatingFilterProxy
  • 14. 보안 필터 체인 보안 필터 체인의 주요 구성 요소 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor접근 권한 검사 익셉션 처리 로그인 폼 출력 인증 요청 처리 로그아웃 요청 처리 Authentication 로딩 ● 필터 체인은 순서대로 실 행 ● 필터에 따라 요청을 처리 하고 체인 실행을 끝내기 도 함 임의 사용자 처리
  • 15. 접근 권한 없을 때 처리, 인증 전 보안 필터 체인 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor 1. 요청 Access Decision Manager 2. 권한 검사 요청 4. 익셉션 발생 Authentication EntryPoint 5. 인증 과 정 시작 처 리 <sec:form-login login-page="/user/loginform" />
  • 16. 접근 권한 없을 때 처리, 인증 상태 보안 필터 체인 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor 1. 요청 Access Decision Manager 3. 권한 검사 요청 4. 익셉션 발생 AccessDenied Handler 5. 접근 거부 응답 처리 <sec:access-denied-handler error-page="/accessDenied"/> SecurityContext Repository 2. 보관된 SecurityContext를 로딩
  • 17. 기본 로그인 폼 제공 보안 필터 체인 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor 1. /spring_security_login 경 로 요청 2. 로그인 폼 응답 전송
  • 18. 인증 요청 처리 과정 (성공시) 보안 필터 체인 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor 1. 인증 요청 Authentication Manager 2. 인증 실행 SecurityContext 3. Authentication 보관 Authentication SuccessHandler 4. 성공 후처리 SecurityContext Repository 5. SecurityContext 보관 <sec:form-login login-processing-url="/user/login" username-parameter="userid" password-parameter="password" default-target-url="/index" />
  • 19. 인증 요청 처리 과정 (실패시) 보안 필터 체인 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor 1. 인증 요청 Authentication Manager 2. 인증 실행 Authentication FailureHandler 3. 실패 후처리 <sec:form-login ... authentication-failure-url="/user/loginform?error=true" />
  • 20. 로그아웃 요청 처리 과정 보안 필터 체인 SecurityContextPersistenceFilter LogoutFilter UsernamePasswordAuthenticationFilter DefaultLoginPageGeneratingFilter AnonymousAuthenticationFilter ExceptionTranslationFilter FilterSecurityInterceptor 1. 로그 아웃 요청 LogoutSuccess Handler 3. 로그아웃 후 처리 LogoutHandler 2. 로그아웃 처 리 <sec:logout logout-url="/user/logout" logout-success-url=”/” />
  • 23. AuthenticationManager 구조2 <sec:authentication-provider> <sec:user-service> <sec:user name="bkchoi" password="1234" authorities="ROLE_USER" /> </sec:user-service> </sec:authentication-provider> <sec:authentication-provider> <sec:jdbc-user-service data-source-ref="dataSource" id="jdbcUserService" /> </sec:authentication-provider>
  • 24. 커스텀 구현 설정 <sec:authentication-manager > <!-- AuthenticationProvider의 커스텀 구현 사용 --> <sec:authentication-provider ref="customAuthenticationProvider" /> <!-- DaoAuthenticationProvider 구현 사용 → <!-- UserDetailsService의 커스텀 구현 사용 --> <sec:authentication-provider user-service-ref="customUserDetailsService" /> </sec:authentication-manager>
  • 26. FilterSecurityInterceptor <sec:http use-expressions="true"> <sec:intercept-url pattern="/user/loginform" access="permitAll" /> <sec:intercept-url pattern="/user/login" access="permitAll" /> <sec:intercept-url pattern="/admin/usermanager/**" access="hasAuthority('USER_MANAGER')" /> ... </sec:http>