본문 바로가기
Java & Kotlin/Spring

Spring Security 인증 기본 구조

by devson 2021. 7. 18.

Spring Security의 인증에 사용되는 기본 구조와 component에 대해서 알아보도록 하자.

(Spring Security는 인증 및 보안과 관련하여 관련하여 많은 기능들을 담고 있으나 여기서는 인증 관련하여 기본 구조만 알아보도록 하겠다)

 

출처: https://www.javainuse.com/webseries/spring-security-jwt/chap3

 

AuthenticationFilter

인증(authentication) 요청을 Spring Security에서 처리할 수 있도록 Authentication 객체로 변환시킨 뒤 이를 AuthenticationManager로 처리를 위임한다.

 

AuthenticationManager에서 처리 후 Filter에서 성공/실패에 대한 응답을 핸들링을 한다.

 

AuthenticationManager

(implementation: ProviderManager)

AuthenticationFilter에서 받은 Authentication 객체를 처리할 수 있는 AuthenticationProvider를 찾아 인증 처리를 위임한다.

 

AuthenticationProvider

특정 인증(Authentication)(e.g. ID/PW 인증, OAuth2 인증 등)을 처리할 수 있는 객체이다.

인증 요청인 Authentication 를 받아 인증 결과인 Authentication을 리턴한다. (둘 다 동일한 Authentication interface)

 

ID/PW 방식을 처리하기 위해 사용할 수 있는 기본 Spring Security Authentication와 AuthenticationProvider는 다음과 같다.

ID/PW 방식의 경우 UserDetaile, UserDetailsServicePasswordEncoder가 필요하다.

(모든 인증에 있어 위 객체들이 필요한 것은 아니다)

 

UserDetails

username(ID), 암호화된 password를 포함한 인증하고자하는 유저의 인증 정보를 담는 interface이다.

 

UserDetailsService

UserDetails를 username(ID)로 조회하기 위해 사용(loadUserByUsername 메서드)되는 interface이다.

 

PasswordEncoder

UserDetailsService를 통해 조회한 UserDetails의 암호화된 password

인증 요청인 Authentication의 credential(raw password)의 일치 여부를 비교할 수 있는 객체이다.

 

SecurityContext

현재 Thread에 Security 정보(Authentication)를 담는 역할을 한다.

(SecurityContextHolder 를 통해 불러올 수 있다.)

 

Thread Pooling을 하는 경우 Thread를 재사용하기 때문에,

SecurityContext를 사용하고 해당 Thread를 Thread Pool에 반환 전에 SecurityContext를 비워줘야한다.

(using SecurityContextHolder.clearContext())

댓글