Spring Security의 로그인 과정 요약
- 사용자가 로그인 폼에 ID / 비밀번호 입력
- Security가 내부적으로
UserDetailsService
를 통해 해당 ID의 유저 정보를 DB에서 조회
- 조회된 비밀번호(
DB에 저장된 암호화된 비밀번호
)와 사용자가 입력한 비밀번호를PasswordEncoder.matches()
로 비교
- 비교 결과가 일치하면
SecurityContext
에 인증된 사용자로 등록
문제의 원인
matches()
는 "암호화된 비밀번호"와 "입력된 비밀번호"를 비교하는데,저장된 비밀번호가 암호화되지 않은문자열
이라면 무조건 비교 실패
// 잘못된 회원가입 코드: 암호화 없이 저장됨
userRepository.save(username, password, email); // password는 String
- 이로 인해 로그인 시 인증 객체(SecurityContext)가 생성되지 않고
- Spring Security는 사용자를 비인증 상태로 간주해
/main
접근을 차단함
해결 방법: 비밀번호를 암호화해서 저장해야 함
BCryptPasswordEncoder.encode()
를 사용해 DB에 저장되는 비밀번호를 반드시 암호화해야 함
public void 회원가입(String username, String password, String email) {
String encPassword = bCryptPasswordEncoder.encode(password); // ✅ 비밀번호 암호화
userRepository.save(username, encPassword, email); // ✅ 암호화된 값 저장
}
- 로그인 시 입력한 비밀번호는 내부적으로 동일한 방식으로 암호화되어 비교되기 때문에
- 일치 시 인증 객체 생성 성공 →
/main
접근 가능
Share article