13.2 스프링 시큐리티(Spring Security)

김찬미·2024년 7월 1일
0

스프링 시큐리티란?

스프링 시큐리티(Spring Security)는 스프링 프레임워크 기반의 애플리케이션에서 보안 기능을 쉽게 구현할 수 있도록 도와주는 보안 프레임워크이다. 보안과 관련된 많은 기능을 제공하기 때문에 스프링 시큐리티를 활용하면 더욱 편리하게 원하는 기능을 설계할 수 있다.


스프링 시큐리티의 동작 구조


스프링 시큐리티는 서블릿 필터(Servlet Filter) 기반으로 동작한다. 애플리케이션의 요청이 DispatcherServlet에 도달하기 전에 스프링 시큐리티의 필터가 먼저 요청을 처리한다.

위 그림의 필터 체인(FilterChain)은 서블릿 컨테이너에서 관리하는 ApplicationFilterChain을 의미한다. 스프링 시큐리티는 사용하고자 하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 DelegatingFilterProxy를 사용한다.

필터 체인 구조

  1. 클라이언트 요청: 사용자가 요청을 보낸다.
  2. 서블릿 컨테이너: 요청을 받아 URI에 따라 필터와 서블릿을 매핑한다.
  3. DelegatingFilterProxy: 스프링 시큐리티의 필터 체인을 서블릿 컨테이너와 연결하는 역할을 한다.
  4. 보안 필터체인: 여러 보안 필터(Security Filter)를 담고 있는 필터 체인이다. URI 패턴에 따라 적절한 보안 필터 체인을 선택해 사용한다.

주요 보안 필터

보안 필터는 순서대로 실행되며, 대표적인 필터는 다음과 같다:

  • UsernamePasswordAuthenticationFilter: 사용자 이름과 비밀번호를 사용해 인증한다.
  • BasicAuthenticationFilter: HTTP 기본 인증을 처리한다.
  • CsrfFilter: CSRF 공격을 방지한다.
  • LogoutFilter: 로그아웃 요청을 처리한다.
  • ExceptionTranslationFilter: 인증 및 인가 예외를 처리한다.
  • FilterSecurityInterceptor: 인가(권한 검증)를 처리한다.

스프링 시큐리티에서는 WebSecurityConfigurerAdapter 클래스를 상속받은 여러 클래스를 만들어서 보안 필터 체인을 설정할 수 있다. 각 클래스는 충돌 방지를 위해 @Order 어노테이션을 사용하여 우선순위를 지정해야 한다. 기본적으로 스프링 시큐리티는 SecurityFilterChain에서 UsernamePasswordAuthenticationFilter를 사용하여 인증을 처리한다.


인증 수행 과정

필터 체인의 동작 과정

  1. 요청 처리: 클라이언트로부터 요청을 받으면 서블릿 필터가 동작하고, 이때 SecurityFilterChain으로 작업이 위임된다. 그 중 UsernamePasswordAuthenticationFilter가 인증을 담당한다.

  2. 토큰 생성: UsernamePasswordAuthenticationFilter는 요청 객체(HttpServletRequest)에서 사용자 이름과 비밀번호를 추출하여 인증 토큰을 생성한다.

  3. 토큰 처리: 생성된 인증 토큰은 AuthenticationManager에 전달된다. AuthenticationManager는 인증을 담당하는 인터페이스이며, 일반적으로 ProviderManager가 사용된다.

  4. 토큰 처리 과정:

    • ProviderManagerAuthenticationProvider에게 토큰을 전달하여 인증을 시도한다.
    • AuthenticationProvider는 토큰의 정보를 UserDetailsService에 전달하여 데이터베이스에서 해당 사용자 정보를 조회하고 UserDetails 객체를 생성한다.
  5. 인증 완료: 생성된 UserDetails 객체는 다시 AuthenticationProvider로 전달되며, 해당 Provider에서 인증이 성공하면 권한 정보를 포함한 토큰을 ProviderManager로 반환한다.

  6. 토큰 저장: ProviderManager는 검증된 토큰을 다시 AuthenticationFilter로 전달하고, AuthenticationFilter는 이를 SecurityContextHolderSecurityContext에 저장한다.

추가 정보

  • UsernamePasswordAuthenticationFilter는 인증이 실패할 경우 로그인 폼을 다시 보여주는 역할을 한다.
  • RESTful 애플리케이션에서는 화면이 없기 때문에 다른 방식의 인증 및 인가 처리를 구현할 필요가 있다. 예를 들어, JWT 토큰을 사용하여 인증을 수행하는 방법을 사용할 수 있다.

💡 Tip.
스프링 시큐리티에 대한 자세한 내용은 공식 문서를 참고하기 바란다.
https://docs.spring.io/spring-security/site/docs/5.5.3/reference/html5/

profile
백엔드 개발자

0개의 댓글

관련 채용 정보