코드스테이츠_국비교육/[Section4]

62.03_[Spring Security] 로그인 인증_Database_22.11.18

생각없이 해도 생각보다 좋다. 2022. 11. 21. 18:43

>Custom UserDetailsService 사용
: InMemory 사용하는 방법에서는 UserDetailsManager(인터페이스) 사용
: UserDetailsManager는 UserDetailsService(인터페이스) 상속
: Custom UserDetailsService 란, UserDetailsService를 구현하여 만든 클래스이다.

>UserDetailsService 를 사용한다는 것의 의미
: Spring Security에서 User의 인증 정보를 테이블에 저장하고, 테이블에 저장된 인증 정보를 이용해 인증 프로세스를 진행하는 방법 중 하나.
: 즉, Spring Security 에서 제공하는 인증 프로세스를 사용하기 위함.

>Custom UserDetailsService 사용하기 위한 순서
1. SecurityConfiguration 설정
: HTTP 요청에 대한 보안 작업의 흐름을 설정하는 부분
: 암호화를 수행하는 객체를 빈으로 제공하는 부분

2. JavaConfiguration 설정
: Repository와 PasswordEncoder(암호화 수행)를 DI하기 위해 빈으로 등록
//@Service 를 대신하는 클래스인데 정확히 파악을 못함. @Service 부터 파악하자

3. DBMemberService(Custom) 생성
: DB와 연동한 Service 클래스
: Repository를 DI하여 DB와 연동
: PasswordEncoder를 DI하여 DB에 멤버 정보 저장 전 암호화를 수행하고 저장함.

4. Custom UserDetailsService 구현
: Spring Security 에서 제공하는 인증 프로세스를 사용하기 위한 클래스
: User 정보를 Load 시키는 것이 목적인 인터페이스
: User 정보를 Load 하면 Spring Security에서 정보를 전달받고 인증 절차를 진행
: Repository를 DI하여 DB와 연동
: AuthorityUtils(Custom)를 DI하여 저장된 유저에게 권한을 부여하는 작업 수행
-loadUserByUsername 메서드 구현
: username(String)을 매개변수로 하는 메서드.
: 예외 발생 시, UsernameNotFoundException으로 던짐.
: Repository를 통해 DB에서 유저 정보를 불러옴 (1)
: AuthorityUtils(Custom)를 통해 해당 유저 정보의 권한을 생성 (2)
: UserDeatils의 구현체인 User로 정보를 묶어서 반환(User 정보를 load하여 Spring Security에 정보를 전달하는 단계)
//마지막 단계의 User를 직접 구현한 다른 구현체로 교체할 수 있음. 리팩토링 포인트

4-1. AuthorityUtils(Custom) 생성
: 부여할 권한의 리스트를 담는 필드들 생성
: email을 매개변수로 해당 유저가 admin인지 일반 유저인지 구분 후, 역할에 걸맞는 권한을 부여하는 메소드 생성
//admin 이메일을 미리 설정해둠.

>추가할 점
: 위의 순서 및 사항대로 코드를 구현하면 유저의 권한은 상황에 맞추어 생성되어 반환될 뿐, DB에 저장되어 사용되는 것이 아님.
: 상황에 맞추어 생성되어 반환된 권한은 Spring Security로 인증하는 용도로만 사용되고, 따로 권한 정보를 DB에 저장하진 않음.
: 유저의 권한 DB에 저장하고 사용할 수 있도록 리팩토링

>User의 Role(권한 정보)을 DB에서 관리하기 순서
1. Member 클래스에 user의 권한 정보(Role)를 담는 필드 생성
: User의 권한 정보 테이블을 생성하기 위함.
: Member 엔티티와 Role 엔티티의 관계는 일대다(1:N) 관계이다. (한 명의 회원이 여러 role을 가질 수 있음)
: @ElementCollection 사용(추가 공부)
//@ElementCollection : List, Set 같은 컬렉션 타입의 필드를 엔티티 연관 관계 매핑할 때 사용하면, 따로 상대 엔티티 클래스를 생성하지 않아도 매핑하게 해주는 애너테이션

>Spring Security 의 인증 서비스를 커스텀해서 사용하기.
: 자체적으로 제공되는 Spring Security 의 인증 서비스를 입맛에 맞춰 Custom 하는 방법이 있음.
: Spring Security의 핵심 컴포넌트는 AuthenticationProvider 이다.

>Custom AuthenticationProvider 구현하기
1. AuthenticationProvider implements
2. Service, authorityUtils, passwordEncoder DI
3. authenticate() 메서드 오버라이드
: 사용자의 인증 여부를 처리하는 로직을 담당하는 메서드
4. supports() 메서드 오버라이드
: Custom AuthenticationProvider가 Username/Password 방식의 인증을 지원한다는 것을 Spring Security에 알리는 역할의 메서드