[SPRING] Todo ver2 (4) - 비밀번호 암호화

림민지·2025년 4월 4일

Today I Learn

목록 보기
41/62

사용자의 비밀번호를 그대로 DB에 저장하면 보안상의 문제가 생길 수 있다.

때문에 그대로 저장하는게 아니라, 암호화를 한 후에 저장해야한다.

➡️ 비밀번호 암호화를 할 수 있는 PasswordEncoder 클래스를 만들어 암호화해보자!

비밀번호 암호화하기

1. 의존성 추가 🐘

먼저 gradle에 의존성을 추가해주어야한다

implementation 'at.favre.lib:bcrypt:0.10.2'

2. 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;
    }
}

3. Service에서 암호화하기

Member 회원가입할 때 입력받은 비밀번호를 암호화해야하므로, signUp 메서드에서 암호화를 해 레포지토리에 전달해주어야한다

private final PasswordEncoder passwordEncoder; 아까 만들어둔 암호화 클래스를 가져와주고

public SignUpResponseDto signUp(String name, String password, String email) {
        String encodePassword = passwordEncoder.encode(password);//비밀번호 해쉬키로 암호화하기
        Member member = new Member(name, encodePassword, email);
        Member savedMember = memberRepository.save(member);
        return new SignUpResponseDto(savedMember.getId(), savedMember.getName(), savedMember.getEmail());
    };

컨트롤러에서 dto로 입력받았던 String passwordencodePassword로 변환해주자!!
.encode()

그리고 Member 객체를 생성할 때, 반드시 방금 만든 encodePassword를 저장!

포스트맨에서 201로 잘 실행되는 모습을 확인할 수 있고, DB에도 암호화된 값이 들어간다 👍


암호화된 비밀번호 활용하기

//회원가입된 회원이 맞는지 검증
    public Member login(String email, String password) {
        Optional<Member> member = Optional.ofNullable(memberRepository.findMemberdByEmail(email).orElseThrow(()
                -> new CustomException(Errors.INVALID_LOGIN)));

        if (passwordEncoder.matches(password, member.get().getPassword())) { //인코딩한 비번과 매칭해서 맞는지 확인하기
            return member.get();
        } else {
            throw new CustomException(Errors.INVALID_LOGIN);
        }
    }
passwordEncoder.matches(password, member.get().getPassword())

matches() 메서드로 저장된 비번과 입력한 비번을 비교하면 T/F값이 나오게 된다!

profile
@lim_128

0개의 댓글