[Spring Security] 아키텍처 이해 - 인증 처리자(AuthenticationProvider)

식빵·2022년 9월 8일
0

이 시리즈에 나오는 모든 내용은 인프런 인터넷 강의 - 스프링 시큐리티 - Spring Boot 기반으로 개발하는 Spring Security - 에서 기반된 것입니다. 그리고 여기서 인용되는 PPT 이미지 또한 모두 해당 강의에서 가져왔음을 알립니다.



AuthenticationProvider 는 실제 인증 작업을 실행하는 첫 시작점이다.
AuthenticationProvider 는 인터페이스이며, 이것을 우리 입맛에 맞게 구현하고,
Spring Security 에 적용하는 것이 가능하다.

위 그림은 AuthenticationProvider 의 메소드와 동작방식이다.
AuthenticationProvider 는 요청이 오면 먼저 support 메소드를 통해서
AuthenticationManager 로부터 전달받은 인증객체를 지원하는지(support)를 체크한다.

support 메소드의 결과가 true 이면 authentication(authentication) 메소드가 실행된다.

  • ID 검증: UserDetailsService 를 통해서 ID 와 매칭되는 사용자 정보를 조회한다.
    • 만약 못 찾으면 UserNotFoundException
  • PW 검증: 조회된 사용자 정보의 PW 정보 <--> 요청으로 온 PW 값을 비교한다.
    • 비밀번호가 일치하지 않으면 BadCredentialException
  • ID, PW 모두 성공 시
    • 사용자 정보와 권한 정보를 담은 인증객체를 생성 및 반환



간단하게 코드로 보면 아래와 같다.
AuthenticationProvider 구현체 중에서 Form 로그인과 관련된 인증객체를
처리하는 DaoAuthenticationProvider 및 해당 클래스의 추상 클래스인
AbstractUserDetailsAuthenticationProvider를 중점으로 보겠다.


support 메소드의 내용이다.
UsernamePasswordAuthenticationToken 을 지원하는 것을 알 수 있다.


보면 알겠지만 retrieveUser 라는 메소드를 통해서 사용자 정보를 조회한다.


retrieveUser 메소드의 내용은 위와 같다.
UserDetailsService 라는 객체에게 사용자 정보를 찾아달라고 요청하는 것을
확인할 수 있다. 메소드 명은 loadUserByUsername 인다.


loadUserByUsername 메소드의 내용은 위와 같다.
사용자를 찾지 못하면 예외가 터진다.
반대로 찾게되면 UserDetails 라는 인터페이스를 구현한
User 클래스 인스턴스를 생성하고 반환한다.


최종적으로 Password 검증을 받게된다.


다 성공하면 최종적으로 인증객체를 생성한다.
이 인증객체는 AuthenticationManager 에게 반환될 것이고,
UsernamePasswordAuthenticaitonFilter 에게 연달아서 반환될 것이다.

그리고 해당 필터에서 인증객체를 SecurityConext 에 저장하고,
세션에 저장하는 등의 작업을 하게 될 것이다.

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글