이제 UserDetail 인터페이스와
User 클래스에 대한
좋은 이해를 갖게 되었으니
이번 강의에서는 UserDetailsService 및
UserDetailsManager 인터페이스에
정확히 무엇이 포함되어 있는지 이해해 보겠습니다
그럼 동일한 내용에 대한 프레임워크 코드를 살펴보겠습니다
이전에 언급한 대로
UserDetailService라는 이 인터페이스는
가장 일반적인 시나리오인 유저 특정 데이터를
불러오는 데 사용되도록 설계되었습니다
저장 시스템에서
유저 특정 데이터를 불러오지 않으면
실제로 인증을 수행할 수 없습니다
따라서 이것은 가장 일반적인 시나리오이며
이 사용 사례를 위해 UserDetailService와 같은
별도의 인터페이스가 있습니다
이 인터페이스에는
loadUserByUsername라는 이름의 메소드가 있습니다
이 메소드를 위해 엔드 유저가 입력한 유저 이름을
전달하기만 하면 해당 유저 이름을
기반으로 저장 시스템에서
유저 세부 정보가 불러오기되어
이 메소드의 구현 클래스에서 반환됩니다
그리고 이전에 강조한 것처럼
SQL 쿼리와 웹 조건에서는 유저 세부 정보를
유저 이름과 비밀번호 모두를 사용하여 불러오려고
시도해서는 안 됩니다
왜냐하면 그렇게 하면
비밀번호가 출력되어 SQL 서버, SQL 로그
그리고 모든 네트워크에 노출되게 되어
비밀번호가 자주 이동하게 될 것이기
때문에 이는 권장되지 않는 접근 방식입니다
그래서 Spring Security 팀은
유저 세부 정보를
유저 이름만으로만 불러오려고 시도하는
시나리오를 구성하고 있습니다
그리고 말했듯이 이 UserDetailService 인터페이스는
또 다른 인터페이스인
UserDetailsManager에 의해 확장됩니다
그래서 Spring Security 팀이
선택한 네이밍 규칙도
매우 적절합니다
UserDetails 내부에는
유저 세부 정보를 불러오는 유일한 서비스가
있습니다
그래서 이 이름이 매우 적절한 이유입니다
한편 UserDetailsManager에 대해서는
새로운 유저를 생성하거나 기존 유저를
업데이트할 수 있는 능력을 제공하게 됩니다
그래서 Manager라는 이름은 매우 적절합니다
왜냐하면 이는 유저를 생성하고 업데이트하며 삭제함으로써
유저를 관리하기 때문입니다
여기 여러 가지 메소드가 있는 것을 볼 수 있습니다
changePassword 메소드는 엔드 유저가 자신의 비밀번호를
변경할 수 있게 해줍니다
그리고 createUser 메소드는
처음으로 자신을 등록하려는 경우에
사용할 수 있는 메소드입니다
그리고 deleteUser 메소드는 삭제를 수행합니다
loadUserByUsername 메소드는 이미 알고 계실 것입니다
이는 부모 인터페이스인
UserDetailsService에서 상속됩니다
그리고 updateUser 메소드는
유저의 프로필 세부 정보를 업데이트하고자 할 때
사용할 수 있습니다
유저의 세부 정보를 저장 시스템에서
업데이트하려면 이 메소드를 구현할 수 있습니다
그리고 여기 userExists 메소드는 흥미로운 메소드이며
흥미로운 시나리오를 다룹니다
가끔은 주어진 유저 이름으로
저장 시스템 내에 유저가 있는지
알고 싶을 때가 있습니다
우리는 실제로 유저를 인증하려는 것이 아닙니다
그저 시스템 내에
유저가 있는지를 이해하고 싶을 뿐입니다
그래서 그러한 경우에는 이 메소드를 오버라이드하고
그 안에 로직을 구현할 수 있습니다
이 메소드는 시스템 내에 유저가 존재하는 경우
true 불리언(Boolean) 값을 반환할 것입니다
그렇지 않으면 그냥 false를 반환할 것입니다
그래서 이 두 인터페이스는
Spring Security 내에서 매우 중요하며
이 인터페이스들에 대한 몇 가지
구현 클래스가 있습니다
유저 세부 정보를 로드하고 저장하는
이 생태계 전반은 기본
AuthenticationProvider인
DaoAuthenticationProvider에 의해 활용될 것입니다
그런데 어떤 이유로
UserDetailsManager 및 UserDetailsService를 따르고 싶지 않고
단순히 자체 로직을 작성하려면
그럼
자체 AuthenticationProvider를
정의하고 해당 커스텀 AuthenticationProvider 내에서
원하는 모든 로직을 작성할 수 있습니다
우리는 앞으로의 강의에서 그 시나리오를
자세히 살펴볼 것입니다
그러나 현재로서 이 초기 섹션에서는
모든 것을 다시 만들 필요가 없도록
Spring Security에서 제공하는
기본 동작, 기본 클래스
그리고 인터페이스를 활용할 것입니다
그럼 이제 UserDetailsService 및
UserDetailsManager 인터페이스 내용과
그 목적에 대해 아주 잘 이해하셨다고
생각하겠습니다
다음 강의에서는
Spring Security 프레임워크 내에서 제공되는
InMemoryUserDetailsManager
JdbcUserDetailsManager 그리고
LdapUserDetailsManager와 같은
이 인터페이스의 샘플 구현 클래스를
살펴보겠습니다
그럼 지금까지 잘 따라오셨다고 생각하겠습니다
감사드리며 다음 강의에서 뵙겠습니다