프로젝트 (Java)/예약마켓
[프로젝트] 29. 비밀번호 변경 및 회원탈퇴 시 로그아웃 처리
hihyuk
2024. 1. 31. 09:42
프로젝트에 비밀번호 변경 및 회원 탈퇴 시 로그아웃 처리를 추가하는 것은 보안성을 강화하고, 사용자의 데이터 보호를 위한 중요한 단계입니다. 비밀번호 변경이나 회원 탈퇴 시, 해당 사용자의 JWT 토큰을 Redis에서 삭제함으로써, 변경된 상태에서의 재인증을 요구하게 됩니다. 이러한 접근 방식은 사용자 계정의 보안을 강화하는 데 중요한 역할을 합니다.
UserController 변경 사항
UserController에서는 비밀번호 변경 및 회원 탈퇴 기능을 구현합니다. 이 과정에서 사용자의 정보를 데이터베이스에서 조회하고, 필요한 작업을 수행한 후, Redis에 저장된 해당 사용자의 JWT 토큰을 삭제합니다.
@Transactional
public void updatePassword(Long userId, UpdatePasswordDto passwordDto) {
User user = userRepository.findById(userId).orElseThrow(
() -> new BadRequestException("유저 정보를 찾을 수 없습니다.")
);
user.updatePassword(passwordDto, bCryptPasswordEncoder);
userRepository.save(user);
String key = "JWT_TOKEN:" + user.getEmail();
if (redisTemplate.opsForValue().get(key) != null) {
redisTemplate.delete(key); // Token 삭제
}
}
@Transactional
public void deleteUser(Long userId) {
User user = userRepository.findById(userId).orElseThrow(
() -> new BadRequestException("유저 정보를 찾을 수 없습니다.")
);
postRepository.deleteAllByUser(user);
userRepository.delete(user);
String key = "JWT_TOKEN:" + user.getEmail();
if (redisTemplate.opsForValue().get(key) != null) {
redisTemplate.delete(key); // Token 삭제
}
}
User 엔티티 변경 사항
User 엔티티에서는 비밀번호 업데이트 메서드를 수정하여, 새로운 비밀번호가 기존의 비밀번호와 다른지 검증합니다. 또한, 새로운 비밀번호가 유효한 값인지 검증합니다.
public void updatePassword(UpdatePasswordDto updatePasswordDto, PasswordEncoder passwordEncoder) {
String newPassword = updatePasswordDto.getPassword();
if (!StringUtils.hasText(newPassword)) {
throw new BadRequestException("비밀번호를 입력해야 합니다.");
}
if (passwordEncoder.matches(newPassword, this.password)) {
throw new BadRequestException("새로운 비밀번호는 이전 비밀번호와 달라야 합니다.");
}
this.password = newPassword;
}
결론
이 구현을 통해, 사용자의 비밀번호 변경 및 회원 탈퇴 시 자동으로 로그아웃 처리를 함으로써, 계정의 보안을 강화하고 사용자의 데이터 보호를 위한 추가적인 조치를 취할 수 있습니다. Redis에서 사용자의 토큰을 삭제하는 것은 사용자가 다시 로그인하여 새로운 토큰을 발급받도록 하여, 시스템의 보안을 더욱 강화합니다.