Spring Security + JWT 5

johaS2·2025년 2월 4일

AuthenticationManager DB 기반 로그인 검증 로직

  • UserRepository
//username을 받아 DB 테이블에서 회원을 조회하는 메소드 작성
    UserEntity findByUsername(String username);
  • CustomUserDetailsService
// UserDetailsService 인터페이스를 구현한 서비스 클래스
// 사용자 정보를 DB에서 조회하고, UserDetails 객체로 변환하여 CustomUserDetails로 반환하는 역할!!
@Service
public class CustomUserDetailsService implements UserDetailsService {
    private final UserRepository userRepository;

    public CustomUserDetailsService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // loadUserByUsername() 메서드
    // username으로 DB에서 조회
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //DB에서 조회
        UserEntity userData = userRepository.findByUsername(username);
        //사용자 정보가 null이 아니라면 즉 있다면 CustomUserDetails 객체를 반환
        if(userData != null) {
            return new CustomUserDetails(userData);
        }
        return null;
    }
}
  • CustomUserDetails
// CustomUserDetails 클래스 - UserDetails를 구현한 클래스
// 실제 사용자 정보를 UserDetails 형식으로 변환하여 반환 -> 이 객체는 스프링 시큐리티의 인증 과정에서 사용
// UserEntity 객체를 내부에 가지고 있으며,
// UserEntity에서 제공하는 정보를 UserDetails 인터페이스에서 요구하는 형식에 맞게 반환함
public class CustomUserDetails implements UserDetails {

    private final UserEntity userEntity;

    public CustomUserDetails(UserEntity userEntity) {
        this.userEntity = userEntity;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() { // getAuthorities() : 사용자 권한을 반환하는 메서드

        Collection<GrantedAuthority> collection = new ArrayList<>();

        collection.add(new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return userEntity.getRole();
            }
        });

        return collection;
    }

    @Override
    public String getPassword() {
        return userEntity.getPassword();
    }

    @Override
    public String getUsername() {
        return userEntity.getPassword();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

AuthenticationManager 역할

  • 로그인 시 AuthenticationManager는 UserDetailsService를 통해 반환된 CustomUserDetails를 가지고 인증 과정을 진행합니다.
  • AuthenticationManager는 UsernamePasswordAuthenticationToken을 기반으로 인증을 진행하고, CustomUserDetails에서 받은 사용자 정보(username, password, role)를 검증합니다.
profile
passionate !!

0개의 댓글