본문 바로가기

SpringSecurity

SpringSecurity(AuthenticationFlow)

반응형

 클라이언트가 로그인(폼인증)을 시도하면 UsernamePasswordAuthenticationFilter가 작동하게 된다. UsernamePasswordAuthenticationFilter이필터는 사용자의 요청을 받아서 아이디와 패스워드를 저장할수 있는 Authentication(인증객) 을 생하고 AuthenticationManager에게 인증처리를 맡긴다.

 

인증의 전반적인 관리하지만 실제로 인증역할을 하지 않고 AuthenticationProvider에 위임 하게된다. 이의미는 AuthenticationManager는 사용자가 입력한 아이디와 비밀번호 정보에 대해 검증을 하지 않는다는 말이다.AuthenticationManager는 내부적으로<List>가 있는데 한개이상의 AuthenticationProvider를<list>저장하고 현재 인증에 필요한 AuthenticationProvider를 호출하여 위임하게된다.

 

AuthenticationProvider는 동일하게  Authentication(인증객체)를 전달받아서 아이디, 패스워드 정보를 검증한다

검증할때 UserDetailService에서 유저객체를 전달받아서 검증을 하게된다.  만약 유저 객체가 존재한다면 유저객체를return 받고

없다면 UserNameNotFoundException이 호출되어 예외가 발생한다 그리고 그 예외는 UsernamePasswordAuthenticationFilter에서 받아서 FailHandler에서 후속처리를 하게된다.

 

검증에 실패하게 되고 만약 아이디에 맞는 유저가 존재한다면 다시 AuthenticationProvider return하게 되는데 이때 UserDetails타입으로 반환하게된다. 이후에 패스워드를 검증할때 반환받은 UserDetails타입의 객체 정보와 로그인할때 입력한 패스워드 값과 일치하는지 확인한다 그래서 패스워드가 일치 하지 않으면 badcredentialsexception이 발생하게되고 최종적으로 인증이 실패하게 된다.

 

아이디와 패스워드 둘다 인증에 성공하게되면 AuthenticationProvider 여기서 인증에 성공한 결과를 담는데 Authentication( 인증객체)를 새로 생성하고 User객체와 권한정보를 담는다 이후에 AuthenticationManager에게다시 반환하게 된다.

 

인증결과를 다은 Authentication(인증객체)는 다시 UsernamePasswordAuthenticationFilter에게 전달하고 SecurirtyContext에 저장한다.

 

 

UsernamePasswordAuthenticationFilter

AbstractUserDetailsAuthenticationProvider

DaoAuthenticationProvider

 

 

UsernamePasswordAuthenticationFilter.java

인증처리를 하는과정이다. Authentication(인증객체) 를 만들어서 유저네임과 패스워드를 저장하고 AuthenticationManaer 에게 전달한다

 

 

 

 

 

ProviderManager.java

ProviderManager는 AuthenticationMannager에 구현체이다 여기 보면 list타입으로 AuthenrticationProvider를 가지고 있다. 

privider를 보면 Anonymous인증객체와 Dao인증객체가 확인된다. Dao인증객체는 폼인증을 처리할수 있는 구현체이다

필자는 폼인증 처리 방식을 선택했고 DaoAuthentication이 호출되어 처리하게된다.

 

 

 

DaoAuthenticationProvider.java

DaoAuthenticationProvider에서 아이디값을 전달하고 UserDetailService 클래스를 통해서 실제 유저네임에 해당하는 계정을 요청하고 이다. UserDetail타입으로 유저객체를얻고 있다.만약 null이라면 UsernameNotFoundException을 호출하여 예외처리를 하게된다.

현재 필자는 아이디가 검증이 완료된 상태이다 자 그러면 패스워드 인증을 보자

 

 

 

 

 

 

 

 

DaoAuthenticationProvider.java

DaoAuthenticationProvider 로그인 할때 입력한 비밀번호를 얻고  UserDetail타입의 객체를 호출하여 유저객체에 저장된 비밀번호와 입력된 비밀번호를 비교하게 된다. 여기도 일치하지 않으면 badcredentialsexception을 호출하여 인증에 실패하게된다.

필자는 비밀번호 까지 인증을 받아서 인증받은결과,권한정보를 다시 인증객체에 저장한다 그러면 현재 인증객체는 최종적으로 인증이완료된 정보들을 가지고 있다. 이후에 다시 Provider가 AuthenticationMannager에게 전달한다 그리고 Mannager는 자신을 호출한  UsernamePasswordAuthenticationFilter에게 반환한다 

 

 

 

반응형