SlideShare uma empresa Scribd logo
1 de 27
Baixar para ler 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>

Mais conteúdo relacionado

Mais procurados

Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기경원 이
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...Amazon Web Services Korea
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]MongoDB
 
Token Authentication in ASP.NET Core
Token Authentication in ASP.NET CoreToken Authentication in ASP.NET Core
Token Authentication in ASP.NET CoreStormpath
 
Hacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesHacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesMikhail Egorov
 
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트Amazon Web Services Korea
 
Secure your app with keycloak
Secure your app with keycloakSecure your app with keycloak
Secure your app with keycloakGuy Marom
 
Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심
Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심
Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심Amazon Web Services Korea
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
Celery의 빛과 그림자
Celery의 빛과 그림자Celery의 빛과 그림자
Celery의 빛과 그림자Minyoung Jeong
 
What should a hacker know about WebDav?
What should a hacker know about WebDav?What should a hacker know about WebDav?
What should a hacker know about WebDav?Mikhail Egorov
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈용근 권
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계Jinho Yoo
 
프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구Taegon Kim
 
REST API 설계
REST API 설계REST API 설계
REST API 설계Terry Cho
 
Scalable Gaming with AWS - GDC 2014
Scalable Gaming with AWS - GDC 2014Scalable Gaming with AWS - GDC 2014
Scalable Gaming with AWS - GDC 2014Nate Wiger
 
Spring Security
Spring SecuritySpring Security
Spring SecurityBoy Tech
 
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ BehaviourWAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ BehaviourSoroush Dalili
 

Mais procurados (20)

Spring Security 5
Spring Security 5Spring Security 5
Spring Security 5
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
Token Authentication in ASP.NET Core
Token Authentication in ASP.NET CoreToken Authentication in ASP.NET Core
Token Authentication in ASP.NET Core
 
Hacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sitesHacking Adobe Experience Manager sites
Hacking Adobe Experience Manager sites
 
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
게임사를 위한 Amazon GameLift 세션 - 이정훈, AWS 솔루션즈 아키텍트
 
Secure your app with keycloak
Secure your app with keycloakSecure your app with keycloak
Secure your app with keycloak
 
Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심
Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심
Gaming on AWS - 1. AWS로 글로벌 게임 런칭하기 - 장르별 아키텍처 중심
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
Celery의 빛과 그림자
Celery의 빛과 그림자Celery의 빛과 그림자
Celery의 빛과 그림자
 
What should a hacker know about WebDav?
What should a hacker know about WebDav?What should a hacker know about WebDav?
What should a hacker know about WebDav?
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 
프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구프론트엔드 코딩 컨벤션 자동화 도구
프론트엔드 코딩 컨벤션 자동화 도구
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
Scalable Gaming with AWS - GDC 2014
Scalable Gaming with AWS - GDC 2014Scalable Gaming with AWS - GDC 2014
Scalable Gaming with AWS - GDC 2014
 
Spring Security
Spring SecuritySpring Security
Spring Security
 
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ BehaviourWAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
WAF Bypass Techniques - Using HTTP Standard and Web Servers’ Behaviour
 

Semelhante a 스프링 시큐리티 구조 이해

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
 

Semelhante a 스프링 시큐리티 구조 이해 (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분만에 따라하는 동시성 스크래퍼
 

Mais de 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
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰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
 

Mais de 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
 
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>