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: 데이터베이스 기반 사용자 인증
- 내부적으로 다음을 수행:
- UserDetailsService로부터 사용자 정보 조회
- PasswordEncoder를 통해 비밀번호 일치 여부 확인
- 인증 성공 시, 새로운 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 |