Spring Security
는 Spring
프레임워크에 대하여 인증, 권한 부여 등의 기능을 제공한다.
Spring
내에서 Filter
를 기반으로 동작한다. 즉, Http Request
가 Dispatcher Servlet
에 도착하기 이전, Spring Security
가 제공하는 기능을 활용하여, 인증 혹은 인가에 대한 사전 검증을 진행한다.
Spring Security
에서 사용자의 정보를 기반으로, 인증, 인가 기능을 제공하는 인터페이스이다. 현재 서비스에서 사용하고 있는 User
클래스에 implements
하여, 기존 클래스에 인증, 인가 관련 기능을 부여한다.
해당 클래스 인스턴스를 기반으로, Spring
서버 내에서 인증, 인가 작업을 수행하는 것이다.
실무에 사용하는 경우, 서비스에 따라 추가적인 사항이 더 필요한 경우가 많아, UserDetail
인터페이스를 상속받는 커스텀 UserDetail
클래스를 만들어 사용하는 것이 관례이다.
Spring Security
의 인증과정 중 실제 사용자 정보를 조회하기 위한 서비스 단으로, UserDetails
인스턴스를 생성하는loadUserByUsername()
메서드를 가지고 있다.
claim
정보를 기반으로, 사용자를 조회하여, 조회된 정보를 기반으로 UserDetails
인스턴스를 생성한다.Authentication
은 현재 접근하려는 사용자의 정보와 권한을 담는 인터페이스이다.
인증에 대한 Provider
클래스를 생성 시에 사용되는 인터페이스로, 이를 implements
하는 경우 authenticate()
와 supports()
메서드를 오버라이드 한다.
Authentication
객체를 반환하도록 설정되어 있다.Provider
클래스가 특정 타입의 Authentication
객체를 지원하는 여부를 알려주는 메서드이다. 만약 Provider
가 여러개인 경우, AuthenticationManager
내의 등록된 Provider
가운데, 주어진 Authentication
객체를 지원하는 지를 확인하는 용도로 사용할 수 있다.AuthenticationProvider
구현체를 관리하는 클래스이다. AuthenticationManager
해당 구현체를 등록하는 것으로 추후, 상황에 따라 필요한 AuthenticationProvider
클래스를 AuthenticationManager
를 통해 불러오는 것이 가능하다.
Authentication
정보를 서버 내에서 보관하는 역할을 한다. 향후 인증이 필요한 요청에 대해 @AuthenticationPrincipal
어노테이션을 부여하는 것으로, SecurityContext
내의 Authentication
내의 사용자 정보를 가져오는 것이 가능하다.
SpringSecurity
는 Username
과 Password
를 기반으로 인증 및 권한 부여 정보를 설정하는 방식을 채택했다. 이 때 사용자에 대한 권한 부여 정보를 가진 클래스가 바로 Authentincation
이다.
UserDetails
클래스를 기반으로, Authentication
객체를 반환하는 클래스가 UsernamePasswordAuthenticationToken
이다.
현재 사용자가 가지고 있는 권한을 의미하며, ROLE_XX
등의 형태로 사용된다. 특정 자원에 대한 접근 시, 권한 여부를 확인하는데 사용되는 객체이다.
AuthenticationFilter
가 해당 요청에 대하여 UsernamePasswordToken
객체를 생성한다.AuthenticationManager
에, 해당 UsernamePassowordToken
객체를 전달한다.AuthetincationManager
는 전달된 UsernamePassowordToken
객체의 인증을 지원하는 AuthenticationProvider
를 찾아, 인증을 요구한다.AutheticationProvider
는 authenticate()
메서드를 호출하여, 인증 로직이 수행되도록 한다. 인증 로직의 경우 서비스마다 차이는 있겠으나, 공통적인 수행 방식은 다음과 같다.UserDetailsService
에서 해당 token
값의 claims
정보를 기반으로 해당하는 사용자를 찾는다.UserDetails
객체를 생성하여 반환한다.UserDetails
객체를 기반으로, 사용자 정보 및 권한 정보가 담긴 Authentication
객체를 생성한다.Authentication
객체를 SecurityContext
에 저장한다. 향후 Controller
에서 사용자 정보나 권한 정보가 필요한 경우, @AuthenticationPrincipal
등을 사용하여, 필요한 객체 정보를 불러올 수 있다.참고
Spring Security (3) - AuthenticationManager, AuthenticationProvider 동작 흐름 분석
[스프링 시큐리티] @AuthenticationPrincipal 로그인 정보 받아오기
🔒 Spring Security 구조, 흐름 그리고 역할 알아보기 🌱
Spring Security의 구조(Architecture) 및 처리 과정 알아보기