보안 수준 차이
| 항목 |
ShaPasswordEncoder |
BCryptPasswordEncoder |
| 사용 알고리즘 |
SHA-1, SHA-256 등 단순 해시 |
BCrypt (Blowfish 기반) |
| 설계 목적 |
빠른 해싱 |
느린 연산으로 보안성 강화 |
| 솔팅 방식 |
수동 솔팅 필요 |
내부적으로 랜덤 솔팅 자동 적용 |
| 반복 횟수 설정 |
가능 (SHA1로 여러 번 해시) |
가능 (work factor로 조절) |
| 현재 보안 평가 |
✅ 오래되었고 취약 가능성 존재 |
✅ 현재도 안전하다고 평가 |
- 간단히 정리하면 ShaPasswordEncoder는 속도 중심 설계이기 때문에 무차별 대입 공격(Brute-force)에 취약
- 반면 BcryptPasswordEncoder는 속도를 의도적으로 느리게 설계해 공격 방어에 유리
기술 구조의 차이
ShaPasswordEncoder
- MessageDigest 기반 단순 해시
- SHA-1, SHA-256 등이 알고리즘 선택 가능
- 예전 Spring Security 3.x 이하 버전에서 제공
- Spring Security 5.x 이상에서는 Deprecated
BCryptPasswordEncoder
- 내부적으로 랜덤 솔트 자동 생성
- 해시 결과가 매번 달라지므로 보안성이 높음
- 비밀번호 비교 시에도 알고리즘에 따라 자동 처리
- Spring Secuerity에서 표준으로 권장
ShaPasswordEncoder가 Deprecated된 이유
ShaPasswordEncoder는 단방향 해시지만, 솔트를 잘못 사용하거나 반복 횟수를 충분히 주지 않으면 사전 공격(dictionary attack)에 취약
- 예전에는 사용되었지만 지금은 보안 수준이 떨어지는 방식으로 평가됨
BCryptPasswordEncoder는 이를 보완하여 현재까지도 많이 사용되는 안전한 해싱 방식