본문 바로가기

JAVA/Spring Boot

[ Spring boot / JAVA ] 쇼핑몰을 만들어보자(2) - 비밀번호 암호화해서 저장하기

728x90

 

 

 

 

[ Spring boot / JAVA ] 쇼핑몰을 만들어보자 (1) - Spring Security

안녕하세요 ! 😊 [ Spring boot / JAVA ] 스프링 부트 - Controller(2) 회원가입 기능 구현 안녕하세요 ! (●'◡'●) [ Spring boot / JAVA ] 스프링 부트 - Controller(1) 안녕하세요 ! (. ❛ ᴗ ❛.) 이번 글에서는 스프

preparingforme-n-us.tistory.com

 

 

안녕하세요 !

 

지난 글에서는 회원가입을 할 때 비밀번호를 암호화하지 않고 저장했습니다.

 

사용자가 입력한 값을 그대로 DB에 저장해두는 것보다 암호화를 한 뒤 저장해주는 것이 안전하기 때문에

 

Spring Security에서 제공하는 BCryptPasswordEncoder를 사용해서 비밀번호를 암호화해서 저장해보겠습니다 !

 

 

 

 


 

BCrytPasswordEncoder 란?

  • Spring Security에서 제공하는 비밀번호를 암호화 하는 데 사용하는 메소드를 가진 클래스입니다.
  • BCrypt Hashing을 사용하여 암호화합니다.

 

Bcrypt Hashing이 뭔지 간단하게 짚어보고 넘어가자면,

 

인간이 해독할 수 없는 문자열( Hashed Text )로 바꿔주는 단방향 암호화입니다.

 

※ 단방향 암호화는 평문을 암화화할 수는 있지만 암호화된 문자는 복호화할 수 없습니다.

※ 양방향 암호화는 복호화가 가능합니다.

 

 

BCryptPasswordEncoder.java 에서 제공하고 있는 encode(), matches()를 사용해볼건데 그 전에 메소드를 한번 살펴볼까요?

 

@Override
public String encode(CharSequence rawPassword) {
    if (rawPassword == null) {
        throw new IllegalArgumentException("rawPassword cannot be null");
    }
    String salt = getSalt();
    return BCrypt.hashpw(rawPassword.toString(), salt);
}
    
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
    if (rawPassword == null) {
        throw new IllegalArgumentException("rawPassword cannot be null");
    }
    if (encodedPassword == null || encodedPassword.length() == 0) {
        this.logger.warn("Empty encoded password");
        return false;
    }
    if (!this.BCRYPT_PATTERN.matcher(encodedPassword).matches()) {
        this.logger.warn("Encoded password does not look like BCrypt");
        return false;
    }
    return BCrypt.checkpw(rawPassword.toString(), encodedPassword);
}

 

 

 

encode에서는 입력받은 비밀번호를 BCrypt의 hashpw를 통해 hased text로 변환해주고 있는 것을 확인할 수 있습니다.

 

matches를 보면 입력받은 평문이 저장된 encode되어있는 비밀번호화 비교해서 판단하고있습니다.

 

그럼 이제 encoder를 사용해볼까요?

 

config 폴더 안에 EncoderConfig.java 를 만들어주겠습니다.

 

@Configuration
public class EncoderConfig {

    @Bean
    public BCryptPasswordEncoder encoder() {
        return new BCryptPasswordEncoder();
    }
    
}

 

 

 

BCryptPasswordEncoder의 encode(), matches() 메소드를 사용해서 signup과 login로직을 조금 수정할것입니다.

 

MemberService.java

@Service
@RequiredArgsConstructor
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;

    private final BCryptPasswordEncoder encoder;

    public boolean signup(MemberDto memberDto) {
        MemberEntity mem = memberDto.toEntity();
        try{
            // save()가 성공하면 true 반환.
            memberRepository.save(mem);
            return true;
        }catch (Exception e){
            return false;
        }
    }

    public boolean login(MemberDto memberDto, HttpSession session) {
        MemberEntity mem = memberDto.toEntity();

        try{
            // login이 성공하면 true 반환.
            MemberEntity loginMem = memberRepository.findByMemberId(mem.getMemberId());
            if(encoder.matches(mem.getPassword(), loginMem.getPassword())){
                session.setAttribute("member", loginMem);
                return true;
            }else{
                return false;
            }
        }catch (Exception e){
            return false;
        }
    }
}

 

 

 

 

 

회원가입할 때 사용자로부터 입력받은 password를 encoder.encode() 로 암호화 하여 저장하고

 

로그인할 때 이미 저장되어있던 password와 입력한 password를 encoder.matches()를 이용해서 비교하고 일치하면 true를 반환합니다.

 

 

 

 

회원가입 폼에서 비밀번호에 member 라고 적어서 제출해보겠습니다.

 

이제 회원가입 버튼을 누르고 MySQL에 들어간 내용을 확인해보면 

 

 

이렇게 암호화가 되어 저장된것을 확인할 수 있습니다 !

 

로그인도 잘되는지 확인해볼까요?

 

 

 

 

 

서버에서 로그인 요청을 성공적으로 처리한 것을 확인할 수 있습니다 !

 

이렇게 이번 글에서는 비밀번호를 암호화해서 저장하고

 

암호화된 비밀번호와 비교해서 로그인하는 것까지 구현해봤습니다.

 

감사합니다.