인증 처리 흐름
인증 방식은 여러 종류가 있지만 우선은 UsernamePasswordAuthenticationFilter에 대해 살펴보겠다.
1. 사용자의 로그인 요청
사용자가 로그인을 위해
Credential(로그인 정보)를 서버에 전달한다.
2. Authentication 객체 생성 및 전달
UsernamePasswordAuthenticationToken authRequest =
UsernamePasswordAuthenticationToken.unauthenticated(username, password);
UsernamePasswordAuthenticationFilter는 사용자 요청을 전달 받아
Authentication 인터페이스의 구현체인 AuthenticationToken을 생성하여
해당 객체를 AuthenticationManager에 전달한다.
현재까지의 Authentication은 인증이 된 상태가 아니다.
3. AuthenticationManager
AuthenticationManager는 말그래도 인증 관리자 역할을 하는 인터페이스고
이를 구현한 ProviderManager를 통해 전달 받은 Authentication을 사용해
사용자 인증 작업을 관리한다.
실제로 인증을 처리하는 역할이 아니라 단계별로 적절한 컴포넌트를 사용해
인증 처리 작업을 시키는 역할이다.
4. AuthenticationProvider
AuthenticationProvider는 AuthenticationManager로부터
Authentication을 전달 받아 UserDetailsService를 사용해 UserDetails를 조회한다.
UserDetails는 데이터베이스에서 조회한 사용자 인증에 사용할 정보와
사용자의 권한 정보를 포함하고 있는 컴포넌트다.
5. 인증된 Authentication 객체 생성 및 전달
AuthenticationProvider는 PasswordEncoder를 이용해
UserDetails와 Authentication의 패스워드를 검증하여
검증에 성공하면 인증된 Authentication 객체를 생성하고
실패한다면 예외를 발생시킨다.
검증에 성공하여 생성된 Authentication 객체를 AuthenticationManager에 전달하고
AuthenticationManager 이를 다시 UsernamePasswordAuthenticationFilter에 전달한다.
6. 인증된 Authentication 객체 저장
UsernamePasswordAuthenticationFilter는 전달 받은 인증된 Authentication 객체를
SecurityContextHolder를 사용해 SecurityContext에 저장한다.
SecurityContext는 이후에 세션 정책에 따라서
HttpSession 혹은 JWT 등의 방식으로 사용자의 인증 상태에 활용된다.
인증 처리 흐름 요약
- 사용자가 서버에 Credential과 함께 로그인 요청
- 인증되지 않은 Authentication 객체 생성
- AuthenticationManager가 Authentication 객체를 사용해 인증 작업 관리
- AuthenticationProvider가 UserDetailsService를 통해 데이터베이스에서 사용자 인증 정보 조회
- PasswordEncoder로 사용자 인증 정보와 Credential의 패스워드 일치 검증
- 일치한다면 인증된 Authentication 객체 생성
- 인증된 Authentication 객체를 UsernamePasswordAuthenticationFilter로 전달
- 인증된 Authentication 객체를 SecurityContextHolder를 사용해 SecurityContext에 저장
권한 부여(인가) 처리 흐름
1. AuthorizationFilter
AuthorizationFilter는 SecurityContextHolder에서 Authentication을 가져온 후에
Authentication과 HttpServletRequest를 AuthorizationManager에게 전달한다.
2. RequestMatcherDelegatingAuthorizationManager
AuthorizationManager 인터페이스의 구현체 중 RequestMatcherDelegatingAuthorizationManager가
RequestMatcher 평가식에 매치되는 AuthorizationManager에게 인가 처리를 위임
3. AuthorizationManager
RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스가 인가 처리를 수행
적절한 권한이라면 사용자의 요청을 계속 처리하고 적절하지 않다면 AccessDeniedException 발생
권한 부여 컴포넌트
AuthorizationFilter
권한 부여 필터
URL을 통해 사용자의 액세스를 제한
스프링 시큐리티 5.5 버전 이후부터 FilterSecurityInterceptor를 대체함
AuthorizationManager를 주입 받아 적절한 권한 부여 여부를 체크하는데
이때 권한 체크 로직은 URL 기반으로 권한 부여 처리를 하기 위해
RequestMatcherDelegatingAuthorizationManager 구현 클래스를 사용한다.
AuthorizationManager
권한 부여 처리를 총괄하는 역할을 담당하는 인터페이스
권한 부여 여부를 체크하는 check 메서드만 정의되어 있음
RequestMatcherDelegatingAuthorizationManager
AuthorizationManager의 구현 클래스 중 하나
직접 권한 부여 처리를 수행하지 않음
RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에 처리를 위임
.antMatchers("/orders/**").hasRole("ADMIN")
RequestMatcher 같은 경우는 위의 코드처럼
메서드 체인 정보를 말한다.
'Back-End > Security' 카테고리의 다른 글
토큰 기반 자격 증명 (0) | 2023.07.11 |
---|---|
[스프링 시큐리티] 접근 제어 표현식 (0) | 2023.07.11 |
[스프링 시큐리티] DelegatingPasswordEncoder (0) | 2023.07.11 |
[스프링 시큐리티] 요청 처리 흐름 (0) | 2023.07.11 |
[스프링 시큐리티] 커스텀 로그인 인증 구현 (0) | 2023.07.11 |