728x90
📌 암호화 하는 목적
패스워드를 암호화 없이 평문으로 저장을 한다면, 정보 유출 문제로 이어진다. 이러한 사항을 방지하기 위해 인코딩 된 패스워드를 데이터베이스에 저장하게 되는데, 이번 포스팅에서는 스프링 시큐리티의 PasswordEncoder를 이용하여 패스워드를 암호화(인코딩/디코딩) 하는 방법을 알아 볼 것이다.
📌 build.gradle dependencies 설정
implementation 'org.springframework.security:spring-security-crypto'
dependencies 가 추가되면 gradle refresh 하는 것을 습관화 하자 !
📌 사용할 import
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
📌 WebMvcConfig 설정하기
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
@Bean // IoC 대상 - 싱글톤 처리
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
📌 회원가입 하기 - 패스워드 암호화 적용
@Autowired
private PasswordEncoder passwordEncoder;
... 생략
@Transactional
public void createUser(SignUpFormDto dto) {
// 암호화 처리
User user = User.builder()
.username(dto.getUsername())
.password(passwordEncoder.encode(dto.getPassword()))
.fullname(dto.getFullname())
.build();
int result = userRepository.insert(user);
if(result != 1) {
throw new CustomRestfulException("회원 가입 실패",
HttpStatus.INTERNAL_SERVER_ERROR);
}
}
정의해둔 PasswordEncoder를 선언해준 후 의존성 주입을 해준다.
passwordEncoder 의 encode 메서드를 사용하여 사용자가 입력하는 패스워드 데이터를 암호화하는 단계를 지닌다.
📌 로그인 하기
@Service // IoC 대상 + 싱글톤으로 관리 됨
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public User readUser(SignInFormDto dto) {
User userEntity = userRepository.findByUsername(dto.getUsername());
if(userEntity == null) {
throw new CustomRestfulException("존재하지 않는 계정입니다", HttpStatus.BAD_REQUEST);
}
boolean isPwdMatched =
passwordEncoder.matches(dto.getPassword(),userEntity.getPassword());
if(isPwdMatched == false) {
throw new CustomRestfulException("비밀번호가 일치하지 않습니다", HttpStatus.BAD_REQUEST);
}
return userEntity;
}
}
암호화된 비밀번호 비교 하는 법
boolean matches(CharSequence rawPassword, String encodedPassword);
- 평문의 비밀번호와, 인코딩된 비밀번호가 서로 일치하는지 아닌지를 부울값으로 리턴
- true : 서로 일치
- false : 불일치
728x90
'Spring > Skill' 카테고리의 다른 글
[Spring Data MongoDB] UpdateResult 와 WriteResult의 차이 (0) | 2024.03.12 |
---|---|
[spring] OAuth2 네이버 인증하기 (0) | 2024.02.12 |
[Javascript] active 값 활성화하기 (0) | 2024.02.12 |
[spring] OAuth2 구글 인증하기 (0) | 2024.02.07 |
[Spring] OAuth2 카카오 인증하기 + kakao 이메일 인증 권한 받는 법 (1) | 2024.02.06 |