Backend/SpringBoot 이론 부분

Spring MVC 인증흐름과 주요 인터페이스들 (Form login기준)

Dean83 2025. 12. 15. 17:45

전반적인 인증 흐름을 정리해 보자면 다음과 같다. 

  • Filter (인증전 Authentication 객체 생성하여 전달)-> Authentication Manager 호출 
  • AuthenticationManager에서 처리 가능한 Provider 에게 인증 위임
  • Provider 에서 UserDetailsService 호출 및 PasswordEncoder 를 통해 인증 (둘 다 개발자 코드 구현필요)
  • AuthenticationManager 에서 결과 이벤트 발생 및 인증 결과를 Filter에 반환
  • Filter 에서 인증결과가 담긴 Authentication 객체를 SecurityContextHolder를 통해 저장
  • 인증이 성공했든, 하지 않았든 권한이 있는지 확인하고 권한이 있다면 수행
    • AuthorizationManager 구현체를 통해 진행


사용자 인증, Authentication Manager

인증을 담당하는 메니저 기능을 수행한다. 인증을 수행하는 Filter 로 부터 Authentication 객체를 넘겨받아 인증을 수행을 요청하고 결과를 리턴한다. 실제 인증은 여기서 이루어 지지는 않고, AuthenticationManager 구현체에 있는 AuthenticationProvider를 통해 진행된다.  AuthenticationManager는 인터페이스 이다.

  • authenticate(Authentication auth) 단일 추상 메소드를 갖고 있다.
    • Authentication 인터페이스의 구현체(예 : UsernamePasswordAuthenticationToken) 를 전달하여 인증 한다.
    • 인증전 Authentication 객체에는 ID, Password 만 있다.
    • 인증 성공시,  principal, authrities, isAuthenticated = true 로 설정된 Authentication 객체를 리턴한다. (비밀번호는 삭제됨)
    • 실패시, AuthenticationException 예외가 발생한다.

 

ProviderManager

  • AuthenticationManager 의 구현체로, 인증 자체는 AuthenticationProvider를 통해 인증을 수행하게 된다. 
  • 맴버변수로 List의 AuthenticationProvider를 갖고 있고, 알맞은 Provider를 찾아 인증을 실행하라고 하는 매니징 역할을 한다.
    • AuthenticationProvider 에는 supports 메소드를 갖고 있어, 이를 통해 ProviderManager는 인증을 실행할 provider를 확인하고 호출하게 된다.

      • DaoAuthenticationProvider
        • 가장 기본적인 AuthenticationProvider 구현체
        • 사용자 인증정보를 직접 DB에서 가져오지 않고, UserDetailsService와 PasswordEncoder 를 통해 인증정보를 가져와 인증한다.
        • UserDetailsService, PasswordEncoder는 개발자가 직접 구현하여 DB 에서 정보를 가져오고 검증하게 된다.
        • UserDetailsService를 통해 전달받은 UserDetails 객체를 PasswordEncoder를 통해 검증 한다.

  • ProviderManager가 인증 성공 혹은 실패시, 이벤트를 발생시킨다.
    • AuthenticationSuccessEvent
      • 인증에 성공한 Authentication 객체 포함

    • AuthenticationFailureEvent
      • 인증전 Authentication 객체 및 AuthenticationException 포함

 

인증에 사용되는 주요 객체들은 다음과 같다.

Authentication 인터페이스

인증정보 그 자체를 의미한다. 가장 핵심이다.

  • getPrincipal() : 인증된 사용자의 정보. (주로 아이디)
  • getCredentials() : 무엇으로 인증했는지? (주로 비밀번호). 인증 완료 후에는 null로 제거됨
  • getAutorities() : 권한 목록
    • GrantedAuthority 형 권한객체를 리턴하게 되는데, getAuthority() 를 통해 문자열로 권한을 표시한다.(ROLE_ 접두사가 붙는다)

  • isAuthenticated :  인증 상태인지, 인증 상태 전인지 나타내는 값
  • 구현체를 통해 인증이 이루어 지게 되며, 이루어 지면 password가 null이 되고 isAuthenticated 값이 true로 변경된다.

 

SecurityContext

Authentication 을 보관하고 조회하기 위한 객체이다. 스레드 별로 나누어 저장하기 위해 존재한다. 

  • setAuthentication(Authentication auth) : 인증정보 저장
  • getAuthentication() : 인증정보 리턴

 

SecurityContextHolder

SecurityContext를 실제로 보관하고, 어플리케이션 전역에서 접근 하여 인증정보를 가져올 수 있다. (static 메소드 제공)

Spring MVC 에서 사용한다. 

  • SecurityContextHolder.getContext() 를 통해 조회 한다.
  • 기본적으로 ThreadLocal 에 SecurityContextHolder 가 SecurityContext를 저장하고 있다.

    • ThreadLocal은 Java에서 제공하는 기능으로, 스레드마다 독립적으로 제공되는 공간이다.
    • 각 요청별로 같은 스레드 내에서 처리되므로 한 요청 내에 정보 조회가 가능하고, 완료시 자동으로 비워준다. (그렇지 않으면 threadpool 에 반환 후 재사용 될 때 접근이 가능해 진다)
    • 만일 Spring MVC가 아니라 WebFlux를 이용할 경우에는 요청 처리중 스레드가 계속 바뀌므로 이를 사용 할 수 없다. (Reactor Context 사용)

 

SecurityContextHolderFilter

  • 로그인 후 인증 할 때 동작하는 필터
  • SecurityContextHolderRepository 를 이용하여 저장된 인증 정보를 불러오고 이를 SecurityContextHolder 에 저장
  • 응답할 때 에는 SecurityContextHolder를 클리어 함.

 

권한 확인, AuthorizationManager

  • 권한 처리를 담당하는 인터페이스. 함수형 인터페이스로 1개의 메서드가 있음 (check 메서드)
  • check(Supplier<Authentication> authentication, T object)
    • athentication은 인증한 사용자 정보
    • object 는 검사 대상체
      • 웹 요청 혹은 메서드 수행 할 수 있는지 검사

 

RequestMatcherDelegatingAuthrizationManager

  • Http 요청 기반 권한을 처리하는 기본적인 AuthorizationManager 구현체로 가장 많이 사용됨
  • http.authorizeHttpRequests() 메소드 호출시 자동으로 생성됨
  • requestMacher 메소드에 매핑된 url 권한을 체크

 

AuthorityAuthorizationManager

  • 사용자의 권한을 기반으로 실제 실행가능여부를 체크하는 구현체
  • SecurityFilterChain 에 .hasRole, .hasAuthority 같은 규칙 정의시 내부적으로 이 구현체가 생성되어 매핑됨

 

AuthenticatedAuthorizationManager

  • 사용자의 인증상태 자체를 기반으로 실게 실행가능여부를 체크하는 구현체
  • SecurityFilterChain에 .isAuthenticated(), .isAnonymous(), .permitAll(), .authertificated(), .isFullyAuthenticated() 등 규칙 정의시 생성되어 매핑됨

 

GrantedAuthority

  • 권한을 나타내는 최상위 인터페이스로, 권한을 문자열 형태로 표현함.

 

'Backend > SpringBoot 이론 부분' 카테고리의 다른 글

Filter 및 SecurityFilterChain  (0) 2025.12.15
Spring boot의 요청 처리 흐름  (0) 2025.12.15
SpringBoot 에서 트랜잭션  (0) 2025.10.01
Entity 심화  (0) 2025.09.30
Proxy  (0) 2025.09.30