컴퓨터 프로그래밍/Spring

[Spring] Password Encoder 사용법

한33 2024. 9. 29. 03:26

SignUpRequestDto

@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[\\p{Punct}])[A-Za-z\\d\\p{Punct}]{8,20}$",
        message = "비밀번호는 최소 8자리 이상, 영문, 특수문자를 1자 이상 포함되어야 합니다.")
@NotBlank(message = "비밀번호를 입력해주세요.")
private String password;

 

Dto 에서 위와 같이 입력해서 비밀번호 패턴을 제한할 수 있다.


PasswordEncoder

@Component
public class PasswordEncoder {

    public String encode(String rawPassword) {
        return BCrypt.withDefaults().hashToString(BCrypt.MIN_COST, rawPassword.toCharArray());
    }

    public boolean matches(String rawPassword, String encodedPassword) {
        BCrypt.Result result = BCrypt.verifyer().verify(rawPassword.toCharArray(), encodedPassword);
        return result.verified;
    }
}

UserService

String password = passwordEncoder.encode(signupRequestDto.getPassword());

 

Dto 로 부터 입력받은 비밀번호를 위와 같이 encode 를 통해서 인코딩해서 데이터베이스로 전달할 수 있다.

if (!passwordEncoder.matches(signinRequestDto.getPassword(), user.getPassword())) {
    throw new UnauthorizedPasswordException();
}

 

matches 메서드를 이용해서 앞에는 입력받은 비밀번호를, 뒤에는 인코딩되어있는 비밀번호를 넣어서

 

두 비밀번호가 일치하는지 확인할 수 있다.

 

두 비밀번호가 일치하면 true 를 반환하기 때문에 앞에 ! 가 붙어서 비밀번호가 일치하지 않으면 위와 같은 예외처리를

 

하는 것을 확인할 수 있다.