ㅇ PasswordEncoder의 역할을 알아보자.
데이터베이스에는 비밀번호가 절때로 그냥 문자열로 저장되면 로그에서나, 다른부분에서 유출이 발생할 수 있어서, 절대 그렇게 저장해서는 안된다. DB에 항상 저장할땐 비밀번호를 인코딩해서 저장을 해야한다. Spring security 프레임워크 내에 어디서 비밀번호 검증이 일어날까? DaoAuthenticationProvider에서 실질적인 검증이 일어난다.
authenticate() 에서 유저정보를 불러오고, PreAuthenticationCheck에서 만료되었는지 검증하고, additionalAuthenticationChecks() 에서 인증객체를 받고 거기에 입력받은 비밀번호정보를 PsswordEncoder.matches() 로 인코딩한 입력받은 비밀번호와 DB의 비밀번호를 비교해서 맞는지 확인한다.
ㅇ 인코딩, 암호화, 해싱
인코딩 - 우리의 데이터를 한형식에서 다른형식으로 바꾸는것. 디코딩하기쉬워서 비추.
암호화 - 데이터를 암호화할때 특정 알고리즘을 사용하고 이 알고리즘에 비밀키를 제공한다. 암호화한 데이터가 궁금하다면 암호화의 반댕니 복호화를 해야함. 특정알고리즘과 비밀키를 가지고 한다. 그래서 알고리즘과 비밀키는 환경변수로 지정함. 비밀키나 알고리즘이 보안에 취약할 수 있어 비추.
해싱 - 데이터가 해싱기능을 통해 해시값으로 변함. 해싱하면 원래 비밀번호를 알아내기는 엄청 힘들다. 그래서 보안으로는 최고다. 원래 비밀번호를알아내기힘든데 어떻게 쓰일까? 입력받은 비밀번호를 해싱해서 비교하
는 것이다.
12345를 해싱해보자.
다시 해싱해보면 다른 해시값을 얻는다. 하지만 내부적으론 같다는것이다.
Decrypted 해서 보면 두개의 해시값 모두 12345가 맞다.
ㅇ 코드로 해싱을해보자
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
해싱알고리즘 기반의 BCryptPasswordEncoder를 사용해서
@Autowired
private PasswordEncoder passwordEncoder;
public void createUser(String username, String rawPassword) {
String encodedPassword = passwordEncoder.encode(rawPassword);
}
패스워드를 DB에저장할땐 .encode 해서(해싱해서) 저장한다.
ㅇ 저 PasswordEncoder 는 이렇게 생겼다.
encode()는 유저가 입력한 순수문자열의 비밀번호를 해싱하는 메서드고, matches()는 첫번째 파라미터인 유저가 입력한 문자열 비밀번호와 두번째 파라미터인 데이터베이스에 저장된 비밀번호(loadUserByUsername으로 불러온)를 비교하는 메서드이다. 입력한비밀번호가 맞다면 true 반환. upgradeEncoding()은 보안을 더 강화하고자 할때 두번 해싱하는것이다. true는 더욱 강화됐다는 뜻.
ㅇ 이 PasswordEncoder 인터페이스를 구현한 클래스들은 뭐가 있을까?
종류는 많으니 몇개만 보자.
BCryptPasswordEncoder - 위에 예시에서 사용함. BCrypt 해싱 알고리즘을 사용하며 많이 사용된다.
SCryptPasswordEncoder - BCryptPasswordEncoder의 고급버전. 메모리 강도(memory intensity)가 높은 작업을 추가적으로 요구해 대규모의 공격에 대한 저항력이 더 높다.
Argon2PasswordEncoder - SCryptPasswordEncoder처럼 메모리를 추가로 요구하고 다중 스레드를 요구한다.
Argon2PasswordEncoder이 제일 보안이 강력하다고 무작정쓰는것은 우리의 애플리케이션의 성능을 떨어뜨릴수도있다. 그러니 목적에 알맞게 사용하자.
'Java > spring' 카테고리의 다른 글
spring security를 알아보자 - 9 (1) | 2024.04.02 |
---|---|
spring security를 알아보자 - 8 (0) | 2024.03.29 |
spring security를 알아보자 - 6 (0) | 2024.03.25 |
spring security를 알아보자 - 5 (0) | 2024.03.21 |
spring security를 알아보자 - 4 (0) | 2024.03.18 |