Spring Security란?
- Spring MVC 기반 애플리케이션의 인증(Authentication)과 인가(Authorization or 권한 부여) 기능을 지원하는 보안 프레임워크
- Spring MVC 기반 애플리케이션에 보안을 적용하기위한 사실상의 표준
기본 구조
Spring Security Configuration
- @Configuration 애너테이션 추가
- HttpSecurity 를 파라미터로 가지고, SecurityFilterChain 을 리턴하는 Bean을 생성하여 보안 설정
- PasswordEncoder는 다양한 암호화 방식을 제공하며, Spring Security에서 지원하는 PasswordEncoder의 디폴트 암호화 알고리즘은 bcrypt이다.
- Spring Security에서 SimpleGrantedAuthority 를 사용해 Role 베이스 형태의 권한을 지정할 때 ‘Role_’ + 권한명 형태로 지정해 주어야 한다.
UserDetails
: UserDetailsService에 의해 로드(load)되는 핵심 User 정보를 표현하는 인터페이스
Srping Security의 웹 요청 처리
DelegatingFilterProxy
- 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 한다.
- Spring Security의 Filter Chain
- Spring Security에서 보안을 위한 작업을 처리하는 필터의 모음이며, Spring Security의 Filter를 사용하기 위한 진입점이
FilterChainProxy
이다.
Spring Security 인증 처리
AuthenticationManager
- 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스이며, 인증을 위한 실질적인 관리는 AuthenticationManager를 구현하는 구현 클래스를 통해 이루어짐
AuthenticationProvider
- AuthenticationManager로부터 인증 처리를 위임 받아 실질적인 인증 수행을 담당하는 컴포넌트
UserDetails
- 사용자의 자격을 증명해주는
크리덴셜(Credential)
즉, 데이터베이스 등의 저장소에 저장된 사용자의 Username과 Password 그리고 사용자의 권한 정보를 포함하는 컴포넌트
UserDetailsService
- UserDetails를 로드(load)하는 핵심 인터페이스
UserDetailsService
는 데이터베이스 등의 저장소에서 사용자의 크리덴셜(Credential)을 조회하여 AuthenticationProvider
에게 제공한다.
UsernamePasswordAuthenticationFilter
가 생성하는 Authentication은 인증을 위해 필요한 사용자의 로그인 정보를 가지고 있지만, AuthenticationProvider
가 생성한 Authentication은 인증에 성공한 사용자의 정보(Principal, Credential, GrantedAuthorities)를 가지고 있다.
- 인증된 Authentication을 전달 받은 UsernamePasswordAuthenticationFilter는
SecurityContextHolder
를 이용해 SecurityContext
에 인증된 Authentication을 저장한다. SecurityContext
는 다시 HttpSession 에 저장되어 사용자의 인증 상태를 유지한다.
Spring Security 권한 부여 구성요소
AuthorizationFilter
- URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter
AuthorizationManager
- 권한 부여 처리를 총괄하는 매니저 역할을 하는 인터페이스
RequestMatcherDelegatingAuthorizationManager
- AuthorizationManager의 구현 클래스 중 하나이며, RequestMatcher 평가식을 기반으로 해당 평가식에 매치되는
AuthorizationManager
에게 권한 부여 처리를 위임하는 역할을 한다. (직접 권한 부여 처리를 수행하지 않고 RequestMatcher
를 통해 매치되는 AuthorizationManager 구현 클래스에게 권한 부여 처리를 위임)
RequestMatcher
- SecurityConfiguration에서
.antMatchers("/orders/**").hasRole("ADMIN")
와 같은 메서드 체인 정보를 기반으로 생성된다.