SpringSecurity 학습(24) -- 스프링 시큐리티 필터 및 아키텍처 정리

carlkim·2023년 11월 1일

스프링시큐리티학습

목록 보기
24/24

전체 흐름 정리

---- 초기화 작업 -----

  1. 설정 클래스들을 만들고 API를 정리하고 API들이 각각 요청을 받아 처리하게 구성.

  2. SpringSecurityConfigure 클래스를 만들면 시큐리티가 초기화될 때

  3. API와 구성대로 HttpSecurity 클래스 Filter들을 생성한다.

  4. 이 필터들은 WebSecurity 클래스에게 전달이 된다.

  5. 각 설정대로 만들어진 필터들을 전달 받는다.

WebSecurity는 FilterChainProxy 클래스의 Bean 객체를 생성한다.

  1. 생성자로 전달받은 필터 목록들을 전달한다.

그러면 FilterChainProxy는 WebSecurity가 전달한 Filter 목록을 가지고 있다.

그리고 DelegatingFilterProxy(서블릿필터) 클래스도 초기화 할 때 FilterChainProxy가 bean으로 생성.

사용자에게 요청이 들어왔을 때

springSecurityFilterChain의 이름을 가진 빈을 찾아 요청을 위임한다.

springSecurityFilterChain == FilterChainProxy 이다

---- 여기까지 초기화 과정 -----

초기화 때 필터체인프록시가 자기가 전달 받은 필터들에게 요청을 맡긴다.

필터들이 체인으로 연결되어 자신의 역할이 끝나면 다음 필터로 요청을 보내면서 일을 처리해나간다.

---- 필터 작동 순서 ----

  1. 사용자 요청이 들어온다.

  2. SecurityContextPersistenceFilter가 받는다.

    1-2 HttpSessionSecurityContextRepository 클래스를 가지고 있는데 SecurityContext 객체를 생성하고 Session에 저장하고
    Session에 저장된 securityContext를 참조하고 저장하는 클래스이다.

    1-3 loadContext -- 이 사용자가 이전에 SecurityContext에 저장된 이력이 있는지 체크

1-4 사용자 이력이 없으면
새로운 SecurityContext 생성 후 다음 필터로 전달(익명, 이력이 없는 사용자)

  1. LogoutFilter
    2-1 로그아웃을 처리하는 필터
    로그아웃 요청이 없으면 작동하지 않아.
  2. UsernamePasswordAuthenticationFilter 작동
    3-1 폼 인증처리를 하는 필터
    3-2 인증 객체를 만든다
    3-3 인증처리를 AuthenticationManager에게 요청한다.
    3-4 AuthenticationProvider에게 인증처리를 위임한다.
    3-5 UserdetailsService 클래스를 이용해서 아이디 패스워드를 검증한다.
    3-6 전부 검증이 완료되면 SecurityContextHolder안에 SecurityContext 안 Authentication 을 저장한다.

인증필터는 인증이 성공한 다음 후속처리

  1. ConcurrentSessionFilter
    1) 동일한 계정으로 두 명 이상이 접속했을 때 작동

  2. RememberMeAuthenticaFilter
    -- 인증객체가 null일 경우 이 필터가 작동한다.
    -- 현재 사용자의 request header에 remember-me 쿠키값을 저장한 상태로왔을 때
    접속한 사용자 대신에 인증처리를 시도한다.
    -- remember-me 기능을 활성화 하고 인증을 받았다면 이 필터가 동작한다.
    -- 인증받은 사용자가 접근할 때는 작동하지 않는다.

  3. AnoymousAuthenticationFilter
    -- 익명 사용자용 필터
    -- 어떤 사용자가 인증시도도 하지 않고 권한도 없이 자원에 접근하는 경우 작동.
    -- 익명 사용자 인증 토큰을 발행해서 SecurityContext 객체에 저장하는 역할을 한다.
    -- 현재 사용자가 인증 사용자인지 익명 사용자인지 확인한다

  4. SessionManagementFilter
    인증을 처리하며 세 가지 작업을 동시에 처리하는 필터
    -- 작동 조건 --
    현재 세션에 SecurityContext가 없는 경우 or 세션이 느릴 경우
    아래 세 가지 작업을 진행한다.
    7-1. 세션 정보 등록
    7-2. 세션 고정 보호
    7-3. 세션 제한 처리.
    1) 현재 사용자의 인증 시도 차단
    2)이전 사용자의 세션 만료

  5. ExceptionTranslationFilter
    -- 인증이나 인가 예외가 터졌을 때 작동하는 필터 --
    Try
    chain,doFilter
    catch

  6. FilterSecurityInterceptor
    -- 인가 처리를 하는 필터 --
    두 가지 체크
    1) SecurityContext 안에 인증 객체가 있는지 체크
    (인증 객체가 없으면 즉시 인증 예외 발생 --> 인증이 없으면 권한 체크(인가)를 못하잖아)
    2) 인증 객체가 있다면? (인증받은 사용자라면 인가처리를 한다)
    2-1) AccessDecisionManager 가 인가처리를 한다
    AccessDecisionManager는 AccessDecisionVoter 클래스를 가지고 최종적으로
    사용자의 승인과 거부를 결정한다.

  7. 후속작업은 핸들러에서 처리.
    (인증 페이지로 이동하든, 루트페이지로 가든)

------- 필터 작동 순서 --------

profile
기본부터 가면 됩니다.

0개의 댓글