ㅅㅇ

[Spring Securtiy] Spring Securtiy FilterChain필터 본문

SW_STUDY/SpringBoot

[Spring Securtiy] Spring Securtiy FilterChain필터

SO__OS 2023. 3. 8. 19:21

처리 순서대로 정리한 거 아님.

1. SecurityContextPersistenceFilter

: SecurityContext 객체를 생성, 조회 하는 필터

크게 세 가지 일을 한다.

  • SecurityContext 를 영속화 하는 역할
    • 인증 성공 후 후처리 로직 수행 시점에서 동시에 수행 되는 로직
    • 필터 내부의 SecutrityContextRepository(HttpSecurityContextRepository) 에서 처리 : HttpSession 의 Attribute에 SecurityContext 객체를 저장하는 클래스
    • 해당 필터는 매 번 요청마다 수행
  • 요청 전반에 걸쳐 필요시, SecurityContext를 조회하는 역할
    • Session에서 SecurityContext를 꺼내 SecurityContextHolder에 집어넣은 뒤 다음 필터들을 수행한다.
  • 최종 응답 시, 초기화 역할
    • Client에게 응답(Response)하기 전 Session에 SecurityContext를 담은 뒤, SecurityContext객체에서 보관하던 인증정보를 초기화 해준 다음, 응답을 합니다.

2. LogoutFilter

: 설정된 로그아웃 url 로 오는 요청을 감시하며, 매칭되는 요청이 있으면 해당 유저를 로그아웃 처리

3. UsernamePasswordAuthenticationFilter

: Form기반의 아이디와 비밀번호로 진행되는 로그인 url 요청을 감시 및 유저 인증을 처리하는 필터

→ AuthenticationManager를 통한 인증 실행

 

1. 인증관리자 AuthenticationManager

: 인증 객체 Authentication 으로 인증 처리를 수행.

  • UsernamePasswordAuthenticationFilter 로부터 인증 처리를 지시 받으면 가지고 있는 인증 처리자(AuthenticationProvider)들 중에서 현재 인증 처리를 할 수 있는 적절한 Provider에게 인증 처리를 위임한다.
    • 만약, 적절한 Provider를 못찾는다면 자신의 부모 객체에 저장된 ProviderManager도 검색하여 해당 인증을 처리할 수 있는 Provider가 있으면 인증처리를 위임하여 반환한다.
  • Provider에서 인증 성공을 한다면 반환 받은 인증 객체를 UsernamePasswordAuthenticationFilter 에게 전달해준다.

2. 인증 처리자 AuthenticationProvider

  • 인증관리자(AuthenticationManager)에게 인증처리를 위임받아, 위임받은 해당 Provider가 input 정보(id, password)를 가지고 실제 인증 처리한다.
  • AuthenticationProvider 는 인터페이스. 두 개의 메서드가 제공된다.
  1. supports(authentication): 인증처리가 가능한 Provider인지 검사하는 메서드
  2. authenticate(authentication) : 실제적인 인증처리를 위한 검증 메서드

1) 아이디 검증
UserDetailsService 인터페이스에서 인증을 요구하는 사용자 정보를 조회한다.
a. (존재할 경우) UserDetails 타입으로 반환한다.
b. (존재하지 않을 경우) UserNotFoundException 발생

 

2) 패스워드 검증
: 반환된 UserDetails에 저장된 password와 로그인 시 입력한 패스워드(authentication.password) 가 일치하는지 비교한다. 일반적으로 패스워드를 저장할 때 Password Encoder를 이용해 암호화 하여 저장하기 때문에 PasswordEncoder를 이용해 두 암호를 비교한다.

boolean matches = passwordEncoder.matches(login.getAccountPassword(), account.getAccountPassword());

boolean matches = passwordEncoder.matches(login.getAccountPassword(), account.getAccountPassword());

a. (일치하지 않을 경우) BadCredentialException 발생

 

3) 추가 검증
추가적으로 사용자가 정의한 검증 조건 검증

 

=> 검증이 모두 성공하면

최종적으로 인증객체(Authentication(user,authorities))를 생성하여

AuthenticationManager에 전달한다.

4. DefalutLoginPageGeneratingFilter

: 폼기반 또는 OpenID 기반 인증에 사용 요청을 감시하고 로그인폼 기능을 수행하는데 필요한 HTML 을 생성

5. BasicAuthenticationFilter

: HTTP 기본 인증 헤더를 감시하여 처리

6. RequestCacheAwareFilter

: 로그인 성공 후, 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는 필터

data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==

7. SecurityContextHolderAwareRequestFilter

: HttpServletRequestWrapper 를 상속하는 하위 클래스(SecurityContextHolderAwareReuqestWapper)로 감싸서 필터 체인상 하단에 위치한 요청 프로세서에 추가 컨텍스트를 제공

  • SecurityContextHolderAwareReuqestWapper클래스는 필터 체인 상의 다음 필터들에게 부가정보를 제공함.

9. AnonymousAuthenticationFilter

: 해당 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 동작하여 AnonymousAuthenticationToken 객체를 SecurityContext에 저장하여 사용자가 익명 사용자로 나타나게 함.

8. SessionManagementFilter

: Session에 SecurityContext가 없는 경우나 Session이 없는 경우 동작. 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움.

9. ConcurrentSessionFilter

session.isExpired를 통해 현재 세션이 만료되었는지 확인

