Notice
Recent Posts
Link
Tags
- session
- string
- select
- 스프링부트
- ORM
- java
- 1차원 배열
- DI
- 스프링
- mysql
- 자바
- Django
- spring
- spring mvc
- join
- jpa
- @transactional
- AWS
- Git
- Docker
- SSL
- nginx
- 데이터베이스
- springboot
- PYTHON
- spring security 6
- 문자열
- 프로그래머스
- spring boot
- sql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Archives
개발하는 자몽
[Spring Security] BCryptPasswordEncoder 본문
BCryptPasswordEncoder는 BCrypt 해싱함수(BCrypt Hashing Function)를 사용해서 비밀번호를 암호화(encode)한다.
아래 코드는 값을 받아서 사용자를 생성한다. 이때 비밀번호는 BCryptPasswordEncoder를 사용하여 암호화하고 DB에 저장한다.
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
public SiteUser create(String username, String email, String password) {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
SiteUser user = SiteUser.builder()
.username(username)
.email(email)
.password(encoder.encode(password)) //암호화
.build();
userRepository.save(user);
return user;
}
}
BCryptPasswordEncoder 객체를 생성하여 암호화하고자 하는 비밀번호에 사용하면 된다. 하지만 위와 같이 객체를 직접 new로 생성하는 방식보다는 빈(bean)으로 등록해서 사용하는 것이 좋다. 암호화 방식이 변경되면 BCryptPasswordEncoder를 사용한 모든 코드를 찾아서 수정해야 하기 때문이다. 즉 유지보수 측면에서 좋지 않고, 설계 측면에서도 OOP를 고려하지 않았다고 볼 수 있다.
빈(bean)을 생성하는 방법은 @Configuration이 적용된 SecurityConfig에 @Bean 메서드를 생성하는 것이다. 아래와 같이 Security Config를 작성하자.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
...
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
PasswordEncoder는 BCryptPasswordEncoder의 인터페이스이다. 인터페이스로 빈을 등록해두면 암호화 방식이 바뀌더라도 return new 구현체(); 만 바꾸면 된다.
위와 같이 빈으로 등록하면 맨 처음에 작성한 코드를 아래와 같이 수정할 수 있다.
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder encoder; //BCryptPasswordEncoder DI
public SiteUser create(String username, String email, String password) {
SiteUser user = SiteUser.builder()
.username(username)
.email(email)
.password(encoder.encode(password)) //암호화 적용
.build();
userRepository.save(user);
return user;
}
}
참고
'Java > Spring' 카테고리의 다른 글
[Spring Security] GrantedAuthority, SimpleGrantedAuthority (0) | 2023.01.04 |
---|---|
[Spring Security] UserDetails, UserDetailsService (0) | 2023.01.03 |
[Spring Security] @EnableWebSecurity (0) | 2022.12.30 |
[JPA] Entity - 매핑 관계 (0) | 2022.12.22 |
[JPA] Hibernate의 데이터베이스 초기화 전략 (0) | 2022.12.21 |
Comments