SlideShare a Scribd company logo
스프링 시큐리티 구조 이해
(웹 어플리케이션 중심)
신림 프로그래머, 최범균, 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

Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
Jesus Perez Franco
 
The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016
The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016
The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016
Frans Rosén
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
Kyoung Up Jung
 
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programsAEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
Mikhail Egorov
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례
Hyung Lee
 
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Christian Schneider
 
Defending against Java Deserialization Vulnerabilities
 Defending against Java Deserialization Vulnerabilities Defending against Java Deserialization Vulnerabilities
Defending against Java Deserialization Vulnerabilities
Luca Carettoni
 
Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)
Scott Wlaschin
 
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
Suhyun Park
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
beom kyun choi
 
Spring Security
Spring SecuritySpring Security
Spring Security
Sumit Gole
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
DaeMyung Kang
 
Deep dive into Vue.js
Deep dive into Vue.jsDeep dive into Vue.js
Deep dive into Vue.js
선협 이
 
우아한 객체지향
우아한 객체지향우아한 객체지향
우아한 객체지향
Young-Ho Cho
 
Building Advanced XSS Vectors
Building Advanced XSS VectorsBuilding Advanced XSS Vectors
Building Advanced XSS Vectors
Rodolfo Assis (Brute)
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용
KyeongMook "Kay" Cha
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
Dzmitry Naskou
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
Arawn Park
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
ichirin2501
 

What's hot (20)

Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016
The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016
The Secret Life of a Bug Bounty Hunter – Frans Rosén @ Security Fest 2016
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programsAEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
AEM hacker - approaching Adobe Experience Manager webapps in bug bounty programs
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례인프런 - 스타트업 인프랩 시작 사례
인프런 - 스타트업 인프랩 시작 사례
 
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
 
Defending against Java Deserialization Vulnerabilities
 Defending against Java Deserialization Vulnerabilities Defending against Java Deserialization Vulnerabilities
Defending against Java Deserialization Vulnerabilities
 
Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)
 
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
코딩 테스트 및 알고리즘 문제해결 공부 방법 (고려대학교 KUCC, 2022년 4월)
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
webservice scaling for newbie
webservice scaling for newbiewebservice scaling for newbie
webservice scaling for newbie
 
Deep dive into Vue.js
Deep dive into Vue.jsDeep dive into Vue.js
Deep dive into Vue.js
 
우아한 객체지향
우아한 객체지향우아한 객체지향
우아한 객체지향
 
Building Advanced XSS Vectors
Building Advanced XSS VectorsBuilding Advanced XSS Vectors
Building Advanced XSS Vectors
 
날로 먹는 Django admin 활용
날로 먹는 Django admin 활용날로 먹는 Django admin 활용
날로 먹는 Django admin 활용
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 

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

Spring Security
Spring SecuritySpring Security
Spring Security
ymtech
 
01.windows 보안(접근제어모델 리뷰) 2016.05.25
01.windows 보안(접근제어모델 리뷰)   2016.05.2501.windows 보안(접근제어모델 리뷰)   2016.05.25
01.windows 보안(접근제어모델 리뷰) 2016.05.25
InGuen Hwang
 
Spring camp 발표자료
Spring camp 발표자료Spring camp 발표자료
Spring camp 발표자료수홍 이
 
Spring Security
Spring SecuritySpring Security
Spring Security
ETRIBE_STG
 
오피스세이퍼 소개자료
오피스세이퍼 소개자료오피스세이퍼 소개자료
오피스세이퍼 소개자료silverfox2580
 
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
[네이버D2SF] 안전한 서비스 운영을 위한 Ncloud 보안교육
NAVER D2 STARTUP FACTORY
 
내부자정보유출방지 : 엔드포인트 통합보안
내부자정보유출방지 : 엔드포인트 통합보안 내부자정보유출방지 : 엔드포인트 통합보안
내부자정보유출방지 : 엔드포인트 통합보안
시온시큐리티
 
201412 문서보안제안서 시온
201412 문서보안제안서 시온201412 문서보안제안서 시온
201412 문서보안제안서 시온
시온시큐리티
 
OWASP TOP 10 in 2007
OWASP TOP 10 in 2007OWASP TOP 10 in 2007
OWASP TOP 10 in 2007
Samsung Electronics
 
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 Security
DataUs
 
웨일 보안 이야기
웨일 보안 이야기웨일 보안 이야기
웨일 보안 이야기
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 소개자료 (국문) Nov2021
Jin 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
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
beom kyun choi
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
beom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
beom kyun choi
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
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
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
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>