Spring Security 인증 아키텍처
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는 강력한 인증 구조를 통해 애플리케이션 보안을 강화하고, 인증 프로세스를 체계적으로 관리합니다.