[Spring Security] 스프링 시큐리티의 구조와 인증 과정
스프링 시큐리티는 크게 네 가지 요소로 구성되어 있습니다. 인증 필터, 인증 관리자, 인증 공급자, 보안 컨텍스트가 그것들인데요. 스프링 시큐리티의 인증 프로세스를 각 구성요소의 역할과 함께 정리해보겠습니다.
인증 과정
- HTTP 요청이 들어오면 AuthenticationFilter가 가로챈다.
- AuthenticationFilter는 AuthenticationManager에게 인증을 위임한다.
- AuthenticationManager는 AuthenticationProvider를 이용하여 인증을 처리한다.
- AuthenticationProvider는 사용자 관리 책임을 구현하는 UserDetailsService와 암호 관리를 구현하는 PasswordEncoder를 인증 논리에 이용한다.
- 인증된 엔티티에 대한 세부 정보를 SecurityContext에 저장한다. 이 데이터는 유지되며 추후 요청 시 사용되어 인증과정 생략을 돕는다.
구성 요소
1. UserDetailsService
UserDetailsService는 그 이름대로 사용자의 세부 정보를 관리합니다.
이는 AuthenticationProvider의 호출을 받아 사용되는 것으로서 loadUserByUsername() 메서드를 통해 UserDetails 객체를 반환합니다. 반환하는 사용자 세부 정보는 구현하기에 따라 inMemory나 외부 DB 등의 저장소로부터 로드합니다.
2. PasswordEncoder
PasswordEncoder는 encode() 와 matches()라는 메서드를 가지며 암호로의 인코딩과 기존 암호와의 일치여부를 검증하는 역할을 합니다.
3. AuthenticationProvider
인증 공급자입니다. UserDetailsService와 PasswordEncoder로부터 사용자 정보를 확인했다면 이제 인증(Authentication)을 발급할 차례겠죠.
스프링 시큐리티에서 Authentication은 인증 프로세스에서의 필수 인터페이스로서, 인증 요청 이벤트를 나타냅니다. 애플리케이션에 접근을 요청한 사용자 엔티티의 세부 정보를 담고 있으며, getAuthorities() 메서드를 통해 인증된 사용자의 권한들을 반환하기도 합니다.
Authentication 인터페이스와 더불어 알아두어야 할 것이 Principal 인터페이스입니다. 이는 Authentication의 부모 인터페이스로서, 애플리케이션에 접근을 요청하는 사용자를 의미합니다.
4. AuthenticationManager
인증 과정을 총괄하는 주체입니다.
Authentication는 HTTP 필터 계층에서 요청을 수신하고 AuthenticationProvider에게 인증 책임을 위임합니다. 그리고 인증 결과에 따라 요청을 허용하거나 차단합니다.
5. SecurityContext
SecurityContext는 Authentication을 저장하고 관리합니다.
인증 필터가 인증 관리자를 통해 인증을 완료하면 SecurityContext에 세부 정보를 저장합니다. 그리고 추후 요청 시 인증 과정을 타기 전에 SecurityContext를 먼저 확인하여 인증 정보가 있는지 확인하고 정보가 있을 시 해당 정보를 활용합니다.