[Spring Security] 스프링 시큐리티 아키텍처

k·2024년 2월 12일
0

spring security

목록 보기
2/3

스프링 시큐리티 아키텍처

필터 체인 (Filter Chain)

스프링 시큐리티의 핵심 디자인 패턴이다.

위와 같은 구조를 띄고있다.

처음에 나오는 Filter는 FilterProxy 전에 진행되는 Filter이다.
마지막에 나오는 Filter는 FilterProxy 후에 진행되는 Filter이다.

최종적으로 DelegatingFilterProxy 는 스프링 애플리케이션 컨텍스트내에 기본적으로 제공하는 필터들을 필요에 따라 대리로 진행 시켜준다.

아래는 DelegatingFilterProxy가 대리로 진행시킬 수 있는 필터 목록이다.


이 중에서 인증과 인가에 대한 아키텍처에 대해서 간단하게 소개하겠다.

스프링 시큐리티의 인증 아키텍처

위는 실제 아키텍처는 내가 좀 더 보기 편하게 그린 그림이다.

간단하게 설명하자면

  1. 클라이언트로 부터 요청이 들어온다.

  2. AuthenticationFilter가 해당 요청을 받아 UsernamePasswordAuthenticationToken 을 통해 Authentication 인스턴스를 생성한다.

  3. AuthenticationFilter가 해당 Authentication 인스턴스를을 ProviderManager로 보낸다.

    이 때, ProviderManger는 AuthenticationManger의 구현체이다.

  4. 이후 ProviderManger는 AuthenticationProvider 를 선택해서 해당 Provider에 authenticate함수를 호출한다.

    이 때, ProviderManger는 AuthenticationManger의 구현체이다.
    또한, authenticate함수 호출을 할 때 인자로 Authentication 인스턴스가 들어간다.

    AuthenticationProvider는 Dao,Jwt와 같은 어떤 인증 제공자를 사용할 것인지에 따라 다르게 작용한다.
    즉, AuthenticationProvider는 인터페이스이다.

  5. 해당 authenticate 함수를 호출하게되면 CustomUserDetailsService에서 사용자를 비교하여, 유효한 사용자이면 해당 사용자를 CustomUserDetails에 담아 return 한다.

    이 때, CustomUserDetailsService 는 UserDetailsService의 구현체이다.
    GrantedAuthority 또한 이 때 설정할 수 있다.
    @override loadUserByUserName 내에서 설정가능하다.

    이 때, CustomUserDetails는 UserDetails의 구현체이다.

  6. 이를 통해서 모든 과정이 완료되면, AuthenticationFilter에 Authentication 인스턴스가 다시 반환된다.

  7. 해당 Authentication 인스턴스는 SecurityContext에 담기게 된다.

여기까지가 간단하게 정리한 스프링 시큐리티의 내부 동작이다.

스프링 시큐리티 인가 아키텍처

여기는 그림보다는 AccessDecisionManager만 잘 이해하면 될 것 같아서 AccessDecisionManager에 대해서 설명하겠다.

AccessDecisionManager

해당 인터페이스의 구현체는 주어진 사용자의 권한과 요청된 리소스에 대한 권한 설정(ConfigAttribute)을 기반으로 실제로 접근을 허용할지 또는 거부할지를 결정한다.

주로 여러 AccessDecisionVoter를 통해 투표를 진행하고, 투표 결과를 종합하여 최종 결정을 내린다.

AccessDecisionVoter를 구현하여 커스텀 권한 평가 로직을 만들 수 있다.

AccessDecisionVoter의 함수원형

  • boolean supports(ConfigAttribute attribute)
    해당 voter가 지정된 ConfigAttribute를 지원하는지 여부를 반환한다. 일반적으로는 voter의 동작에 필요한 권한 속성을 지원하는지 확인하는 용도로 사용된다.
  • boolean supports(Class<?> clazz)
    해당 voter가 지정된 클래스를 지원하는지 여부를 반환한다. 일반적으로는 AccessDecisionManager가 사용하는 객체의 클래스를 지원하는지 확인하는 용도로 사용된다.
  • int vote(Authentication authentication, Object object, Collection attributes)
    현재 사용자의 인증 정보, 접근 대상 객체, 그리고 권한 속성들을 기반으로 실제 접근 결정을 내린다.

    반환값
    ACCESS_GRANTED (0): 접근을 허용.
    ACCESS_DENIED (1): 접근을 거부.
    ACCESS_ABSTAIN (-1): 해당 Voter가 접근 결정에 참여하지 않음을 나타냄.

profile
You must do the things you think you cannot do

0개의 댓글