Spring Security

유요한·2023년 1월 19일
0
post-thumbnail

Security

Spring Security는 Spring과는 별개로 작동하는 보안담당 프레임워크입니다.

크게 두 가지의 동작을 수행

  1. Authentication(인증) : 특정 대상이 누구인지 확인하는 절차이다.

  2. Authorization(권한) : 인증된 주체가 특정한 곳에 접근 권한을 확인하는 것이다.

인증 과정

위 과정에서 사용된 UsernamePasswordAuthenticationFilter는 접근 권한을 확인하고 인증이 실패한 경우 로그인 폼이라는 화면을 보내는 역할을 수행합니다.

시큐리티 구조

웹에서 스프링 시큐리티는 기본적으로 아래와 같이 필터 기반으로 동작한다. 많은 필터들이 존재하며, DispatcherServlet 을 호출하기 전에 거치게 된다.

필터 체인

필터들은 위의 그림과 같이 체인되어 있다. 임의의 필터를 생성하고 원하는 필터 앞이나 뒤에 삽입하면 될 듯 하다.

동작 구조

  • Spring Security의 의존성을 추가한 경우 위와 같이 WebSecurityConfigurerAdapter클래스가 실행되게 됩니다.

  • WebSecurityConfigurerAdapter클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며 내부 적으로 getHttp()메서드가 실행될 때 HTTPSecurity 클래스를 생성하게 됩니다.

  • 이때의 HTTPSecurity는 인증/인가 API들의 설정을 제공합니다.

  • 우리가 인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야합니다.

Spring Security Filter

스프링 시큐리티는 필터를 기반으로 수행된다.

필터와 인터셉터의 차이는 실행되는 시점의 차이이다.

  • 필터는 dispatcher servlet으로 요청이 도착하기 전에 동작한다.
  • 인터셉터는 dispatcher servlet을 지나고 controller에 도착하기 전에 동작한다.

  • SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.

  • LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리

  • (UsernamePassword)AuthenticationFilter: (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리

    • AuthenticationManager를 통한 인증 실행
    • 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
    • 인증 실패 시, AuthenticationFailureHandler 실행
  • DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL을 감시한다.

  • BasicAuthenticationFilter : HTTP 기본 인증 헤더를 감시하여 처리한다.

  • RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.

  • SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공한다.

  • AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.

  • SessionManagementFilter : 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.

  • ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.

  • ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.

사용자 정의 보안 기능 구현하기

앞서 말했듯이 우리가 인증/인가의 설정을 바꾸고자 한다면 아래와 같아 WebSecurityConfigurerAdapter를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 인가 정책 설정
        http
                .authorizeRequests() // 요청에 대한 보안 검사 실행
                .anyRequest().authenticated(); // 어떠한 요청에도 인증을 받도록 설정
        
        // 인증 정책 설정
        http
                .formLogin(); // formLogin인증 방식을 사용하도록 설정
    }
}

profile
발전하기 위한 공부

0개의 댓글