비밀번호는 평문이나 복호화 가능한 형태로 저장하면 안 되고, bcrypt, scrypt, Argon2처럼 비밀번호 저장에 적합한 단방향 해시 알고리즘을 사용해야 합니다.
단순히 SHA-256 같은 고속 해시를 사용하는 것도 적절하지 않습니다. 비밀번호 해시는 무차별 대입 공격의 비용을 높이기 위해 의도적으로 계산 속도가 느려야 하기 때문입니다.
또한 사용자마다 고유한 salt를 적용하여 동일한 비밀번호도 서로 다른 해시값이 생성되도록 해야 합니다. Spring Security에서는 PasswordEncoder를 통해 이를 구현할 수 있으며, 일반적으로 BCryptPasswordEncoder 등을 사용합니다. 로그인할 때는 비밀번호를 복호화하지 않고, 입력받은 비밀번호와 저장된 해시를 matches()로 비교합니다.

레인보우 테이블

  • 원본-다이제스트 쌍을 미리 계산하여 여러개 저장해둔 테이블

솔트

  • 비밀번호에 랜덤한 값을 더한 후 해싱

키 스트레칭

  • 해싱의 연산속도를 의도적으로 느리게 만들기

Spring 표준은 BCrypt이다. (확인필요)
해싱 + 솔트 + 키 스트레칭을 지원하는 BCrypt를 주로 사용한다.