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개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN