Spring

스프링 + JWT 비밀번호 변경 기능 구현

NCOOKIE_ 2023. 5. 19. 15:02

기존 비밀번호와 신규 비밀번호를 입력받아 DB의 비밀번호를 수정하는 기능을 구현했다.

 

UserAccountController.java

@PatchMapping("/api/user/password")
public ApiResponse<?> modifyUserPassword(@RequestHeader("Authorization") String accessToken,
                                         @RequestBody ModifyUserPasswordRequest modifyUserPasswordRequest) {
    userAccountService.modifyUserPassword(accessToken, modifyUserPasswordRequest);
    return ApiResponse.createSuccessWithNoContent(ResponseCode.USER_MODIFY_PASSWORD_SUCCESS);
}

 

UserAccountService.java

public void modifyUserPassword(String accessToken, ModifyUserPasswordRequest modifyUserPasswordRequest) {
    jwtService.extractClaimFromJWT(JwtService.CLAIM_EMAIL, accessToken)
            .ifPresentOrElse(email -> {
                userAccountRepository.findByEmail(email)
                        .ifPresentOrElse(user -> {
                            if (passwordEncoder.matches(modifyUserPasswordRequest.getOldPassword(), user.getPassword())) {
                                user.setPassword(modifyUserPasswordRequest.getNewPassword());
                                user.passwordEncode(passwordEncoder);
                                userAccountRepository.save(user);
                            } else {
                                throw new BadRequestException(ResponseCode.USER_MODIFY_PASSWORD_FAILURE);
                            }
                        }, () -> { throw new BadRequestException(ResponseCode.USER_NOT_FOUND); });
            }, () -> { throw new BadRequestException(ResponseCode.USER_NOT_FOUND); });
}

 

먼저 JWT의 액세스 토큰을 통해 이메일을 추출하고, 이메일을 통해 유저 엔티티를 받는다. 이 때 PasswordEncoder.encode()를 통해 암호화된 기존 비밀번호가 DB에 저장되며 해시 처리되었기 때문에 equals() 메소드를 통해서는 비교할 수 없다. 대신 PasswordEncoder 클래스에서 제공하는 mathces() 메소드를 사용할 수 있다.

 

첫 번째 인자값으로 평문의 String을 입력받으며, 두 번째 인자로 DB에 저장된 비밀번호를 받는다.

 

boolean matches(CharSequence rawPassword, String encodedPassword)

 

if (passwordEncoder.matches(modifyUserPasswordRequest.getOldPassword(), user.getPassword())) {
	// 일치함. 비밀번호 변경 로직 수행
} else {
    // 입력된 기존 비밀번호와 DB의 비밀번호가 다르므로 예외처리
}

 

'Spring' 카테고리의 다른 글

회원 탈퇴 시 HTTP status code  (0) 2023.05.19
[Spring JPA] JPQL like 사용법  (0) 2022.10.18
[Spring] @RequestParam Annotation  (0) 2022.10.18