ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Security] 스프링 시큐리티 주요 아키텍처
    Dev/정리 2023. 1. 20. 19:53

     

    아래 내용은 Core Spring Security 스프링 시큐리티 기본 API & Filter 이해를 수강 후, 정리한 내용입니다.


    전체적인 Spring Security의 전체적인 아키텍처와 동작과정을 나타난 것이다. 

     

    3가지 형태의 Spring Security 동작과정을 살펴볼 것이다.

     

    1) 사용자가 처음 인증을 시도하는 경우
    2) 인증 후 자원요청하는 경우
    3) 첫번째 사용자과 동일한 계정으로 로그인을 시도하는 경우

     

    1. 사용자가 처음 인증을 시도하는 경우

    1. SecurityContextPersistenceFilter

    SecurityContextPersistenceFilter 내부에 있는 loadContext를 이용하여 Session에 저장된 이력이 있는지 체크한다.

    처음 로그인을 시도하였기 때문에 Save Session을 진행하여 Authentication을 생성해줍니다. 

     

    2. LogoutFilter

    LogoutFilter는 로그아웃을 요청하지 않았다면 진행되지 않는다.

     

    3. UsernamePasswordAuthenticationFilter

    UsernamePasswordAuthenticationFilter는 Form인증 처리를 진행하는 Filter이다.

    ID, PW를 저장한 Authentication을 가지고 차례대로 Authentication Manager 인증 처리  후, Authentication Provider로 인증 검증을 한다.

    UserDetailsService로 ID, PW를 검증한다

    검증이 성공이 성공하면 SecurityContext에서 Authentication 객체를 생성하여 setAuthentication을 해준다. 

     

    4. ConcurrentSessionFilter

    ConcurrentSessionFilter는 동시세션처리를 하는 필터이다. 즉, 최소 2명 이상이 시도하는 경우를 체크하기 위한 필터이다.

    이 필터에 대해선 3번째 케이스때 더 자세히 얘기가 나온다

     

    그 다음 2번째 케이스를 알아보자 ! 

     

    2. 인증이 성공한 유저가 자원요청을 하는 경우

    1. SecurityContextPersistenceFilter

    1번 케이스와 마찬가지로 SecurityContextPersistenceFilter 를 거칩니다.

    하지만, 1번 케이스와 다르게, loadContextd에서 인증객체가 존재하기 때문에, 그 이후 단계는 진행하지 않는다.

    위에 설명한대로 logout을 요청하지 않았으니 당연히 LogoutFilter도 거치지않는다.

    이미 인증한 객체는 UsernamePasswordAuthenticationFilter도 거치지 않는다.

     

    2. ConcurrentSessionFilter

    ConcurrentSessionFilter 를 거쳐 이전 세션이 유효한지 체크한다.

    RememberMe AuthenticaFilter는 인증 객체가 null일 경우에만 진행한다. 따라서 거치지 않는다.

    Anonymous AutneitcaionFilter는 인증 시도도 하지 않고 권한이 없이 시도하는 경우에만 동작한다. 따라서 거치지 않는다. 

     

    3. ExceptionTranslationFilter

    2번째 케이스에서 가장 큰 역할을 하는 ExceptionTranslationFilter에서 인가예외가 발생할 경우 모든 예외는 FilterSecurity Inceptor이 처리한다.

    Check authenticated에서 현재 사용자가 인증 객체가 존재하는지 체크한다.

    없다면,  Authentication Exception을 발생시킨다.

    만일 있다면 다음 단계인, AccessDecision Manager을 진행한다. 

    없다면, AccessDenied Exception을 발생시킨다.

    만일 있다면, AccessDecision Voter를 거쳐 승인 or 거부를 진행한다. 

     

    3. 첫번째 사용자와 동일한 계정으로 로그인을 시도할 경우(중복 로그인)

    1. UsernamePasswordAuthenticationFilter

    위 케이스와 마찬가지로 차례대로 UsernamePasswordAuthenticationFilter를 진행한다. 

     

    2. SessionFilter

    하지만, 동시 세션 처리 필터인 Concurrent SessionFilter에서

    session.isExpired 에서 true가 되어 logout 처리를 진행하고 response로 error 를 내려준다. 

     

    이때, Spring Security Config 에서 설정한 전략 2개에 따라 다르게 응답을 내려준다.

    전략1 ) SessionAuthentication Exception 은 현재 사용자 인증 시도를 차단한다.

    전략2) session.expireNow 는 현재 사용자는 인증 성공시키고, 이전 사용자 세션은 만료 시킨다. 

    'Dev > 정리' 카테고리의 다른 글

    [Clean Code] 형식 맞추기  (0) 2022.05.17
    [Clean Code] 함수  (0) 2022.05.15
    [Clean Code] 깨끗한 코드, 의미 있는 이름  (0) 2022.05.14

    댓글

Designed by Tistory.