본문 바로가기
Error

Spring Security DB 조회, 비밀번호 암호화

by 히포파타마스 2023. 6. 4.

Spring Security DB 조회, 비밀번호 암호화

 

1. UserdetailsService

Spring Security는 인증 시 인증정보를 기본적으로 세션을 통해 저장하고 조회한다. 

내가 진행한 프로젝트에서는 DB에 사용자의 정보를 저장했기 때문에 Spring Security가 인증 시 DB를 조회하도록 해야 했다.

Spring Security는 인증 정보를 조회할 때 UserdetailsService(인터페이스)의 loadUserByUsername 메서드를 참조한다.

따라서 인증 정보를 DB에서 조회하도록 UserdetailsService의 loadUserByUsername을 구현하면 된다.

 

내가 진행한 프로젝트에서는 JWT를 사용했기 때문에 Spring Security가 세션을 사용하지 않도록 설정해 놓았다. 

그런데 loadUserByUsername을 구현하지 않았기 때문에 당연히 인증정보를 조회할 수 없었고 예외가 발생했다.

 

Security에 JWT를 적용하면서 이것저것 필요한 클래스들을 구현하느라 깜빡하고 만 것이다.

 

바로 loadUserByUsername을 구현했고 해당 예외는 사라졌다.

 

username을 받아서 원하는 방식대로 인증 정보를 조회하고 UserDetails 타입으로 반환해 주면 된다.

 

[loadUserByUsername]

@Service
@RequiredArgsConstructor
public class PrincipalDetailService implements UserDetailsService {

    private final AccountRepository accountRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        Account account = accountRepository.findByEmail(username)
                .orElseThrow(() -> new UsernameNotFoundException("회원을 찾을 수 없습니다."));

        return new UserAccount(account);
    }
}

 

 

 

2. 비밀번호 암호화

Spring Security를 구현하고 사용자를 DB에 등록한 뒤 로그인 테스트를 하였다.

분명.. DB에 저장된 사용자 정보로 제대로 로그인을 했는데 인증이 되지 않았다.

 

디버깅을 해본 결과 인증이 될 때 비밀번호에서 인증이 되지 않았음을 확인했다.

 

원인은 DB에 사용자 정보를 저장할 때 비밀번호를 암호화하지 않았기 때문이었다.

 

암호화된 비밀번호를 DB에 저장하니 로그인도 잘되고 JWT 잘 발급이 되는 것을 확인할 수 있었다.

댓글