코딩과 결혼합니다

231012 - [Game_Crew]트러블 슈팅 : 회원가입 구현 본문

코딩과 매일매일♥/Game_Crew

231012 - [Game_Crew]트러블 슈팅 : 회원가입 구현

코딩러버 2023. 10. 12. 22:57
728x90
    @PostMapping("/signup")
    public MessageResponseDto signup(@RequestBody @Valid SignupRequestDto requestDto){
        signupService.signup(requestDto);
        return new MessageResponseDto(Message.SIGNUP_SUCCESSFUL, HttpStatus.OK);
    }
    public void signup(SignupRequestDto requestDto){
        String email = requestDto.getEmail();
        String nickname = requestDto.getNickname();
        String password = passwordEncoder.encode(requestDto.getPassword());

        //회원 중복 확인
        Optional<User> checkEmail = userRepository.findByEmail(email);
        if (checkEmail.isPresent()) {
            throw new CustomException(ErrorMessage.DUPLICATE_EMAIL_EXISTS, HttpStatus.CONFLICT, true);
        }

        //사용자 등록
        User user = new User(email, nickname, password);
        userRepository.save(user);
    }

📌 Validation

  • 데이터의 일관성 유지 : 입력된 데이터의 일관성과 유효성을 검사하여 잘못된 데이터가 시스템에 들어오는 것을 방지
  • 오류 처리 및 예외 방지 : 오류와 예외 상황들을 사전에 방지할 수 있다.
  • 사용자 경험 향상 : 실시간으로 에러 메세지를 표시하여 사용자가 문제점을 파악하고 수정할 수 있도록 도와줌

📌 BcryptPasswordEncoder

@Configuration
public class Password {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

 

bcrypt

  • bcrypt는 해시함수 오픈소스 라이브러리로 Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용된다. 
  • 암호화를 위해 다양한 언어가 지원되고 사용이 간편
  • 해쉬 결괏값에 소금값과 해시값 및 반복 횟수를 같이 보관하기 때문에 우리는 암호화된 값만 DB에 저장
  • 비밀번호 해싱을 적용하는 데 있어 DB설계를 복잡하게 할 필요가 없다

BcryptPasswordEncoder

  • 스프링 시큐리티 프레임워크에서 제공하는 클래스로 비밀번호를 암호화하는 데에 쓰이는 메서드이다.
    비밀번호는 암호화가 된 채로 데이터베이스에 저장되기 때문에 원래의 비밀번호를 알 수 없다.
  • encode() :  패스워드를 암호화해 준다. 똑같은 비밀번호를 해당 메서드를 통하여 인코딩하더라도 매번 다른 인코딩 된 문자열을 반환한다.
  • matchers : 제출된인코딩 되지 않은 패스워드와 인코딩 된 패스워드의 일치 여부를 확인한다. 

📌오늘의 트러블슈팅

문제 : 회원가입 기능을 만든 후에 포스트맨으로 확인하려 하였는데 401 Unauthorized이 뜸

원인 : 시큐리티 인증을 받지 않았기 때문( 스프링 시큐리티의 BcryptPasswordEncoder를 통해 입력받은
           비밀번호를 암호화. 시큐리티 비밀번호를 입력해야 한다.)

해결 : 나는 첫 번째의 방법으로 간단하게 기능이 잘 돌아가는지 확인해 보았다.

  1.  (exclude = SecurityAutoConfiguration.class) : SpringBootApplication에 스프링 시큐리티를 무시하는 걸 임시로 적용✔️
  2. 로그에 뜬 시큐리티의 패스워드를 포스트맨의 Basic Auth에 입력해 준다.

+ 에러(예외 처리)메세지나 성공했을 때의 메세지를 한 곳에서 관리할 수 있도록 만들었다.