[Spring Security] 스프링시큐리티의 기본 개념과 구조
스프링시큐리티(Spring Security)란?
스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증과 권한, 인가 등)을 담당하는
스프링 하위 프레임 워크이다.
즉 인증(Authenticate, 누구인지) 과 인가(Authorize, 어떤것을 할 수 있는지)를 담당하는 프레임워크.
기본용어
-접근 주체 (Principal): 보호된 리소스에 접근하는 대상
-인증(Authentication): 보호된 리소스에 접근한 대상에 대해 누구인지, 애플리케이션의 작업을 수행해도 되는
주체인지 확인하는 과정 => 즉 누구인지?
-인가(Authorize): 해당 리소스에 대해 접근 가능한 권한을 가지고 있는지 확인하는 과정(After Authentication, 인증이후)
=> 즉, 어떤것을 할 수 있는지?
-권한: 어떠한 리소스에 대한 접근 제한, 모든 리소스는 접근 제어 권한이 걸려있음. 인가 과정에서 해당 리소스에 대한
제한된 최소한의 권한을 가졌는지 확인
Spring security 의 구조

1. 유저가 로그인을 시도(http request)
2.AuthenticationFilter 에서부터 위와 같이 userDB 타고 들어감
3.DB에 있는 유저라면 UserDetails 로 꺼내서 유저의 session 생성
4.spring security의 인메모리 세션저장소인 SecurityContextHolder에 저장
5. 유저에게 session ID와 함께 응답을 내려줌
6.이후 요청에서는 요청쿠키에서 JSESSIONID를 까봐서 검증 후 유효하면 Authentication 을 쥐어준다.

- 인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리
- 인증 관리자는 UsenamePasswordAuthenticationFilter, 접근 결정 관리자는 FilterSecurityInterceptor가 수행
Security의 filter들

각 필터별 기능 설명
| SecurityContextPersistenceFilter | SecurityContextRepository 에서 SecurityContext를 로드하고 저장하는일을 담당함 |
| LongoutFilter | 로그아웃 URL로 지정된 가상 URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용자를 로그아웃 시킴 |
| UsernamePasswordAuthenticationFilter | 사용자명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함 |
| DefaultLoginPageGeneratingFilter | 폼기반 또는 OpenID 기반 인증에 사용하는 가상 URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성함 |
| BasicAuthenticationFilter | HTTP 기본 이증 헤더를 감시하고 이를 처리함 |
| RequestCacheAwareFilter | 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용됨 SecurityContextHolderAwareRequestFilter HttpServletRequest를 HttpServletRequestWrapper를 상속하는 하위 클래스(SecurityContextHolderAwareRequestWrapper)로 감싸서 필터 체인상 하단에 위치한 요청 프로세서에 추가 컨텍스트를 제공함 |
| AnonymousAuthenticationFilter | 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨 |
| SessionManagementFilter | 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움 |
| ExceptionTranslationFilter | 이 필터는 보호된 요청을 처리하는 동안 발생할 수 있는 기대한 예외의 기본 라우팅과 위임을 처리함 |
| FilterSecurityInterceptor | 이 필터는 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌 |