Spring Security 인증 아키텍처
이 글에서는 Spring Security의 인증 아키텍처를 다룰 것입니다. 아래 이미지는 Spring Security가 HTTP 요청을 인증하는 전체 과정을 보여줍니다. 각 컴포넌트가 어떤 역할을 수행하며 어떻게 상호작용하는지 단계별로 설명합니다.
인증 프로세스의 주요 구성 요소
1. Http Request (사용자 요청)
• 사용자가 애플리케이션에 접근할 때 보낸 HTTP 요청입니다. 이 요청은 사용자 자격 증명(주로 사용자 이름과 비밀번호)을 포함할 수 있습니다.
2. AuthenticationFilter
• AuthenticationFilter는 Spring Security의 필터 체인 중 하나로, HTTP 요청을 가로채고 자격 증명을 추출하여 인증을 시작합니다.
• 이 필터는 사용자 자격 증명을 기반으로 UsernamePasswordAuthenticationToken 객체를 생성합니다.
• 생성된 Authentication 객체는 이후 인증 과정을 위해 AuthenticationManager에 전달됩니다.
3. UsernamePasswordAuthenticationToken
• AuthenticationFilter에서 생성된 객체로, 사용자 자격 증명(이름과 비밀번호)을 래핑합니다.
• Authentication 인터페이스를 구현하여 Spring Security에서 인증 상태를 나타내는 역할을 합니다.
• 이 객체는 AuthenticationManager로 전달되어, 실제 인증 프로세스가 진행됩니다.
4. AuthenticationManager
• Spring Security의 핵심 인터페이스로, 실제 인증을 처리하는 역할을 합니다.
• AuthenticationManager는 여러 **AuthenticationProvider**를 관리하며, 각각의 AuthenticationProvider는 특정한 방식으로 인증을 수행할 수 있습니다.
• 요청된 자격 증명이 적절한 AuthenticationProvider로 전달되어 인증이 시도됩니다.
5. AuthenticationProvider
• AuthenticationProvider는 인증을 위한 논리를 구현하는 역할을 합니다.
• 다양한 인증 방법을 지원하기 위해 여러 종류의 AuthenticationProvider가 존재합니다. 예를 들어, **DaoAuthenticationProvider**는 데이터베이스 기반의 인증을 수행합니다.
• 각 AuthenticationProvider는 UserDetailsService를 통해 사용자 정보를 조회하고, 자격 증명이 유효한지 검증합니다.
6. UserDetailsService
• UserDetailsService는 사용자 정보를 조회하는 인터페이스입니다.
• 주로 데이터베이스에서 사용자의 세부 정보를 가져오기 위해 사용되며, 요청된 사용자 이름에 맞는 UserDetails 객체를 반환합니다.
• UserDetailsService는 인증의 주요 부분으로, 사용자 정보를 Spring Security에서 인식할 수 있는 형태로 제공합니다.
7. UserDetails
• UserDetails는 사용자 정보를 담고 있는 인터페이스로, 사용자의 이름, 비밀번호, 권한 등 인증에 필요한 정보를 포함합니다.
• UserDetails 인터페이스는 User와 같은 클래스로 구현될 수 있으며, Spring Security가 인증 과정에서 요구하는 사용자 정보를 제공합니다.
8. 인증 성공 시의 흐름
• AuthenticationProvider가 UserDetailsService에서 반환된 정보를 이용해 인증을 성공하면, Authentication 객체가 반환됩니다.
• 이 Authentication 객체는 사용자 자격 증명이 성공적으로 검증되었음을 나타냅니다.
9. AuthenticationManager에서 인증 결과 반환
• 인증이 성공한 Authentication 객체는 다시 AuthenticationManager를 통해 AuthenticationFilter로 반환됩니다.
• 이때 Authentication 객체는 사용자의 자격 증명이 성공했음을 나타내는 상태를 가지며, 인증된 사용자 정보가 포함되어 있습니다.
10. SecurityContextHolder에 인증 정보 저장
• 마지막으로, 인증이 완료된 Authentication 객체는 **SecurityContextHolder**에 저장됩니다.
• SecurityContextHolder는 애플리케이션의 다른 부분에서 인증된 사용자 정보를 쉽게 접근할 수 있도록 합니다.
• SecurityContext는 현재 사용자의 인증 상태를 저장하는 곳이며, SecurityContextHolder를 통해 전역적으로 인증 정보를 관리합니다.
전체 요약
Spring Security의 인증 과정은 다음과 같은 단계로 요약됩니다:
1. 사용자가 애플리케이션에 요청을 보내면, **AuthenticationFilter**가 요청을 가로채고 자격 증명을 추출합니다.
2. 자격 증명은 UsernamePasswordAuthenticationToken 객체로 래핑되고, **AuthenticationManager**로 전달됩니다.
3. AuthenticationManager는 여러 **AuthenticationProvider**를 통해 실제 인증을 수행합니다.
4. **UserDetailsService**가 데이터베이스에서 사용자 정보를 가져와, UserDetails 객체로 반환합니다.
5. 자격 증명이 성공하면 Authentication 객체가 반환되고, **SecurityContextHolder**에 저장됩니다.
이 과정을 통해 Spring Security는 중앙 집중식으로 사용자 인증을 처리하며, 애플리케이션 전체에서 인증된 사용자 정보를 일관되게 유지할 수 있습니다. 인증이 성공한 이후에는 SecurityContextHolder에 저장된 인증 정보를 바탕으로 권한을 검증하고, 애플리케이션의 접근 제어를 수행합니다.
이와 같이 Spring Security는 강력한 인증 구조를 통해 애플리케이션 보안을 강화하고, 인증 프로세스를 체계적으로 관리합니다.
'Spring Security' 카테고리의 다른 글
SameSite (0) | 2024.10.31 |
---|---|
CORS(Cross-Origin Resource Sharing)의 Simple Request와 Non-Simple Request (0) | 2024.10.31 |
FilterOrderRegistration 클래스 구조와 역할 (0) | 2024.10.31 |
requestMatcher (0) | 2024.10.30 |
hasAuthority와 그 외의 다양한 표현식 (0) | 2024.10.30 |