[ODOP] 88일차 - 스프링 시큐리티 아키텍처:재인증 요청 흐름

[ODOP] 88일차 - 스프링 시큐리티 아키텍처:재인증 요청 흐름
  1. 사용자가 재인증을 시도
    가정 : 로그인된 사용자가 다른 페이지로 접근 시도, 이미 가입된 사용자, 정상적인 로그인 요청
  2. Controller 의 라이프사이클이 실행되기 이전, DelegatingFilterProxy 가 먼저 해당 요청을 수신
  3. DelegatingFilterProxy 는 springSecurityFilterChain 이라는 이름을 가진 bean(FilterChainProxy) 에게 요청을 위임
  4. SecurityContextPersistenceFilter
    이 경우 두번째 로그인 하는 사용자이기 때문에 session 에 로그인 이력이 남아있게 된다.
    따라서 session 에서 해당 SecurityContext 를 세션에서 꺼내어 SecurityContextHolder 에 저장한다.
    결과적으로 create SecurityContext 는 동작하지 않게 된다.
  5. ConcurrentSessionFilter
    이전의 두 filter 는 다음의 조건 때문에 무시
    - 로그아웃 요청이 아니기에 LogoutFilter 는 무시
    - 새로운 로그인 요청이 아니기에 UsernamePasswordAuthenticationFilter 또한 무시
    두명 이상이 동시에 로그인을 시도 할 때 동작하는 Filter
    따라서 첫 로그인에서는 작동하지 않아 무시되었으며 이 경우에도 동작하지 않음.
  6. RememberMeAuthenticationFilter
    remember-me 쿠키를 활성화 하여 로그인한 사용자의 세션 만료 시간이 다 되었을 경우.
    해당 사용자가 다시 요청을 시도할 때 Authentication 객체가 null 이 되어 있는 것을 확인할 수 있다.
    이 때 사용자가 다른 페이지로의 접근 시 동작하는 filter
    (인증을 받은 사용자일 경우 동작하지 않는다.)
  7. AnonymousAuthenticationFilter
    인증을 받지 않은 사용자가 어떠한 자원에 접근하려할 때 동작하는 filter
    현재 가정은 인증을 받은 사용자가 접근하고 있기 때문에 해당 Filter 는 무시된다.
    해당 filter 는 익명 사용자가 접근하는 경우 익명사용자용 토큰을 만들고 해당 토큰을 SecurityContext 에 저장하는 역할을 수행
  8. SessionManagementFilter
    해당 Filter 는 다음 경우에 동작한다
    - 현재 세션에 SecurityContext 가 없는 경우
    - session 이 null 일 경우
    - UsernamePasswordAuthenticationFilter 에서 필요에 의해 동작하는 경우. 따라서 UsernamePasswordAuthenticationFilter 뿐만 아니라 위의 두 경우를 만족하는 경우에도 동작한다.
  9. ExceptionTranslationFilter
    비즈니스 로직이 없다시피 한 필터. 코드를 까보면 알겠지만, chain.doFilter 외에는 아무것도 없다.
    정말 Exception을 Translate 하기 위한 Filter
  10. FilterSecurityInterceptor
    인가에 대한 처리를 하기 위한 필터
    해당 Interceptor 는 총 두가지를 판단하고 Exception 을 발생
    a: SecurityContext 에 인증객체Authentication가 존재하는가?
       - 존재하지 않는다면 인가 처리를 진행할 수 없기 때문에 바로 AuthenticationException을 발생.
         인가 를 하기 위해서는 해당 인증 객체의 권한을 확인하고 권한에 따른 접근 여부를 판단할 수 있어야 한다. 하지만 인증 객체가 없다면 인가를 위한 처리를 진행할 수 없기 때문에 바로 Exception 을 발생시킨다
     Exception이 발생하면 바로 위 9번에 해당하는 ExceptionTranslationFilter 로 처리 흐름이 넘어가게 된다.
    b: 인증 객체Authentication가 가지고있는 권한 정보Role는 요청Request을 처리하기에 합당한가?
       - 내부에 존재하는 AccessDecisionManager 가 AccessDecisionVoter 의 심사 결과에 따라 인가 여부를 판단