[ASAC 3기 개발일지] Spring Security - Spring Security Architecture

배규리·2023년 11월 16일
0
post-thumbnail

저번 게시물에서 Spring Security의 Filter와 Interceptor 기능에 대해서 알아봤다!
사실 진짜 간단하게 말하면 클라이언트의 요청이 발생하고, 데이터가 오고가고 하는 와중에 에러가 날 수도 있고, 보안상에 문제가 발생할 수도 있는데 이 때 디버깅하거나 이를 방지할 수도 있게 해주는 친구들이었다!😊

이번에는 Spring Security의 Architecture에 대해서 알아볼 것이다.

Spring Security Architecture

Spring Security의 핵심은 SecurityFilterChain이다.
그 내부에 Spring Security가 제공하는 수 많은 Filter들이 존재하고 이를 기반으로 동작한다.
HTTP Request를 가로채는 웹 애플리케이션 Architecture의 첫 번째 계층은 Filter Chain이다.

Filter Chain에서 생성한 Filter와 Spring에서 관리하는(빈으로 정의되어 관리되는)Filter는 다르니 주의☝️

Spring Security의 내부 구조에 대해서 알아보기 전에 각 영역의 역할들에 대해서 알아보자.

  • UsernamePasswordAuthenticationToken

    • Authentication을 Implements
    • AbstractAuthenticationToken의 하위 클래스
  • AuthenticationManager

    • 인증의 대부분을 처리
    • 인증에 성공하면 객체를 생성하여 SecurityContext에 저장
  • AuthenticationProvider

    • 실제 인증 부분 처리
    • 인증 전의 Authentication 객체를 받아서 인증이 완료된 객체를 반환하는 역할
  • ProviderManager

    • AuthenticationManager을 Implements
    • AuthenticationProvider를 구성하는 목록을 갖는다.
  • UserDetailsService

    • UserDetails객체를 반환하는 하나의 메소드만을 가지고 있다.
  • UserDetails

    • 인증에 성공하여 생성된 객체
    • Authentication 객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용
  • SecurityContextHolder⭐

    • 보안 주체의 세부 정보를 포함하여 응용 프로그램의 현재 SecurityContext에 대한 세부 정보가 저장된다.
  • SecurityContext⭐

    • Authentication을 보관하는 역할
    • 이를 통해 Authentication을 저장하거나 꺼내올 수 있다.
  • Authentication⭐

    • 현재 접근하는 주체의 정보와 권한을 담는 인터페이스
    • 아래와 같은 정보를 포함한다.
      • Principal: 접근 주체의 아이디 혹은 User 객체를 저장
      • Credentials: 접근 주체의 비밀번호를 저장
      • Authorities: 인증된 접근 주체자의 권한 목록을 저장
      • Details: 인증에 대한 부가 정보를 저장
      • Authenticated: boolean 타입의 인증 여부를 저장

아래는 Spring Security 내부에 HTTP Request가 들어왔을 때 일어나는 과정이다.

  1. 사용자가 로그인 정보와 함께 인증 요청을 한다.(HTTP Request)
  2. AuthenticationFilter가 요청을 가로채고, 가로챈 정보를 통해 UsernamePasswordAuthenticationToken의 인증용 객체를 생성
  3. AuthentiactionManager의 구현체인 ProviderManager에게 생성한 UsernamePasswordToken 객체를 전달
  4. AuthenticationManager는 등록된 AuthenticationProvider을 조회하여 인증을 요구
  5. 실제 DB에서 사용자 인증 정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨준다.
  6. 넘겨 받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다.
  7. AuthenticationProvider은 UserDetails를 넘겨 받고 사용자 정보를 비교한다.
  8. 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환
  9. 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환된다.
  10. Authenticaton 객체를 SecurityContext에 저장한다.

최종적으로 SecurityContextHolder는 세션 영역에 있는 SecurityContext에 Authentication 객체를 저장한다.

Authentication(인증)

Spring Security의 Authentication관련 동작의 원리에 대해 살펴보자

AuthencitionFilter -> AuthenticationManager -> AuthenticationProvider로 인증 진행

업로드중..

그렇다면 각 객체들의 역할을 구체적으로 살펴보자

AuthenticationFilter

AuthenticationToken 생성 및 저장 주체
1. AuthenticationToken 생성: 인증(검증)을 위한 객체 생성, 아직 미인증
2. AuthenticationToken 저장
a. SecurityContextHolder: 지정된 보관 모드에 따라 SecurityContext 보관
b. SecurityContext: 인증된 Authentication객체를 보관하는 역할

AuthenticationFilter를 구현한 구현체들이 다양하게 존재하는데, 몇개만 보면 아래와 같다.

  • UsernamePasswordAuthenticationFilter
  • BasicAuthenticationFilter
  • AnonymousAuthenticationFilter 등등...

AuthenticationManager

AuthenticationToken 인증(검증) 방법 할당
구현체가 바로 ProviderManager!
이 Manager가 수많은 AuthenticationProvider중에서 적합한 AuthenticationProvider를 찾아 Token을 검증한다.

AuthenticationProvider

AuthenticationToken 인증(검증) 처리 주체

앞서 AuthenticationFilter에서 만든 미인증 AuthenticationToken을 인증

이를 구현하기 위한 방법은 아래와 같은 것들이 존재!

  • OAuth
  • SAML
  • Username&Password 검증을 위한 DAO 사용

결론적으로 Provider에 인증되지 않은 AuthenticationToken을 넣어주면 해당 Token의 인증 여부를 결정하여 AuthenticationToken 내에 authenticated 파라미터에 true/false 중 하나를 설정하여 넣어준다.

마무리하며🤔

Spring Security의 동작 과정을 세부적으로 살펴보았다.
원래 Spring Security Configuration이랑 CustomFilter도 같이 적어보려고 했는데 Spring Security의 Architecture가 공부하면 할 수록 알아볼 수록 내용이 너무 많고 딥하게 들어가면 끝도 없이 딥한거같아서 나눠 정리했다.

처음엔 너무 복잡해보여서 막막했는데 하나하나 보니 생각보다 단순했다. 최근에 OAuth를 잠깐 다뤘었는데 그 때랑 겹쳐서 보니까 그 당시 상황이 뭔가 좀 이해가 되는거같다. 다음에 OAuth 사용하게 되면 여기 다시 한번 와서 봐야겠다!😎

profile
백엔드 개발은 취미인 AI 개발자🥹

0개의 댓글