회원가입 및 로그인 시 비밀번호를 안정성을 위한 비밀번호 암호화 시도와
아이디 및 패스워드에 정규식 적용
UserController
// - 1. 회원 가입 API
@PostMapping("/signup")
public ResponseStatusDto signup(@RequestBody @Valid SignupRequest signupRequest){
return userService.signup(signupRequest);
}
SignupRequest
@Getter
@NoArgsConstructor
public class SignupRequest {
@NotBlank
@Size(min = 4, max = 8)
@Pattern(regexp = "^[a-z0-9]*$", message = "최소 4자 이상, 10자 이하이며 a-z, 0-9 만 입력하세요.")
private String username;
@NotBlank
@Size(min = 8, max = 15)
@Pattern(regexp = "^[a-zA-Z0-9]*$", message = "최소 8자 이상, 15자 이하이며 a-z, A-Z, 0-9 만 입력하세요.")
private String password;
@Email
@NotBlank
private String email;
private boolean admin = false;
private String adminToken = "";
}
LoginRequest
@Getter
@NoArgsConstructor
public class LoginRequest {
@NotBlank
@Size(min = 4, max = 8)
@Pattern(regexp = "^[a-z0-9]*S", message = "최소 4자 이상, 10자 이하이며 a-z, 0-9 만 입력하세요.")
private String username;
@NotBlank
@Size(min = 8, max = 15)
@Pattern(regexp = "^[a-zA-Z0-9]*$", message = "최소 8자 이상, 15자 이하이며 a-z, A-Z, 0-9 만 입력하세요.")
private String password;
}
UserService
private final PasswordEncoder passwordEncoder;
@Transactional
public ResponseStatusDto signup(@Valid SignupRequest signupRequest) {
String username = signupRequest.getUsername();
String password = passwordEncoder.encode(signupRequest.getPassword());
......
@Transactional // readOnly= true 하면 에러남
public ResponseStatusDto login(LoginRequest loginRequest, HttpServletResponse response) {
String username = loginRequest.getUsername();
String password = loginRequest.getPassword();
......
//비밀번호 확인
if(!passwordEncoder.matches(password,user.getPassword())){
throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
}
WebSecurityConfig
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig {
private final JwtUtil jwtUtil;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Valid로 유효검사를 쉽게 할 수 있는 점과
@Patten ,@Size 등 으로 아이디 및 패스워드 정규식을 쉽게 코드 구현 할 수 있는 점
비밀번호 암호화 기본 설정
WebSecurityConfig 클래스에
비밀번호 암호화를 위해 빈으로 등록 해야 됨
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}