ballqs 님의 블로그
[Spring] PasswordEncoder 암호화 및 bcrypt 암호화 본문
PasswordEncoder 암호화
현재 듣고 있는 강의에서는 이러한 내용을 가르쳐 주었다.
implementation 'org.springframework.boot:spring-boot-starter-security'
security DI를 추가하고
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
// Hash 함수 비밀번호를 암호화해줌
// 해당 메서드를 사용해서 비밀번호를 encoding하는 것
return new BCryptPasswordEncoder();
}
}
PasswordEncoder를 수동적으로 bean등록하여 사용 하는 방식이다.
내부에는 어떤 것들이 있는지 살펴보면 encode , matches 등 비밀번호 암호화 및 비교작업하는 것들이다.
bcrypt 암호화
bcrypt는 패스워드를 해싱할 때 내부적으로 랜덤 한 salt를 생성하기 때문에 같은 문자열에 대해서 매번 다른 해싱 결과를 반환한다. 또한 해시 값 내부에 salt 값이 포함되기 때문에 salt 값을 따로 저장하지 않아도 해싱된 값과 평문을 비교할 수 있다는 특징이 있다.
사용방법
DI 추가
implementation 'at.favre.lib:bcrypt:0.10.2'
Component 작성
@Component
public class BCryptEncryptor {
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;
}
}
적용 사례
public UserSignupDto createUser(UserInsertDto userInsertDto , HttpServletResponse res) {
String name = userInsertDto.getName();
String email = userInsertDto.getEmail();
Optional<User> checkUserName = userRepository.findByName(name);
if (checkUserName.isPresent()) {
throw new IllegalArgumentException("중복된 사용자가 존재합니다.");
}
Optional<User> checkUserEmail = userRepository.findByEmail(email);
if (checkUserEmail.isPresent()) {
throw new IllegalArgumentException("중복된 Email입니다.");
}
// 비밀번호 암호화
String pw = bCryptEncryptor.encode(userInsertDto.getPw());
User user = new User(name , email , pw);
// JWT 생성 및 헤더에 저장 후 Response 객체에 추가
String token = jwtUtil.createToken(name);
// jwtUtil.addJwtToHeader(token , res);
return new UserSignupDto(userRepository.save(user) , token);
}
적용하기 전까지는 pw에 값이 없으나 적용 후 들어간 값을 보면 암호화로 되어 있다.
참조 GitHub
'코딩 공부 > Spring' 카테고리의 다른 글
[Spring] Test 코드 작성(stub , mock) (0) | 2024.08.28 |
---|---|
[Spring] JPA Save() vs SaveAll() vs Bulk Insert (0) | 2024.08.26 |
[Spring] Naver Open API 사용방법 (0) | 2024.08.20 |
[Spring] JWT(Json Web Tokens)란? (0) | 2024.08.19 |
[Spring] JPA(Java Persistence API)란? (0) | 2024.08.14 |