이전 강의에서
PasswordEncoder 안에 존재하는
추상 메소드들에 대해 알아봤습니다
그래서 이번 강의에서는
Spring Security 프레임워크 안의
다양한 PasswordEncoder
구현 클래스들을 살펴보겠습니다
화면에서 보시다시피 가장 중요한
PasswordEncoder 6개를 강조해두었습니다
우리 웹 애플리케이션에서 이 중 무엇이든
사용할 수 있습니다
하지만 이것들 전부의 단점과 장점을
이해해야 합니다
이 중 하나를 우리 웹 애플리케이션에 선별하기 위해서입니다
또한 우리의 실제 프로젝트에서
운영 웹 애플리케이션에 동일한 클래스를
활용할 수 있습니다
PasswordEncoder의 첫 번째 구현체는
NoOpPasswordEncoder입니다
전에 보신 적이 있을 겁니다
이 NoOpPasswordEncoder에서는
해싱, 인코딩, 암호화의 개념이 없고
여러분의 비밀번호를 일반 텍스트로 취급할 겁니다
그렇기에 여러분의 운영 애플리케이션에
추천하는 PasswordEncoder가 아닙니다
데모 애플리케이션이나 우선순위가 낮은
비운영 환경
애플리케이션에만 사용하시고
실시간 운영 애플리케이션에는 사용하지 마시기 바랍니다
결국 NoOpPasswordEncoder를 사용할 수 없습니다
이제 두 번째 PasswordEncoder인
StandardPasswordEncoder로 가보겠습니다
이 StandardPasswordEncoder 또한
운영 앱에 추천하지 않습니다
왜 추천하지 않는지 살펴보겠습니다
그러기 위해
IDEA로 가보겠습니다
StandardPasswordEncoder를 열고 있습니다
여기를 보시면 이건 사용이 중단됐습니다
그래서 취소선 표시가 보이는 겁니다
그러니 이것을 열면
Spring Security 팀이 입력한
@Deprecated라는 주석이 있는데
이 PasswordEncoder를 추천하지 않는 이유는
그저 일반 텍스트 비밀번호를 암호화기 위해
암호화 알고리즘을 사용하는 레거시 애플리케이션을
지원하고자 이 PasswordEncoder를
구현한 것이기 때문입니다
Java 주석에도 명확히 있습니다
이 PasswordEncoder는 레거시 목적으로 제공될 뿐이며
안전하다고 여길 수 없습니다
StandardPasswordEncoder는
무작위 솔트값을 사용해 SHA-256
해싱 알고리즘을 구현합니다
또한 추가적인 보호를 제공하기 위해
시스템 전체 비밀 값을 사용합니다
따라서 이것은 명백히
암호화 절차를 지원하는 PasswordEncoder입니다
이는 Spring Security 프레임워크 안에서
오직 레거시 애플리케이션을 지원하기 위해 존재합니다
하지만 우리가 일상적으로 개발하는
신규 애플리케이션이나 새로운 세대의 애플리케이션에는
추천하지 않습니다
또한 이들은 새로운 시스템을 개발하고 있다면
BcryptPasswordEncoder를 고려해볼 것을 강조했습니다
보안 측면이나 다른 언어와의 상호 운영성 측면에서
더 나은 선택이라고 말입니다
이러한 이유로
StandardPasswordEncoder는
최신 웹 애플리케이션에는 안전하지 않으니
이것 또한 고려하지 않아야 합니다
세 번째 PasswordEncoder는
Pbkdf2PasswordEncoder입니다
이 PasswordEncoder도 운영 애플리케이션 내부에
사용하기를 추천하지 않지만
5~6년 전 쯤에 개발된 애플리케이션에서는
이 PasswordEncoder를 사용할 수도 있는데
그 때는 안전하게 여겨졌기에
이것을 사용하는 것일 수 있습니다
하지만 최근에는 CPU, GPU의 발전과 더불어
이것은 더 이상 안전하지 않습니다
어떤 해커가 그래픽 프로세싱 처리 장치 기계와 같이
많은 데이터와 명령을 처리할 수 있는
고성능 GPU 기계를 갖고 있다면
손쉽게 여러분의 해시값에 무차별 대입 공격을 가하고
일반 텍스트 비밀번호를 추측할 수 있습니다
무차별 대입 공격이 무엇인지는 조금 이따가
말씀드리겠습니다
잠시만 기다려주십시오
예컨대 어떤 해커가 강력한 GPU 기계를 갖고 있다면
이 PasswordEncoder는 약점이 있기 때문에
이것 또한 당연히 추천하지 않습니다
그러니 Spring Security 프레임워크 안에
있긴 하지만 고려해서는 안 됩니다
이로써
제가 왼쪽에 언급한 모든
비밀번호 인코더들은 운영 웹 애플리케이션에
고려해서는 안 됩니다
오른쪽에 제가 언급한 PasswordEncoder들은 모두
운영 웹 애플리케이션에 고려할 수 있습니다
BcryptPasswordEncoder
SCryptPasswordEncoder
그리고 Argon2PasswordEncoder입니다
하지만 이 중 하나를 고르기 전에
이들 간의 차이점은 무엇인지
왜 이들 중 하나를 골라야 하는지 살펴보겠습니다
해당 내용은 다음 강의에서 설명하겠습니다
이 강의에서는 무차별 대입 공격이
무엇인지 설명하겠습니다
오른편에 있는
모든 PasswordEncoder를 다룰
다음 강의에서 이 정보를
참고할 수 있도록 말입니다
무차별 대입 공격이 무엇인지 해커가 어떻게
해시 값에 기반해 일반 텍스트 비밀번호를 추측할 수 있는지
설명하기 위해
이 bcrypt-generator.com
웹사이트에 다시 왔습니다
어떤 실력이 뛰어나거나
특출난 해커가
웹 애플리케이션 서버에
해킹한 시나리오를 생각해보겠습니다
이 해커는 저의 웹 애플리케이션을 사용하는
엔드 유저들의 비밀번호와
유저 네임 정보를 전부 다운로드했습니다
해커가 가장 먼저 할 것은
특정 해시 값의 최초 텍스트를
추측 시도하는 일일 것입니다
그래서 각 레코드의
해시 값을 가져와
여러 자주 사용되는 비밀번호 또는
사전의 여러 단어를 시도해볼겁니다
그렇게 시간이 흐르면
만약 누군가가 취약한 비밀번호를 사용하고 있다면
해커는 해당 해시 값의 일반 텍스트를
쉽게 알아낼 수 있습니다
그러니 우리의 해커가
이 해시 값의 일반 텍스트 값을
알아내려 한다고 해보겠습니다
그래서 이 해커는 가장 많이 사용되는 비밀번호와
많이 사용되는 사전상의 단어들을 지속적으로
입력하는 프로그램을 작성하려고 할 겁니다
그래서 어느 시점에 비밀번호가 아주 취약하다면
최초 비밀번호를 손쉽게 알아낼 수 있는 겁니다
가장 많이 사용되는 비밀번호는 password입니다
그래서 해커는 이걸 입력합니다
Check 로직을 적용하니
일치하지 않습니다
그 다음 또 다른 유명한 비밀번호를 입력하는데
qwerty입니다
이것도 일치하지 않습니다
이런 식으로 해커는 계속할 겁니다
시간이 흐르고
12345 또한 가장 많이 사용되는 비밀번호이기에
일치라는 결과를 받았습니다
이제 이 유저에 대해 해커는 최초 텍스트
비밀번호를 적어둘 것입니다
이런 식으로 해커는 다양한 입력값을 시도해보고
주어진 해시 값의 최초 텍스트 비밀번호를
추측하려고 합니다
이런 종류의 공격을
무차별 대입 공격이라고 부릅니다
이런 작업을 하기 위해 이 해커는 당연히
많은 처리 능력과 메모리 능력을 필요로 하고
고성능 기계와 서버도 필요합니다
따라서 개발자로서 제가 할 수 있는 것은
해싱 로직을 지연시켜 이 해커의 삶을
어렵게 만드는 겁니다
해커의 삶을 어렵게 하려면 몇 가지 선택지가 있습니다
한 선택지는 저의 엔드 유저들이
5개, 6개 철자로 된 단순한 비밀번호를
선택하지 않도록 교육하는 것입니다
그리고 저의 등록 페이지 내부에 숫자 값만
알파 값만 또는 알파-숫자 값만
또는 8개 철자보다 짧은 비밀번호를 받지 않을 것
이라는 로직을 작성할 수 있습니다
이런 제한들을 통해
강력한 비밀번호를 갖도록 저의 엔드 유저에게
간접적으로 독려할 수 있습니다
이로써 해커는 많은 시도를 해야 하고
주어진 해시 값에 대한
일반 텍스트 비밀번호를 추측하는 것이
불가능합니다
우리는 유저 하나에 대해 얘기하고 있는데
해커가 수많은 유저들의 비밀번호를 다운 받는다면
이 엔드 유저들의 비밀번호를 모두 추측하려면
수년과 수만 달러가 필요할 것이라는 사실을
상상할 수 있습니다
이것이 하나의 선택지입니다
우리의 두 번째 선택지는
강력한 해싱 알고리즘을 사용하는 겁니다
Bcrypt 알고리즘이나 Scrypt 알고리즘
또는 해커의 CPU 또는 메모리 성능을 많이 잡아먹는
어떠한 해싱 알고리즘이면 됩니다
이것들이 우리가 고려할 수 있는 선택지입니다
이것에 기반해서 우리는 Spring Security
프레임워크의 강력한 PasswordEncoder 중
하나를 선택할 수 있습니다
무차별 대입 공격이 무엇인지
왜 우리가 NoOpPasswordEncoder, StandardPasswordEncoder
Pbkdf2PasswordEncoder와 같은 취약한 PasswordEncoder를
고려하지 않는지 명확히 이해하셨길 바랍니다
다음 강의에서는
Spring Security의 다른 PasswordEncoder들을
살펴보고 그 중 하나를
우리의 웹 애플리케이션에 최종화하겠습니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다