Spring Security
Spring Security의 이론이 무엇인가요!
스프링 시큐리티를 이용하면 개발시 피룡한 사용자의 인증, 권한, 보안 처리를 간단하지만 강력하게 구현할 수 있습니다. 일반적인 웹 환경에서 브라우저가 서버에게 요청을 보내게 되면 DispatcherServlet이 요청을 받기 이전에 많은 SevletFilter들을 거치게 됩니다. Spring Security도 서블릿 필터로서 작동하여 인증, 권한과 관련한 처리를 진행하게 됩니다.
Spring Filter Chain?
Spring Security와 관련한 서블릿 필터도 실제로는 연결된 여러 필터들로 구성되어 있습니다. 이러한 모습 때문에 Chain이라는 표현을 쓰고 있습니다. 해당 필터들의 역할과 흐름을 알고 있어야 필터의 커스터마이징을 진행할 수 있습니다.
SecurityContextPersistenceFilter
- request가 발생하면 SecurityContext 객체의 생성, 저장, 조회를 담당하는 필터입니다.
- 익명의 사용자의 경우 , 새로운 SecurityContext 객체를 생성하여 SecurityContextHolder에 저장합니다.
- AnonymousAuthenticationFilter에서 AnonymousAuthenticationToken객체를 SecurityContext에 저장합니다.
- 인증 시, 새로운 SecurityContext를 생성하여 SecurityContextHolder에 저장합니다.
- UsernamePasswordAuthenticationFilter에서 인증 성공후 SecurityContext에 UsernamePasswordAuthentication객체를 Authentication객체와 함께 저장합니다. 인증이 완료되면 Session에 SecurityContext를 저장하고 Response합니다.
- 인증 후 , Session에서 SecurityContext를 꺼내 SecurityContextHolder에 저장합니다. SecurityContext내 Authentication객체가 있으면 인증을 유지합니다.
LogoutFilter
유저의 로그아웃을 진행합니다. 설정된 로그아웃 URL로 오는 요청을 감시하여 , 해당 유저를 로그아웃 처리합니다.
UsernamePasswordAuthenticationFilter
설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증을 처리합니다. 인증 실패시, AuthenticationFailureHandler를 실행합니다.
DefaultLoginPageGenerationgFilter
사용자가 별도의 로그인 페이지를 구현하지 않은 경우, 스프링에서 기본적으로 설정한 로그인 페이지를 처리합니다.
BasicAuthenticationFilter
HTTP요청의 (BASIC)인증 헤더를 처리하여 결과를 SecurityContextHolder에 저장합니다.
RememberMeAuthenticationFilter
SecurityContext에 인증(Authentication) 객체가 있는지 확인하고 RememberMeServices를 구현한 객체의 요청이 있을 경우, Remember-Me인증 토큰으로 컨텍스트에 주입합니다.
AnonymousAuthenticationFilter
SecurityContextHolder에 인증(Authentication)객체가 있는지 확인하고, 필요한 경우 Authentication 객체를 주입합니다.
SessionManagementFilter
요청이 시작된 이후 인증된 사용자인지 확인하고, 인증된 사용자일 경우, SessionAuthenticaitonStrategy를 호출하여 세션 고정 보호 메커니즘을 활성화하거나 여러 동시 로그인을 확인하는 것과 같은 세션 관련 활동을 수행합니다.
ExceptionTranslationFilter
필터 체인 내에서 발생(Throw)하는 모든 예외(AccessDeniedException, AuthenticationException)를 처리합니다.
FilterSecurityInterceptor
HTTP리소스의 보안처리를 수행합니다.
참고 레퍼런스
'Web > Spring' 카테고리의 다른 글
Framework 와 라이브러리의 차이는 무엇일까? (0) | 2021.05.02 |
---|---|
SOLID (SRP, OCP, LSP, ISP, DIP) (0) | 2021.03.16 |
Spring의 구조와 역할 (0) | 2021.03.16 |
구조와 로그, Debugging의 이야기 (0) | 2021.02.25 |