개발 지식

Spring security 구조 및 동작

HeoN97 2024. 6. 6. 18:18

Spring Security

Spring기반 애플리케이션에서 보편적으로 사용되며, 인증과 권한 부여를 제공하는데 중점을 둔 보안 프레임워크입니다.

더보기

인증 ( Authentication ) - 사용자가 누구인지 확인하는 과정

인가 ( Authorization ) - 인증된 사용자가 어떠한 자원에 접근할 수 있는 권한을 부여하는 과정

 

 

Servlet Filter

Spring Security는 Servlet Filter를 기반으로 하고 있습니다.

FilterChain

Filter는 요청과 읍당에 대한 정보들을 변경할 수 있게 개발자들에게 제공하는 Servlet Container입니다.

FilterChain은 이러한 Filter들이 체인처럼 서로 연결되어 연쇄적으로 동작합니다.

 

 

Spring Security 구조

  1. DelegatingFilterProxy
    • 사용자가 처음 요청을 하면 이곳에서 가장 먼저 요청을 받고, FilterChainProxy에게 요청을 위임합니다.
    • DelegatingFilterProxy는 ServletFilter이며 위임을 할 때에는 "SpringSecurityFilterChain"이라는 이름을 가진 Bean( FilterChainProxy )을 먼저 찾습니다.
  2. FilterChainProxy
    • DelegatingFilterProxy으로부터 요청을 위임받아 실제 보안 처리하는 곳입니다
    • Spring Security 초기화 시 생성되는 필터들을 관리하고 제어합니다.
    • 사용자의 요청을 필터 순서대로 호출하여 전달합니다.
    • 마지막 필터까지 예외가 발생하지 않으면 보안 통과합니다.
  3. SpringSecurityFilterChain
    • 이 FilterChain에는 여러 필터들이 존재하는 데 몇 가지만 확인해 보겠습니다.
    • 종류
      • LogoutFilter : 로그아웃 요청 시에만 실행
      • UsernamePasswordAuthenticationFilter : 인증 객체를 만들어서 ID, PW를 저장하고 AuthenticationManager에게 인증처리를 맡깁니다.
      • ExceptionTranslationFilter : 인증, 인가 예외가 발생할 경우 실행되며, 인증과 인가의 예외 (AccessDeninedException, AuthenticationException)를 처리합니다.
  4. 큰 틀

출처 : https://velog.io/@choidongkuen/Spring-Security-Spring-Security-Filter-Chain-%EC%97%90-%EB%8C%80%ED%95%B4

 

 

 

Spring Security 동작

  1. Request가 들어오면 AuthenticationFilter에서 인증과 인가를 진행합니다.
    • 허가받지 않은 요청이 DispatcherServlet에서 처리되는 것을 방지해 줍니다.
  2. 토큰 기반 인증 방식으로 처리합니다. (UsernamePasswordAuthenticationToken)
    • Request의 Header에서 토큰을 받아 해당 토큰을 decoding 한 후 Authentication 처리 
    • 해당 함수에서 반환된 객체는 Authentication 객체로 처리됩니다.
  3. AuthenticationManager로 인증 수행과정이 넘어가게 됩니다.
    • "Authentication Manager"는 스프링 보안의 필터가 인증을 수행하는 방법을 정의하는 API입니다.
    • "ProviderMananger"가 AuthenticatoinManager를 implement 하고 있으며, Authentication을 수행하는 주체는 ProviderManger입니다.
  4. AuthenticatoinManager는 Provider를 기반으로 인증을 수행하려고 합니다.
    • Provider에서는 인증에 관련된 논리를 구현하려고 합니다.
    • 이때의 Provider는 하나 또는 여러 개가 존재할 수 있습니다.
    • Provider 중 하나인 CustomAuthenticationProvider는 인증 객체에서 이름과 패스워드를 가져와서 사용자를 검증
    • 이때, 사용하는 것이 UserDetailService입니다.
  5. UserDetailsService는 User의 정보를 가져오는 부분입니다.
    • 이때, loadUserByUsername을 오버라이딩해야 하며, 이 부분에서 반환값은 UserDetail인데 UserDetail은 AutheticationToken을 만들 때 사용됩니다.
  6. AuthenticationToken을 이용해 AuthenticationProvider는 User를 만들고 이를 바탕으로 인증이 완료된 객체를 생성하고 반환합니다.
  7. 인증이 완료된 객체는 다시 거꾸로 넘어와 최종적으로 SecurityContext에 등록하게 됩니다.

 

 

참고

https://soojae.tistory.com/54

 

[스프링 시큐리티] 필터(DelegatingFilterProxy, FilterChainProxy)

※ 이 글은 정수원님의 스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security 강의를 수강하면서 학습한 내용을 정리한 글입니다. 일부 강의 내용을 인용하였으며, 문제가 될 시 인용 부분

soojae.tistory.com

https://gngsn.tistory.com/160

 

Spring Security, 제대로 이해하기 - FilterChain

Spring Security의 인증, 인가 과정을 FilterChain을 살펴보며 이해하는 것이 본 포스팅의 목표입니다. 해당 포스팅은 1부 Spring Security, 어렵지 않게 설정하기의 이은 포스팅이지만, 읽는데 순서는 상관

gngsn.tistory.com

https://me-analyzingdata.tistory.com/entry/Spring-Spring-Security%EC%9D%98-%EC%9D%B4%ED%95%B4

 

[Spring] Spring Security의 이해

Spring Security는 자바 어플리케이션에서 인가와 인증을 제공하는 것에 초점을 맞춘 프레임 워크이다. 스프링에서 주장하기로는 Spring security의 확장성이 매우 큰 장점이라고 한다. 근데 사실 Spring s

me-analyzingdata.tistory.com