Spring Security (2)

Jeong Gyejin·2023년 3월 12일
0

스프링 프레임워크

목록 보기
9/17

필터체인

보안 필터체인에서 사용하는 필터는 여러 종류가 있으며, 각 필터마다 실행되는 순서가 다릅니다.

보안 필터체인은 과거에는 WebSecurityConfigurerAdapter 클래스를 상속받아 설정했으나, 현재는 @Bean을 이용해서 필터체인을 등록해서 사용할 수 있습니다.
이때 필터 체인 프록시는 여러 보안 필터 체인을 가질 수 있는 데, 여러 보안 필터체인을 @Order 어노테이션을 통해 순서를 지정해줄 수 있습니다.
만약 별도의 설정이 없다면 SecurityFilterChain에서 사용하는 UsernamePasswordAuthenticationFilter를 통해 인증을 처리합니다.

인증과정을 설명하면 다음과 같습니다.

  1. 클라이언트로부터 요청을 받으면 서블릿 필터에서 SecurityFilterChain으로 작업이 위임되고 그 중 UsernamePasswordAuthenticationFilter에서 인증을 처리합니다.
  2. AuthenticationFilter는 요청 객체에서 username과 password를 추출해서 토큰을 생성합니다.
  3. 그리고나서 AuthenticationManager에게 토큰을 전달합니다. AuthenticationManager는 인터페이스이며, 일반적으로 사용되는 구현체는 ProviderManager입니다.
  4. ProviderManager는 인증을 위해 AuthenticationProvider로 토큰을 전달합니다.
  5. AuthenticationProvider로 토큰의 정보를 UserDetailsService에 전달합니다.
  6. UserDetailsService는 전달받은 정보를 통해 데이터베이스에서 일치하는 사용자를 찾아 UserDetails 객체를 생성합니다.
  7. 생성된 UserDetails 객체는 AuthenticationProvider로 전달되며, 해당 Provider에서 인증을 수행하고 성공하게되 ProviderManager로 권한을 담은 토큰을 전달합니다.
  8. ProviderManager는 검증된 토큰을 AuthenticationFilter 전달합니다.
  9. AuthenticationFilter는 검증된 토큰을 SecurityContextHolder에 있는 SecurithContext에 저장합니다.

위 과정에서 사용된 UsernamePasswordAuthenticationFilter는 접근 권한을 확인하고 인증이 실패한 경우 로그인 폼이라는 화면을 보내는 역할을 수행합니다.
JWT 토큰을 사용해 인증을 수행할 때는 JWT와 관련된 필터를 생성후 UsernamePasswordAuthenticationFilter 앞에 배치해서 먼저 인증을 수행할 수 있게 설정해야합니다.

profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글