728x90

인증 처리 흐름

인증 방식은 여러 종류가 있지만 우선은 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 등의 방식으로 사용자의 인증 상태에 활용된다.

 

인증 처리 흐름 요약

  1. 사용자가 서버에 Credential과 함께 로그인 요청
  2. 인증되지 않은 Authentication  객체 생성
  3. AuthenticationManager가 Authentication  객체를 사용해 인증 작업 관리
  4. AuthenticationProvider가 UserDetailsService를 통해 데이터베이스에서 사용자 인증 정보 조회
  5. PasswordEncoder로 사용자 인증 정보와 Credential의 패스워드 일치 검증
  6. 일치한다면 인증된 Authentication  객체 생성
  7. 인증된 Authentication  객체를 UsernamePasswordAuthenticationFilter로 전달
  8. 인증된 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 같은 경우는 위의 코드처럼

메서드 체인 정보를 말한다.

+ Recent posts