UserDetailsService:
。Spring Security에서사용자인증정보의 조회를 위해DB에 저장된사용자정보를UserDetails 객체로서 조회하는 역할을 수행하는Core Interface
。AutheticationProvider에 의해 호출되어DB에서 저장된사용자정보를 조회 및 해당하는 사용자정보를UserDetails 객체로 return하는 역할을 수행.
▶Authentication 구현체의Credentials와UserDetails 객체의Password를 비교하여사용자인증의검증을 수행.
UserDetailsService.loadUserByUsername("username"):
。사용자가 자격증명을 전달 시DB에서 해당 자격증명의 ID 문자열 데이터에 해당하는 사용자 정보를 조회 후UserDetails 객체로 반환
UserDetails:
。 사용자별 세부 정보를 관리 및 load하는Core Interface.
▶ 개별 사용자의 이름, PW, 권한 등의 세부정보를 해당UserDetails의구현체내 저장
UserDetails 구현체 정의
。토큰인증방식사용 시 많이 사용.
UserDetails구현 Method
。구현체인User Class에도 상속되어 구현됨
User.username("계정명"),User.password("비밀번호"),User.roles("역할명")
。UserDetails에ID, PW, Role정보를 설정.
。User.roles("역할명")의 역할의 경우Enum을 통해 고정된 상수 집합을 정의하여 설정하는게 좋다.
。User.roles("역할명1","역할명2",...)으로 복수의 역할명도 지정 가능.
User:
。UserDetails를 구현한구현체
▶UserDetails는 Interface이므로 직접 Instance를 생성할 수 없으므로UserClass의Builder로ID, PW, Role를 지정하여UserDetails의 Instance 생성.
User.build():
。UserDetailsInstance를 생성
User.builder():
。User.withDefaultPasswordEncoder()에서 비밀번호 알고리즘(.passwordEncoder())을 추가 정의하여UserDetails 객체를 생성하는Builder Method.
▶User.withDefaultPasswordEncoder()를 대체.
User객체.passwordEncoder(input -> 패스워드인코더().encode(input)):
。Spring Bean으로 사전등록한 특정PasswordEncoder( ex.BCryptPasswordEncoder)를 통해문자열을인코딩하여 반환하는함수형 인터페이스를 정의하여 해당UserDetails객체의PasswordEncoder를 설정
▶ 사전에@Configuration Class에서PasswordEncoder의@Bean method가 존재해야 사용가능private UserDetails getUserDetails(String username, String password,roles role){ // User.passwordEncoder(람다식)을 통해 input된 문자열을 PasswordEncoder 구현 Class를 통해 // `Hashing`으로 Encoding을 수행하여 Hash값을 반환. return User.builder().passwordEncoder((input)-> passwordEncoderB().encode(input) ).username(username).password(password).roles(role.toString(),"DEVELOPER").build(); }。
passwordEncoderB()이 반환하는SpringBean( =BCryptPasswordEncoder)의.encode(문자열)를 이용해 입력된 문자열을 input하여BCrypt hashing을 통해 encode 된 문자열을 반환하는람다식을User.passwordEncoder()의인자로 전달
。사용자자격증명의인증을검증시BCryptPasswordEncoder에 의해사용자인증정보가BCrypt 해싱 알고리즘으로인코딩
ex )User.builder().passwordEncoder()에 의해 기존에 저장된PW : 123456가BCrypt알고리즘으로Encoding
▶Base64와 다르게Decoding이 불가능하므로 두 비교대상을Encoding후 서로 비교해서검증을 수행