Spring Security - User, UserDetails , UserDetailsService

TopOfTheHead·2025년 11월 18일

Spring Security

목록 보기
6/21

UserDetailsService :
Spring Security에서 사용자인증정보의 조회를 위해 DB에 저장된 사용자정보UserDetails 객체로서 조회하는 역할을 수행하는 Core Interface

AutheticationProvider에 의해 호출되어 DB에서 저장된 사용자정보를 조회 및 해당하는 사용자정보를 UserDetails 객체로 return하는 역할을 수행.
Authentication 구현체CredentialsUserDetails 객체Password를 비교하여 사용자인증검증을 수행.

  • UserDetailsService.loadUserByUsername("username") :
    。사용자가 자격증명을 전달 시 DB에서 해당 자격증명의 ID 문자열 데이터에 해당하는 사용자 정보를 조회 후 UserDetails 객체로 반환

UserDetails :
。 사용자별 세부 정보를 관리 및 load하는 Core Interface.
▶ 개별 사용자의 이름, PW, 권한 등의 세부정보를 해당 UserDetails구현체내 저장
UserDetails 구현체 정의

토큰인증방식 사용 시 많이 사용.


UserDetails 구현 Method
구현체User Class에도 상속되어 구현됨

  • User.username("계정명") , User.password("비밀번호") , User.roles("역할명")
    UserDetailsID, PW, Role 정보를 설정.
    User.roles("역할명")의 역할의 경우 Enum을 통해 고정된 상수 집합을 정의하여 설정하는게 좋다.
    User.roles("역할명1","역할명2",...) 으로 복수의 역할명도 지정 가능.

User :
UserDetails를 구현한 구현체
UserDetailsInterface이므로 직접 Instance를 생성할 수 없으므로 User Class의 BuilderID, PW, Role를 지정하여 UserDetails의 Instance 생성.

  • User.build() :
    UserDetails Instance를 생성

  • 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 : 123456BCrypt 알고리즘으로 Encoding
Base64와 다르게 Decoding이 불가능하므로 두 비교대상을 Encoding 후 서로 비교해서 검증을 수행

profile
공부기록 블로그

0개의 댓글