티스토리 뷰
기존 프로젝트에서는 로그인 할 때 평문 문자열을 그대로 DB에 저장을 했다. 프로젝틑가 끝나고 다른 조 발표하는걸 보는데 DB암호화를 쓴 조가 있었다! 저 암호화 어떻게 처리를 하는걸까 궁금했는데 스프링 시큐리티에 비밀번호 암호화를 해주는 클래스가 따로 있었다.
1. BCryptPasswordEncoder?
스프링 시큐리티(Spring Seurity) 프레임워크에서 제공하는 클래스 중 하나로 비밀번호를 암호화하는 데 사용할 수 있는 메서드를 가진 클래스
쉽게말해 비밀번호를 암호화(해시)해주는 클래스
보통 암호화를 위해 사용하는 해시함수에는 SHA, MD5가 있는데 내가 사용한 BCrypt는 해싱을 하고 salt를 부여해 여러번 암호화를 시켜준다고한다. salt를 해주기 때문에 좀 더 안전하게 암호화 할 수 있다.
BCrypt의 또 다른 특징 중 하나는 같은 비밀번호를 암호화 해도 다른 hash값이 도출된다는건데 리팩토링 하면서 입력값과 해싱된 비밀번호를 logger로 찍어봤는데 다른 값들이 나오는걸 보고 찾아보다가 이런 특징이 있다는걸 알게 됐다.
그래서 BCrypt를 사용해서 로그인을 수행하려면 matches() 메소드를 사용해 현재 입력한 비밀번호와 db에 저장된 암호화된 비밀번호가 동일한 데이터인지 일치 여부를 확인해주어야 한다.
2. BCryptPasswordEncoder 메소드 구성
1) encode( )
- 패스워드를 암호화 해주는 메소드
- SHA-1, 8바이트로 결합된 해쉬, 랜덤하게 생성된 솔트(salt)를 지원한다.
- 매개변수는 java.lang.CharSequence타입의 데이터, String타입으로 반환해준다.
2) matches( )
- 입력된 문자열과 db에 저장되어있는 암호화된 문자열이 일치한지 확인해주는 메소드
- 반환타입은 boolean
- matches("평문 문자열","암호화된 문자열")
3) upgradeEncoding
- 더 나은 보안을 위해서 인코딩된 암호를 또다 인코딩을 해줄 때 사용하는 메소드
- 반환타입은 boolean
- 기본적으로 encode()를 통해 인코딩된 암호는 false로 반환된다.
📌 기본적으로 @Autowired BCryptPasswordEncoder bCryptPasswordEncoder 해줘야한다.
// encode()
@Override
public void join(Users users) {
String endcodedPassword = bCryptPasswordEncoder.encode(users.getUserPw());
logger.info("암호화 비밀번호 : " + endcodedPassword);
users.setUserPw(endcodedPassword);
usersDao.insertUsers(users);
}
//암호화한 비밀번호 매치
// matches("로그인시 입력하는 비밀번호", "db에 암호화 저장된 비밀번호")
if(bCryptPasswordEncoder.matches(users.getUserPw(),info.getUserPw())) {
logger.info("평문 암호? : " + users.getUserPw());
logger.info("암호화 비번? : "+ info.getUserPw());
...
}
BCryptPasswordEncoder (spring-security-docs 6.1.5 API)
Returns true if the encoded password should be encoded again for better security, else false.
docs.spring.io
'프로젝트 > finalproject' 카테고리의 다른 글
[파이널프로젝트] 파일을 업로드하면 데이터를 못읽어오는 문제 (0) | 2023.12.05 |
---|---|
No bean named 'springSecurityFilterChain' available (0) | 2023.10.23 |
spring 회원가입 구현 2 - 이메일 인증 (0) | 2023.06.23 |
spring 회원가입 구현 1 - jsp에서 입력값 받기. (0) | 2023.06.23 |
<input type=hidden> (0) | 2023.06.08 |