Filter Chain과 Authentication

SaGo_MunGcci·2022년 8월 4일
2

스프링

목록 보기
9/31

Definition Access

  • Filter Chain

  • Authentication 객체



Mechanism

1.Security의 Filter

  • Spring Security는 DelegatingFilterProxy 라는 필터를 만들어 메인 Filter Chain에 끼워넣고, 그 아래 다시 SecurityFilterChain 그룹을 등록한다.

  • URL에 따라 적용되는 Filter Chain을 다르게 하는 방법을 사용한다.

  • 어떠한 경우에는 해당 Filter를 무시하고 통과하게 할 수도 있다.
    SecurityFilterChain 클래스를 통해 Filter Chain을 구성할 수 있다.
    HttpSecurity http 를 매개변수로 filter들을 세팅한다.

@Component
@EnableWebSecurity(debug = true)
@RequiredArgsConstructor
public class SecurityConfig {

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http

                // CSRF 설정 Disable
                .csrf().disable()

                // exception handling 할 때 우리가 만든 클래스를 추가
                .exceptionHandling()
                .authenticationEntryPoint(jwtAuthenticationEntryPoint)
                .accessDeniedHandler(jwtAccessDeniedHandler)


                // h2-console 을 위한 설정을 추가
                .and()
                .headers()
                .frameOptions()
                .sameOrigin()



                // 시큐리티는 기본적으로 세션을 사용
                // 여기서는 세션을 사용하지 않기 때문에 세션 설정을 Stateless 로 설정
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

                // 로그인, 회원가입 API등은 토큰이 없는 상태에서 요청이 들어오기 때문에 permitAll 설정
                .and()
                .authorizeRequests()
                .antMatchers("/auth/**").permitAll()
                .antMatchers("/api/member/signup").permitAll()
                .antMatchers("/api/member/login").permitAll()
                .antMatchers("/api/post").permitAll()
                .antMatchers("/api/post/**").permitAll()
                .antMatchers("/api/comment/**").permitAll()

                .anyRequest().authenticated()   // 나머지 API 는 전부 인증 필요

                // JwtFilter 를 addFilterBefore 로 등록했던 JwtSecurityConfig 클래스를 적용
                .and()

                .formLogin()

                .and()

                .apply(new JwtSecurityConfig(tokenProvider));



        return http.build();


    }



}
  • Security의 Filter의 종류

  • HeaderWriterFilter : Request의 Http 해더를 검사하여 header를 추가하거나 빼주는 역할을 한다.

  • CorsFilter : 허가된 사이트나 클라이언트의 요청인지 검사하는 역할을 한다.

  • CsrfFilter : Post나 Put과 같이 리소스를 변경하는 요청의 경우 내가 내보냈던 리소스에서 올라온 요청인지 확인한다.

  • LogoutFilter : Request가 로그아웃하겠다고 하는것인지 체크한다.

  • UsernamePasswordAuthenticationFilter : username / password 로 로그인을 하려고 하는지 체크하여 승인이 되면 Authentication을 부여하고 이동 할 페이지로 이동한다.

  • ConcurrentSessionFilter : 동시 접속을 허용할지 체크한다.

  • BearerTokenAuthenticationFilter : Authorization 해더에 Bearer 토큰을 인증해주는 역할을 한다.

  • BasicAuthenticationFilter : Authorization 해더에 Basic 토큰을 인증해주는 역할을 한다.

  • RequestCacheAwareFilter : request한 내용을 다음에 필요할 수 있어서 Cache에 담아주는 역할을 한다. 다음 Request가 오면 이전의 Cache값을 줄 수 있다.

  • SecurityContextHolderAwareRequestFilter : 보안 관련 Servlet 3 스펙을 지원하기 위한 필터라고 한다.

  • RememberMeAuthenticationFilter : 아직 Authentication 인증이 안된 경우라면 RememberMe 쿠키를 검사해서 인증 처리해준다.

  • AnonymousAuthenticationFilter : 앞선 필터를 통해 인증이 아직도 안되었으면 해당 유저는 익명 사용자라고 Authentication을 정해주는 역할을 한다. (Authentication이 Null인 것을 방지!!)

  • SessionManagementFilter : 서버에서 지정한 세션정책에 맞게 사용자가 사용하고 있는지 검사하는 역할을 한다.

  • ExcpetionTranslationFilter : 해당 필터 이후에 인증이나 권한 예외가 발생하면 해당 필터가 처리를 해준다.

  • FilterSecurityInterceptor : 사용자가 요청한 request에 들어가고 결과를 리턴해도 되는 권한(Authorization)이 있는지를 체크한다. 해당 필터에서 권한이 없다는 결과가 나온다면 위의 ExcpetionTranslationFilter필터에서 Exception을 처리해준다.

참고 : https://velog.io/@seongwon97/Spring-Security-Filter%EB%9E%80

2. Authentication 객체

  • 클라이언트가 자신이 주장하는 사용자와 같은 사용자인지를 확인하는 과정이다.
  • 인증 시 id와 password를 담고 인증 검증을 위해 전달되어 사용된다.
    인증 후 최종 인증 결과를 Authentication객체(User객체, 권한 정보)에 담고 SecurityContext에 저장되어 전역적으로 참조가 가능해진다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
  • principal : 사용자 아이디 또는 User 객체
  • credentials : 사용자 비밀번호
  • authorities : 인증된 사용자의 권한 목록
  • details : 사용자의 인증 정보 외에 부가 정보
  • Authenticated : 인증 여부

참고 : https://uchupura.tistory.com/26



Retrospection

  • 스프링 JWT를 사용하면서 익힌 개념들이다.
  • 기술매니저님께서 이 부분은 코딩적인 이해 보다는 전반적인 작동원리를 이해 하는 것에 중점을 두는 것이 좋다고 하셨다.(왜냐??? 주니어한테는 이런거 처음부터 안시킨다고 한다.....아....다행이다?!.....)


profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글