Chat 상우

스프링 시큐리티 Security filter chain 알아보기 1편 본문

Framework/spring

스프링 시큐리티 Security filter chain 알아보기 1편

chat-rilla 2024. 9. 24. 18:45

Spring security 알아보기

스프링 시큐리티란?

스프링 시큐리티는 스프링 기반 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 프레임워크이다.
Security는 인증과 권한에 대한 부분을 Filter의 흐름에 따라서 처리하게 되며 보안과 관련된 옵션을 체계적으로 제공해주기 때문에 개발자가 일일이 보안과 관련된 로직을 작성하지 않아도 되는 장점을 가지고 있다.

더보기

용어 알아보기

1. Principal : 주체 

2. Secured Resource : 보안이 적용되는 리소스 

3. Authentication : 인증 

4. Authorization : 권한

스프링 시큐리티 로직

스프링 시큐리티 Architecture
스프링 시큐리티 Architecture

  1. 사용자의 로그인 요청
  2. AuthenticationFilter에서 사용자의 아이디와 비밀번호를 기반으로 UserPasswordAuthentiactionToken을 발행한다.
  3. 생성된 AuthenticationManager에 전달
  4. AuthenticationManager 등록된 AuthenticationProvider에 사용자 정보조회 요청
  5. UserDetailsService에서 사용자의 정보를 조회하고 UserDetails에 정보를 저장하여 반환함
  6. 조회시 입력된 username을 기반으로 조회함
  7. AuthenticationProvider에 조회된 사용자의 username, password를 비교
  8. 일치하는 경우 AuthenticationManager에 객체를 반환함
  9. 해당 인증 정보를 SecurityContextHolder에 저장함

Security Filter chain

