Spring-Security

Spring Security 인증 흐름도 (Authentication Flow)

neal89 2025. 5. 23. 22:57

1. 🧑 사용자 (User)

  • 웹 애플리케이션에 보호된 리소스(예: /admin, /mypage)에 접근을 시도합니다.

2. 🧱 DelegatingFilterProxy

  • **서블릿 컨테이너(Web.xml 등)**에 등록된 Spring Security 필터의 진입점입니다.
  • Spring이 관리하는 실제 보안 필터 빈인 FilterChainProxy로 요청 처리를 위임(delegate) 합니다.
  • 목적: 서블릿 필터와 Spring 빈을 연결.

3. 🔗 FilterChainProxy (또는 SecurityFilterChain)

  • Spring Security의 중앙 허브로, 다수의 SecurityFilterChain을 관리합니다.
  • 요청 URL에 맞는 적절한 SecurityFilterChain을 선택하여 내부의 여러 보안 필터들을 순차적으로 실행합니다.
  • 포함되는 필터들(대표 예시):
    • UsernamePasswordAuthenticationFilter (폼 로그인)
    • BasicAuthenticationFilter (HTTP Basic 인증)
    • RequestCacheAwareFilter
    • SecurityContextPersistenceFilter 등

4. 🔒 인증 필터 (AuthenticationFilter 계열)

  • 인증을 담당하는 여러 필터 중 하나가 현재 요청을 처리합니다.
  • 대표적으로 UsernamePasswordAuthenticationFilter는 로그인 요청(/login)에서 ID/PW를 추출합니다.
  • 이 필터는:
    • 사용자의 인증 정보를 Authentication 객체로 생성
    • 아직 인증되지 않은 상태 (isAuthenticated() == false)
    • 이 객체를 AuthenticationManager로 전달하여 실제 인증 수행

5. 🧠 Authentication 객체

  • 사용자 인증 요청의 정보(ID, PW 등)를 담고 있는 객체
  • 인증 전: Principal, Credentials, Authorities가 비어있거나 isAuthenticated = false
  • 인증 후: 사용자 정보가 채워지고 isAuthenticated = true가 됩니다.

6. ⚙️ AuthenticationManager

  • 인증 필터로부터 Authentication 객체를 받아 실제 인증 작업을 시작합니다.
  • 내부적으로 여러 AuthenticationProvider를 관리하며, 적절한 Provider에게 인증 위임.

7. 🔌 AuthenticationProvider

  • AuthenticationManager로부터 받은 인증 요청을 실제 인증 로직으로 처리하는 컴포넌트
  • 일반적으로 사용하는 구현체:
    • DaoAuthenticationProvider: 데이터베이스 기반 사용자 인증
  • 내부적으로 다음을 수행:
    1. UserDetailsService로부터 사용자 정보 조회
    2. PasswordEncoder를 통해 비밀번호 일치 여부 확인
    3. 인증 성공 시, 새로운 Authentication 객체 반환 (isAuthenticated = true)

8. 📦 UserDetailsService

  • 사용자 이름(username)을 기반으로 사용자 정보 조회하는 인터페이스
  • 보통 구현체에서 DB, LDAP 등에서 사용자 정보를 조회합니다.
  • 반환 객체는 UserDetails

9. 🧾 UserDetails

  • 사용자 이름, 비밀번호, 계정 상태, 권한 목록 등을 포함
  • 인증/인가에 필요한 핵심 정보가 이 안에 들어 있습니다.

10. 🔐 PasswordEncoder

  • 사용자가 제출한 비밀번호를 해싱하여 DB의 해시된 비밀번호와 비교
  • BCryptPasswordEncoder, PBKDF2PasswordEncoder 등 다양한 구현체 존재

11. 📦 SecurityContextHolder

  • 인증이 완료되면, 최종적으로 생성된 Authentication 객체가 여기에 저장됩니다.
  • ThreadLocal 기반 저장소로 현재 스레드에서 어디서든 인증 정보에 접근 가능하게 함
  • 예: SecurityContextHolder.getContext().getAuthentication() 호출

🔁 인증 이후 처리 흐름

✅ 인증 성공 시:

  • 최종 Authentication 객체가 SecurityContextHolder에 저장됨
  • SavedRequest가 있다면 RequestCacheAwareFilter가 이를 감지하고, 원래 요청한 URL로 리다이렉트 수행

❌ 인증 실패 시:

  • 인증 실패 핸들러(AuthenticationFailureHandler)가 호출되어 로그인 페이지나 에러 페이지로 리다이렉트

✅ 추가로 알아두면 좋은 내용

🧠 ExceptionTranslationFilter

  • 인증 또는 권한 오류가 발생할 경우:
    • 익명 사용자면 로그인 페이지로 리다이렉트 (SavedRequest 저장)
    • 인증은 됐지만 권한이 없는 경우 권한 에러 페이지로 이동

🗂️ 전체 요약 (한 문장으로)

Spring Security는 DelegatingFilterProxy → FilterChainProxy → 다양한 필터(AuthenticationFilter 포함)를 거치며, 사용자의 인증 요청을 AuthenticationManager → AuthenticationProvider → UserDetailsService, PasswordEncoder를 통해 처리한 뒤, 최종적으로 인증 정보를 SecurityContextHolder에 저장하여 세션 전반에 걸쳐 사용자의 보안 상태를 유지합니다.

'Spring-Security' 카테고리의 다른 글

SecurityContext & SecurityContextHolder  (0) 2025.05.23
Authentication  (0) 2025.05.23
RequestCache, SavedRequest, RequestCacheAwareFilter  (0) 2025.05.23
logout()  (0) 2025.05.23
anonymous()  (0) 2025.05.23