본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
안녕하세요 :)
오늘은 챌린지 11일차로, 불금이라 그런지 집중이 정말 안 되지만.. 좀 더 힘을 내볼게요!
오늘 배울 내용은,
Part A. 로그인, 로그아웃, 회원가입으로 배워보는 스프링 시큐리티 기초
Ch 3. UserDetails 와 사용자 관리
"02. UserDetailsService 와 UserDetailsManager" 입니다.

지난 시간에는 UserDetails 에 대해 집중적으로 파악을 했었다. 이번 시간에는 UserDetailsService 를 어떻게 활용할 수 있을지, UserDetailsManager 를 어떻게 활용할 수 있을지, 마지막으로 JdbcUserDetailsManager 구현체를 이용하여 간단한 샘플 코드를 작성할 수 있을지에 대해 알아보았다.
먼저 UserDetailsService 에 대한 이해가 필요하다. UserDetailsService 는 loadUserByUsername 이라는 하나의 메소드를 제공한다. 여기서의 username 이라는 것은 사용자 ID와 같은 개념으로 보면 된다. 따라서 고유하다고 (unique) 간주하며, 반환하는 사용자 정보는 UserDetails, 만약 사용자가 존재하지 않으면 UsernameNotFoundException 을 던진다.
UserDetailsService 구현에 대해 알아보면 InMemoryUserDetailsManager 를 활용해서 UserDetailsService 를 구현해야 하는데, 이를 위해 먼저 User 를 구현해야 한다.
User 클래스에서 username, password, authority 는 모두 final 로 설정하여 값을 변경할 수 없도록 지정한다. (이번 강의에서는 간단한 예제를 위해서 authority는 하나만 설정했다)
다음으로는 InMemory 기반 UserDetailsService 구현에 대해 알아보면 UserDetailsService를 구현하는 InMemoryUserDetailsService 를 생성해보려고 한다. 인메모리에서 사용자를 조회하기 위해 먼저 사용자 List 객체를 생성한다(List<UserDetails>). 그리고 loadUserByUsername 메소드에서 users를 순회하며 username으로 검색하여, 만약 존재하지 않는다면 UsernameNotFoundException을 던지도록 구현하면 된다.
마지막으로 UserDetailsService와 PasswordEncoder 빈 등록에 대해 알아보면 설정 클래스를 통해 UserDetailsService 와 PasswordEncoder를 빈으로 등록한다. 3명의 임시 유저를 등록하여 InMemoryUserDetailsService를 UserDetailsService 로 지정한 뒤, PasswordEncoder 로는 NoOpPasswordEncoder 활용하면 된다는 것을 알 수 있었다.