이 필터는 최소 두 명 이상이 동일한 계정으로 접속을 시도하는 경우에 동작한다.

  • SessionManagementFilter VS ConcurrentSessionFilter
    • SessionManagementFilter는 인증하는 과정에서 동시 세션을 확인하고, 필요 시 세션을 만료처리해준다.
    • ConcurrentSession은 세션이 만료되었는지 확인하고, 만료된 경우 Logout을 처리 및 오류 페이지를 응답해주는 역할을 한다.
  • ⇒ 둘다 동시 세션을 제어하는 역할을 한다.

10. ExceptionTranslationFilter

: 보호된 요청 처리에서 발생할 수 있는 예외를 위임하거나 전달하는 역할의 필터

  • Try Catch로 다음 필터 동작을 감싸서 FilterSecurityInterceptor수행 중 일어나는 예외를 받아서 동작
  • 예시
    • 인증객체가 없을경우 AuthenticationException발생하여 ExceptionTranslationFilter 에게 전달
    • 접근이 인가되지 않을 경우 AccessDeniedException 발생하여 ExceptionTranslationFilter 에게 전달

11. FilterSecurityInterceptor

=> 인가 처리 담당 필터

 

: 마지막에 위치한 필터로써 인증된 사용자에 대해 인가(특정 요청의 승인 및 거부)를 최종적으로 결정

  • 권한 제어 방식 중 HTTP 자원의 보안을 처리하는 필터. URL방식으로 접근할 경우 동작한다.
  • AccessDecisionManager 에게 인가(권한 부여) 처리를 위임하여 접근 제어 결정을 쉽게 하게 해준다.
  • (인증객체가 없을 경우) AuthenticationException발생하여 ExceptionTranslationFilter 에게 전달
  • (인증 후, 접근이 인가 되지 않을 경우) AccessDeniedException 발생하여 ExceptionTranslationFilter 에게 전달

1. AccessDecisionManager

: 인증,요청,권한 정보를 이용해서 사용자의 자원접근을 허용/거부 여부를 최종 결정하는 주체

  • 여러 개의 Voter들을 가질 수 있고, Voter들로부터 접근허용, 거부, 보류에 해당하는 각각의 값을 리턴 받아 판단&결정한다. → 최종 심의 결정자

2. AccessDecisionVoter

: 판단을 심사하는 것(위원)

  • 각각의 Voter마다 사용자의 요청마다 해당 자원에 접근할 권한이 있는지 판단 후 AccessDecisionManager에게 반환하는 역할
  • Voter가 권한 부여 과정에서 판단하는 자료
    • Authenticaion - 인증정보(user)
    • FilterInvocator - 요청 정보(antMatcher("/user"))
    • ConfigAttributes - 권한 정보(hasRole("USER"))
  • 결정 방식
    • ACCESS_GRANTED: 접근 허용(1)
    • ACCESS_DENIED: 접근 거부(-1)
    • ACCESS_ABSTAIN: 접근 보류(0) : Voter가 해당 타입의 요청에 대해 결정을 내릴 수 없는 경우

⇒ AccessDecisionManager 은 반환 받은 해당 결정 방식을 사용해서 후처리

 

11. RememberMeAuthenticationFilter

: Remember-Me 작업을 해주는 필터

  • RememberMe
    • 현재 사용자가 세션이 만료되고 웹 브라우저가 종료 후에도 어플리케이션이 사용자를 기억하도록 해줌.
    • 세션이 무효화되어 세션 내부의 인증객체(Authentication)이 비어있을 경우 동작
    • Remember-Me시 사용자의 요청 정보(header)에 세션Id와 remember-me cookie 값을 확인 세션 Id가 없다고 해도 Remember-Me 쿠키를 통해 로그인이 유지

12. FilterSecurityInterceptor 인가 처리 담당 필터

: 마지막에 위치한 필터로써 인증된 사용자에 대해 인가(특정 요청의 승인 및 거부)를 최종적으로 결정

  • 권한 제어 방식 중 HTTP 자원의 보안을 처리하는 필터. URL방식으로 접근할 경우 동작한다.
  • AccessDecisionManager 에게 인가(권한 부여) 처리를 위임하여 접근 제어 결정을 쉽게 하게 해준다.
  • (인증객체가 없을 경우) AuthenticationException발생하여 ExceptionTranslationFilter 에게 전달
  • (인증 후, 접근이 인가 되지 않을 경우) AccessDeniedException 발생하여 ExceptionTranslationFilter 에게 전달
  1. AccessDecisionManager

: 인증,요청,권한 정보를 이용해서 사용자의 자원접근을 허용/거부 여부를 최종 결정하는 주체

  • 여러 개의 Voter들을 가질 수 있고, Voter들로부터 접근허용, 거부, 보류에 해당하는 각각의 값을 리턴 받아 판단&결정한다. → 최종 심의 결정자
  1. AccessDecisionVoter

: 판단을 심사하는 것(위원)

  • 각각의 Voter마다 사용자의 요청마다 해당 자원에 접근할 권한이 있는지 판단 후 AccessDecisionManager에게 반환하는 역할
  • Voter가 권한 부여 과정에서 판단하는 자료
    • Authenticaion - 인증정보(user)
    • FilterInvocator - 요청 정보(antMatcher("/user"))
    • ConfigAttributes - 권한 정보(hasRole("USER"))
  • 결정 방식
    • ACCESS_GRANTED: 접근 허용(1)
    • ACCESS_DENIED: 접근 거부(-1)
    • ACCESS_ABSTAIN: 접근 보류(0) : Voter가 해당 타입의 요청에 대해 결정을 내릴 수 없는 경우

⇒ AccessDecisionManager 은 반환 받은 해당 결정 방식을 사용해서 후처리

 

 

https://gngsn.tistory.com/160