[TIL] 23.01.02 비밀번호 암호화, 정규식 적용

hyewon jeong·2023년 1월 2일
0

TIL

목록 보기
59/138

1 . 문제점

회원가입 및 로그인 시 비밀번호를 안정성을 위한 비밀번호 암호화 시도와
아이디 및 패스워드에 정규식 적용

2 . 시도한 점

  • 원래는 양방향 비밀번호였지만 해킹 등의 안정성을 고려하여
    단방향 암호화 알고리즘을 시도했다.
  • @Valid 유효검사를 이용하여 해당 클래스에 세부적인 어노테이션으로 정규식 사용함

3 . 해결

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();
    }

4 . 알게 된점

  1. @Valid로 유효검사를 쉽게 할 수 있는 점과
    @Patten ,@Size 등 으로 아이디 및 패스워드 정규식을 쉽게 코드 구현 할 수 있는 점

  2. 비밀번호 암호화 기본 설정

WebSecurityConfig 클래스에
비밀번호 암호화를 위해 빈으로 등록 해야 됨

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
profile
개발자꿈나무

0개의 댓글