이제 우리에게는 운영 웹 애플리케이션에
고려할 수 있는 세 개의 PasswordEncoder가 남았습니다
이 세 개의 PasswordEncoder들은 각기 장점이 있습니다
하나씩 설명해보겠습니다
이들이 제공하는 이점은 무엇일까요?
이것에 따라서 그 중 하나를 우리 웹 애플리케이션에
선택할 수 있습니다
Spring Security 프레임워크 안의
첫 번째 강력한 PasswordEncoder는
BCryptPasswordEncoder입니다
이름이 보여주듯이
이것은 1999년에 발명된
BCrypt 해싱 알고리즘을 사용합니다
지난 20년 동안
이 BCrypt 해싱 알고리즘은
광범위하게 사용되며
컴퓨터 내부에서 일어나는 최신 발전에 따라
주기적으로 업데이트됩니다
그러니 BCryptPasswordEncoder의 도움으로
일반 텍스트값을 해싱하거나
matches 메소드를 실행하려고 하면
이것은 CPU 연산을 요청합니다
즉 밀리초 안에 실행할 수 있는
쉬운 Java 코드가 아니라는 뜻입니다
여러분이 BCryptPasswordEncoder에 설정한
작업량 또는 라운드 수에 따라
이 해싱 알고리즘이 사용하는
CPU 연산은 더 많아집니다
즉 우리가 BCryptPasswordEncoder의 도움으로
비밀번호를 해싱한 경우
어떤 해커가 무차별 대입 공격을 하려고
제 비밀번호를 입수했다면 이 해커는
해당 미션에 많은 연산 능력을 필요로 할 겁니다
즉 주어진 해싱 비밀번호에 무차별 대입 공격을
가하기 위해서는 고성능 서브
고성능 CPU 기계와 이것들을 작동시킬
많은 전력과 많은 시간이 필요하다는 것입니다
그렇기 때문에 BCryptPasswordEncoder를
우리 운영 웹 애플리케이션에
안전하게 사용할 수 있는 겁니다
해커 미션에 많은 연산 능력을 요구하기 때문입니다
다음 PasswordEncoder는
SCryptPasswordEncoder입니다
이 SCryptPasswordEncoder는
BCryptPasswordEncoder의 고급 버전입니다
SCryptPasswordEncoder는 누군가
이 알고리즘의 해싱 기능 또는
matches 기능을 사용하고자 할 때 두 개의 인자를
요구하기 때문입니다
첫 번째 인자는 BCryptPasswordEncoder에서
다루었던 연산 능력입니다
해커로부터 요구하는 두 번째 인자는
메모리입니다
이 알고리즘은 우리가 적용한 설정에 따라
고의적으로 일부 메모리 할당을 요구합니다
따라서 우리의 해커는 연산 능력과
본인 RAM 내부의 메모리를 제공해야 합니다
이건 해커의 삶을 더 어렵게 만들것입니다
그래서 SCrypt가 우리 운영 웹 애플리케이션에 고려할 수 있는
또 다른 PasswordEncoder인 겁니다
마지막 PasswordEncoder는
Argon2PasswordEncoder입니다
이것은 심지어 더 최신인 해싱 알고리즘인데
세 가지 측면이 있습니다
첫 번째는 BCrypt와
SCrypt에서 사용되는 연산 능력입니다
두 번째 자원 또는 두 번째 측면은 메모리인데
우리는 이것도 ScryptPasswordEncoder에서 봤습니다
해커에게 요구하는 세 번째 인자 또는
세 번째 자원은 다중 스레드입니다
누군가 이 Argon2PasswordEncoder 또는
Argon2 해싱 알고리즘을 이용하려고 한다면
우리의 해커든 어떤 코드든
이 세 가지 자원을 할당해야 합니다
하나는 연산 두 번째는 메모리
세 번째는 다수의 스레드
또는 다중 CPU 코어입니다
이 모든 걸로 인해 우리가 Argon2 해싱 알고리즘을 사용할 때
무차별 대입 공격이 사실상 불가능한 것입니다
Argon2PasswordEncoder 또한 여러분의
운영 웹 애플리케이션을 위한
좋은 선택지인 이유이기도 합니다
하지만 여기서 여러분은
Argon2PasswordEncoder가 가장 강력하기 때문에
이것을 사용하는 것에 끌릴 수도 있습니다
왜냐하면 가장 최신의 해싱 알고리즘이며
화려해 보이고
설명도 굉장히 좋아 보입니다
하지만 이 생각에 너무 몰입하지는 마시기 바랍니다
왜냐하면 해커로부터 시간을 더 빼앗는다는 것은
여러분의 웹 애플리케이션에서도
꽤 많은 시간을 빼앗는다는 뜻이기 때문입니다
여러분의 엔드 유저가
여러분의 웹 애플리케이션에 등록하면
여러분은 비밀번호를 해싱할 것이고
여러분의 웹 애플리케이션에서도
비밀번호를 해싱할 때마다
연산 능력, 메모리, 다중 스레드라는
세 가지 자원을 제공해야 합니다
로그인 작업에서 여러분이
matches 메소드를 사용할 때도 마찬가지입니다
이 Argon2와 SCryptPassowrdEncoder가
여러분의 코드와 작동 중인 서버로부터
많은 자원을 요구하기에
로그인 작업이나 등록 절차 도중
성능 문제가 분명히 있을 겁니다
이러한 성능 문제로 인해
여러분이 가장 일반적으로 보게 될 PassowrdEncoder는
BCryptPasswordEncoder입니다
여러분의 웹 애플리케이션이
엔드 유저에게 숫자
알파-숫자값 특수문자를 조합했으며
8개 이상의 철자로 된
강력한 비밀번호를
독려하는 어떤 유효성 검사를 갖추고 있다면
여러분은 괜찮을 것이고 어떠한 해커도
무차별 대입 공격을 가하지 못할 것입니다
실질적으로 불가능하고 그 해커의 입장에서
많은 연산 능력을 필요로 하기 때문입니다
오늘날 기준 우리에게는 그 정도로 발달한
CPU나 GPU가 없습니다
어쩌면 10년 후 쯤에
BCryptPasswordEncoder가 침해되고
Spring Security 팀이 이 PasswordEncoder를 사용 중단할 수도 있을 것입니다
지금으로써는 알 수 없지만 일단 여러분은 Bcrypt, Scrypt 또는
Argon2 PasswordEncoder 중 무엇이든 사용할 수 있습니다
하지만 저의 개인적인 추천은
BCryptPasswordEncoder를 사용하는 것인데
여러분의 웹 애플리케이션에서 성능 문제를 피하기 위함입니다
이걸로 여러분이 BCryptPasswordEncoder를 사용하도록
설득되었길 바랍니다
우리가 지금까지 만든 웹 애플리케이션 내부에서
일반 텍스트 비밀번호를 사용하지 않기 위해 이 인코더를
우리 웹 애플리케이션에서 활용해봅시다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다