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

우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스Arawn Park
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...Amazon Web Services Korea
 
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015CODE BLUE
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulSeungYong Oh
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)Heungsub Lee
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 Young-Ho Cho
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민종민 김
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용흥배 최
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍명신 김
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Kyoung Up Jung
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법Sungchul Park
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 

What's hot (20)

우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
XSS Attacks Exploiting XSS Filter by Masato Kinugawa - CODE BLUE 2015
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민검색엔진이 데이터를 다루는 법 김종민
검색엔진이 데이터를 다루는 법 김종민
 
Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
Spring Core
Spring CoreSpring Core
Spring Core
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍동기화 시대를 뛰어넘는 비동기 프로그래밍
동기화 시대를 뛰어넘는 비동기 프로그래밍
 
Json Web Token - JWT
Json Web Token - JWTJson Web Token - JWT
Json Web Token - JWT
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법자바에서 null을 안전하게 다루는 방법
자바에서 null을 안전하게 다루는 방법
 
Vue js for beginner
Vue js for beginner Vue js for beginner
Vue js for beginner
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 

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
 
[하시코프] 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)한익 주
 
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼Cheol Kang
 

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 스타트업 어카운트 매니저:: ...
 
[하시코프] 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)
 
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
[PyConKR 2014] 30분만에 따라하는 동시성 스크래퍼
 

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
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)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)
 
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 짧게 보기
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)
 

스프링 시큐리티 구조 이해

  • 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>