PasswordEncoder

이리·2025년 6월 12일
0

Trouble Shooting

목록 보기
2/5

로그인 기능을 구현하던 중 비밀번호를 암호화하기 위해 PasswordEncoder를 사용하며 생긴 문제를 기록하려합니다!


문제상황

BCryptPasswordEncoder 사용해 encode한 비밀번호를 DB에 저장하고 passwordEncoder.mathes 를 사용해 비교한 결과를 토대로 로그인 여부를 확인하려 했지만 같은 비밀번호를 입력함에도 비밀번호가 틀렸다는 오류를 return

Code

  • 회원가입
  • 로그인

자체진단

  1. 저장할때 비밀번호가 DB에 저장되는 비밀번호와 일치하는지 확인
    테스트로 확인 → 모두 통과 = 회원 가입, 로그인 로직에는 문제 없음
  1. 프론트단에서 올바른 데이터를 던져주는지 확인

    v-model로 받는 부분에서 password를 email로 받고 있어 오류가 생김

배운점

1. BCryptPasswordEncoder

BCryptPasswordEncoder는 비밀번호를 해시화할 때마다 랜덤한 salt를 자동으로 생성하여 적용하기 때문에, 같은 비밀번호라도 해시 결과는 매번 달라집니다.
→ 따라서 일반적인 문자열 비교 (equals)를 사용할 수 없으며, 대신 passwordEncoder.matches(원문, 해시값) 메서드를 사용해 비밀번호 일치 여부를 검증합니다.

❓어떻게 가능할까?
→ 이는 BCrypt 알고리즘의 특성 덕분인데, BCrypt는 해시 문자열 내부에 salt와 해싱 라운드 정보가 포함되어 있어서, 저장된 해시에서 salt와 해싱 횟수를 추출해 입력된 비밀번호 원문을 같은 방식으로 해시를 수행해 DB에 저장된 비밀번호와 비교하는 방식을 사용하기 때문입니다.

2. @Transactional 어노테이션

@Transactional은 데이터베이스 트랜잭션 관리 방법을 제공하는 어노테이션입니다. 메서드 단독으로 사용하거나 클래스 내 모든 public 메서드에 적용이 될 수 있습니다.
@Transactional이 붙은 메서드는 메서드를 실행할때 트랜잭션을 시작하고, 메서드가 정상적으로 종료되면 commit, 예외가 발생하면 트랜잭션을 rollback하게됩니다. 즉, 데이터의 일관성과 무결성을 지켜주는 역할을 한다고 볼 수 있습니다.
→ ‼️ Transaction 어노테이션을 사용할때 주의해야할 몇가지 사항이 있습니다.

1. 트랜잭션을 적용하려는 메서드는 반드시 public으로 선언되어야 합니다.
2. Checked Exception은 rollback 대상이 아닙니다.
3. 되도록이면 Service 계층에서 사용해야합니다.


또 하나의 문제 해결!

0개의 댓글