Security Filter chain
Security filter chain

  1. SecurityContextPersistenceFilter
    해당 필터는 Security에서 제공하는 중요한 필터로 요청 사이에 보안 컨텍스트를 유지하는 역할을 수행하게 된다.
    인증된 사용자의 보안 컨텍스트가 여러 요청에서 유지되어 사용자의 인증 상태 및 부여된 권한을 유지하도록 한다.
    만약 비어있는 경우 새로운 보안 context를 생성한다.
    애플리케이션에 요청이 들어오면 해당 요청을 가로채서 요청과 관련된 보안 컨텍스트가 있는지 확인하게 되며 존재하는 경우 요청 기간 동안(session) SecurityContextHolder에 설정된다.

  2. LogutFilter
    인증된 사용자의 로그아웃 프로세스를 처리하는 Spring Security Filter chain이다.
    로그아웃 요청을 가로채고 세션 무효화, 인증 지우기, 지정된 로그아웃 성공 url로 리다이렉션과 같이 사용자를 로그아웃하는데 필요한 작업을 수행한다.

  3. UsernamePasswordAuthenticationFilter
    사용자 이름과 암호를 포함하는 인증 요청 처리를 하기 위해 Spring security filter chain에서 제공하는 핵심 구성 요소이다. 요청을 가로채고 제공된 자격 증명을 사용해서 사용자의 인증을 시도하게 된다. 사용자 인증을 위해 AuthenticatioManager에서 인증 절차를 진행하게 된다.
  4. DefaultLoginPageGeneratingFilter
    스프링 시큐리티에 로그인 요청시 기본 로그인 페이지 생성을 담당하는 필터이다. 
    formLogin() 메서드 호출시 양식을 기반으로 인증을 활성화 하는 필터로 로그인 된 사용자의 url에 사용자 이름과 암호를 제출하는 로그인 양식으로 기본 로그인 페이지를 생성하게 되며 실패한 로그인 시도에 대한 사용자 정의 가능한 오류 메세지를 포함하는 기능을 제공하고 있다.
  5. BasicAuthenticationFilter
    기본 인증을 처리하는 Spring security filter chain에서 제공하는 필터로 기본 인증은 사용자 자격 증명(사용자 이름 및 암호)가 인코딩되어 각 요청에 HTTP헤더로 전송되는 간단한 인증 메커니즘이다. 인증이 필요한 요청을 가로채고 기본 인증 체계로 Authorization 헤더가 있는지 확인하여 헤더가 있는 경우 필터는 인코딩된 자격 증명을 추출하여 사용자 인증을 시도한다.
    실제 인증은 AuthenticationProvider에서 담당하며 AuthenticationManger에서 구성이 되어 있다. 이러한 방식으로 BasicAuthenticationFilter를 구성하게 되면 SpringSecurity는 요청이 있을 때 Authorization 헤더에서 인코딩된 자격 증명을 추출하여 사용자 인증을 시도할 때 기본 인증 프로세스를 처리하게 된다. 해당 필터는 base64 인코딩 형식으로 자격 증명을 전송하기 때문에 HTTPS를 사용한 양식 기반 인증을 하는 것이 보다 안전하다.

  6. RememberMeAuthenticationFilter
    세션이 만료된 사용자에게 Remember-me 토큰을 기반으로 사용자를 자동으로 인증할 수 있도록 한다. 해당 필터를 구현하게 되면 RememberMeServices를 상속받아 구현해야 하며 토큰 유효성 검사 및 인증 설정을 해주어야 한다. PersistentTokenBasedRememberMeServices 구현이 사용되며 UserDetailService 구현이 필요하다. 해당 필터는 적절한 보안 조치가 필요하며 토큰은 애플리케이션의 보안을 보장하기 위해 안정하게 저장되고 적절하게 검증되어야 한다.
  7. SecurityContextHolderAwareRequestFilter
    HttpServletRequest에 SecurityContextHolder를 설정하는 필터로 현재 보안 컨텍스트를 인식하도록 보장하는 Spring Security filter chain에서 제공하는 필터이다. 사용자 요청에 대한 보안 컨텍스트를 설정하여 후속 처리 구성 요소가 보안 정보에 액세스 할 수 있도록 한다. HttpServletRequest에 액세스 하는 컨트롤러 또는 기타 필터와 같은 후속 구성 요소에서 보안 컨텍스트를 사용할 수 있으며 해당 구성 요소가 보안 컨텍스트에서 현재 사용자의 인증 및 권한 부여 정보를 검색할 수 있다. 애플리케이션이 활성화 되어 있을때 Security에 의해 자동으로 추가된다.
  8. AnonymousAuthenticationFilter
    인증 객체를 생성하여 다른 인증이 설정되지 않은 경우 SecurityContextHolder에 설정을 하는 역할을 하게 된다. 익명 사용자에게 인증을 요구하지 않고 애플리케이션에 특정 부분을 액세스할 수 있도록 하는 Security filter chain이다. 익명 사용자의 인증 정보를 관리하는 객체는 AnonymousAuthenticationToken로 구성되어 있으며 기본 설정으로 이름은 anonymousUser 권한 및 역할로 GrantedAuthority 목록을 생성하여 ROLE_ANONYMOUS로 익명 사용자에게 할당된다.

  9. sessionManagementFilter
    사용자의 세션을 관리하는 필터로 새로운 새션을 생성하거나 무효화, 고정 세션 공격 보호 등 세션의 동시성 제어를 포함한 세션 정책을 시행하게 된다. 사용자의 요청에 따라 세션을 효과적으로 관리하기 위해서 사용하는 필터이다.

  10. ExceptionTranslationFilter
    인증 및 권한 부여 프로세스 중에 발생하는 예외를 포착하여 이를 로그인 페이지로 리다이렉션 처리하거나 오류 응답을 반환하는 것과 같은 적절한 변환을 하는 역할을 하게 된다. 액세스가 거부될 때 인증 프로세스를 시작하는 역할을 하는 AuthenticatiojnEntryPoint의 인스턴스로 구성되어 있다. 인증 및 권한 부여 관련 예외를 포착하여 로그인페이지로 리다이렉션을 하거나 오류를 반환하는 것과 같은 응답을 트리거하도록 되어 있다.

  11. FilterSecurityInterceptor
    보안 규칙을 기반으로 액세스 제어를 수행하는 SpringSecurity Filter chain에서 제공하는 키 필터이다.
    권한 부여 규칙을 적용하고 사용자가 특정 리소스에 액세스하거나 특정 작업을 수행할 수 있는지 여부를 결정하게 된다. FilterSecurityInterceptor는 스프링시큐리티 필터 체인에 있으며 보호된 리소스에 도달하기 전에 요청을 가로채게 된다. 정의된 보안 구성에 대한 요청된 url 및 관련 HTTP 메서드를 평가하여 사용자가 진행할 수 있는 권한이 있는지 확인한다.