이번 포스트에서는 UserDetailsService와 UserDetailsManager의 차이에 대해 정리해보았다.

Spring Security에서 지원하는 기본적인 인증 과정은 위 다이어그램처럼 진행되는데, UserDetailsService와 UserDetailsManager가 왜 따로 존재하고 각각 어떤 기능을 제공하는지 알아보았다.
상속 구조
인증 과정은 UserDetailsService, UserDetailsManager, InMemoryUserDetailsManager 등이 관여한다.
UserDetailsService는 최상위 인터페이스로, loadUserByUsername()이라는 메서드를 가진다.
UserDetailsManager는 UserDetailsService를 extends하는 인터페이스로, createUser(), updateUser(), deleteUser(), changePassword(), userExists()와 같은 기본적인 CRUD 메서드를 가진다.
UserDetailsManager의 구현 클래스로 InMemoryDetailsManager, JdbcUserDetailsManager 등이 있다.
InMemoryDetailsManager는 애플리케이션 메모리 내에, JdbcUserDetailsManager은 DB에 유저 정보를 저장하는 기능을 하는 구현체다.
UserDetailsService V.S UserDetailsManager
UserDetailsService와 UserDetailsManager를 굳이 분리할 필요 없이 하나의 인터페이스로 해도 될 것 같은데, 왜 분리를 했을까?
UserDetailsService는 user의 데이터를 load하는 역할만 하는 인터페이스이다. 사용자 정보의 CRUD 기능(회원가입, 회원탈퇴 등)이 없이, 단순히 유저 정보만을 load하는 기능만 필요로 하는 애플리케이션들도 있을 텐데, 이 때 load하는 기능만 사용하도록 Spring에서 이를 분리해놓은 것이다.
UserDetailsManager는 유저 정보의 CRUD를 지원하는 인터페이스로, 해당 기능이 필요한 애플리케이션에서는 Service대신 Manager를 사용하면 될 것이다.
위 인터페이스들과 구현제들 모두 UserDetails이라는 인터페이스 및 구현체(User 등)를 공통적으로 사용한다. 인증 과정에서 사용되는 유저 정보는 모두 UserDetails만 사용한다는 의미이다.
예를 들어 UserDetailsManager에서 createUser, updateUser 등의 메서드의 매개변수로 UserDetails User를 받는다.