본문 바로가기

SpringSecurity

SpringSecurity(AuthenticationProvider)

반응형

https://www.inflearn.com/course/%EC%BD%94%EC%96%B4-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

AuthenticationProvider(인증처리자 / 인터페이스) 이클래스는 인증과정에서 가장 핵심적인 클래스가 생각하면된다 . 사용자의 이름과 패스워드를 받아서 검증을 하는 클래스이다. AuthenticationManager가 요청정보를 받아서 해당하는 Provider를 호출한 후에 요청에 대한 인증처리를 하게된다. 인증이 성공게되면 인증결과를 생성해서 자신을 호출한 Manager에게 인증객체르 전달하는 역할 까지 AuthenticationProvider가 하게된다. 

 

authenticate , supports 두개의 메서드가 존재한다 authenticate 여기서 실질적으로 검증을 하게되고 AuthenticationManager와 동일하게 인증객체를 전달받는다.  인증객체 안에는 사용자가 입력한 아이디와 패스워드가 저장되어 있다. 이정보를 가지고 서버에 저장된 해당사용자의 계정과 일치하는지 검증을 하게된다 . 

 

ID검증은 UserDetailsService(인터페이스) 에서 검증을 하게되고 여기서 실질적으로 인증을 시도하고 있는 사용자의 정보를 조회하고 있으면 사용자의 유저객체를 생성하여 UserDetails 타입으로 변환을 해서 AuthenticationProvider에게 전달한다. 즉 현재 사용자의 정보가 일치하는지 아니면 일치하지 않는지를 UserDetailsService에서 조회한다.

 

password검증은 반환 받은 UserDetails타입의 객체 안에 있는 password와 사용자가 입력한 password정보와 일치한지 확인한다.

처음 유저가 회원가입을 하고 패스워드를 저장할때 Passwordencoder클래스를 통해서 암호화 하여 저장하는데 유저가 다시 로그인할때 비밀번호 비교를 이클래스를 이용해서 비교 한다.  

 

최종적으로 인증에 성공하게되면 유저정보와 권한정보를 저장할수 있는 새로운 Authentication을 생성해서 AuthenticationManager에게 전달한다. 

 

 

supports는 폼인증,리멤버미와 같은 인증을 처리할수 있는 기준이 되는지 여기서 검사하게된다.

 

 

 

 

 

AuthenticationProvider.java

이클래스는 인터페이스라고 말했다 실제로 보면 두개의 메서드를 확인할수 있다. 

authenticate 메서드는 전달받은 Authentication타입의 인증객체를 전달받아서 인증처리 하는메서드이고 

supports 메서드는 현재 인증처리를 할수 있는Provider , 즉 요청한 인증이 form인증,RememberMe,httpBasic 이3가지 기준에 조건이 충족되는지 확인한다.

 

ProviderManager.java

현재 필자는 form인증이기 때문에  form인증 조건에 맞는 Provider를 호출할것이다. 

 

 

AbstractUserDetailsAuthenticationProvider.java

 

인증받은 인증객체를 전달받는다 확인해보면 Authentication타입의 authentication(인증객체) 객체를 확인할수 있다. 옆에 살짝 보면 UsernamePasswordAuthenticationToken으로 확인이 가능하다.

 

 

 

 

AbstractUserDetailsAuthenticationProvider.java , DaoAuthenticationProvider.java

retrieveUser 를 보면 유저 객체를 검색하게된다. 검색하는 구문을 확인해보면 위에서 말한 userDetails 가 현재 사용자가 입력한 아이디와  서버에 저장된 사용자의 아이디를 비교하게된다. 조금더 들어가보면 loadUserByUsername메소드가 전달받은 유저네임을 조회 하는걸 확인할수 있다.

 

 

 

InMemoryUserDetailsManager.java

 

이클래스에서 확인해보면 현재 인증에 성공하여 user객체가 생성된걸 확인할수 있다. 만약 널이면 사용자가 존재하지 않는다는 예외를 발생시켜서 form 인증 필터가 받아서 예외처리를 한다. 즉,인증실패가 된다. 지금은 성공했기 때문에 AuthenticationProvider에게 전달하게된다. 

 

 

 

user.java , UserDetails.java

중요한건 전달할때 UserDetails 타입으로 전달하게된다 이클래스는 UserDetails(인터페이스) 구현한 구현체이다. 인터페이스르 들어가보면

Password, UserName 등 여러가지 관련된 항목들을 확인할수 있다.

 

 

DaoAuthenticationProvider.java
DaoAuthenticationProvider.java

현재 입력한 아이디가 검증되었고 이제 패스워드를 검증해야한다 !  아까 위에서 말했던 내용을 기억하는가 PasswordEncoder를 통해서 암호화 하고 저장한다고 했다 userDetails 타입의 객체를 전달받고 사용자가 입력한 비밀번호와 userDetails에 저장되어 있는 패스워드와 매칭을 시킨다. 매칭이 안된다면 예외를 발생시켜서 폼인증필터가 처리하게된다.

 

 

 

AbstractUserDetailsAuthenticationProvider.java

 

현재 필자는 아이디와 비밀번호 인증에 성공했기 때문에 유저의정보,권한정보를 담을 Authentication(인증객체)를 새로 생성한다

보면 Token객체를 만들어서 최종성공한 유저 객체(principal),Credentials(패스워드) , Authorities(권한정보)를 담고 자신을 호출한 AuthenticationManager에게 전달한다.

 

 

AbstractAuthenticationProcessingFilter.java

 

최종적으로 인증에 성공한 인증객체를 참조하여 SecurirtyContext에 저장하고 successHandler를 호출하여 인증처리를 하게 된다.

 

 

반응형