이 강의에서는
해싱이 무엇이고 이것을
비밀번호 관리에 고려할 수 있을지 알아보겠습니다
해싱에서 여러분의 데이터는
수학적 해싱 기능을 사용해 해시값으로 변환됩니다
그러므로 일반 텍스트 비밀번호에
해싱을 적용하면 이것은 비가역적입니다
따라서 누군가에게 해시값을 주면
그들이 해싱 과정에서 사용된
최초의 일반 텍스트 비밀번호를 알아내는 것은
매우 어렵거나 불가능합니다
비가역적이고
아무도 해시값을 아는 것만으로
일반 텍스트 비밀번호를 볼 수 없기에
해싱은 데이터베이스와 같은 저장소에 비밀번호를 저장하기 위한
업계 표준이 되었습니다
여기서 의문이 드실 수 있습니다
일반 텍스트 비밀번호로 되돌릴 수 없다면
로그인 작업에서 엔드 유저가 입력한
비밀번호를 어떻게 검증할까요?
이걸 위해서 해싱 내부에 옵션이 있습니다
유저가 입력한 일반 텍스트
비밀번호와 데이터베이스 안에 저장된
이미 해싱된 값을 비교하려고 할 때마다
이런 상황에서 우리는
엔드 유저가 입력한 비밀번호에
해싱 기능을 적용해야 합니다
그러면 여러분에게 두 개의 해시값이 있습니다
하나는 로그인 작업에서 유저가 입력한
비밀번호에 기반해 새로 생성된 해시값이고
두 번째 해시값은 여러분이
데이터베이스에 저장해둔 엔드 유저의
등록 과정에서 생성되었을 값입니다
이 두 개의 해시값이 있다면
이들을 비교할 수 있습니다
두 개가 일치한다면
그래야만 로그인 작업이 성공적이고
그렇지 않으면 실패입니다
즉 이 해싱은 해시값을
일반 텍스트 비밀번호로 되돌릴 수 없다는
이점이 있습니다
따라서 최초의 일반 텍스트 비밀번호를
아는 사람만이 저의 시스템에 접속할 수 있습니다
그래야만 새롭게 생성된 해시값과
이미 저장된 해시값이 일치하고
로그인이 실행될 것입니다
그렇지 않으면 저의 데이터베이스 관리자들이
해커들이고 데이터베이스 내부에
저장된 해시값을 볼 수 있더라도
저의 시스템에 접속할 수 없는데
일반 텍스트 비밀번호를 알지 못하기 때문입니다
여기서 여러분의 의문점이 많을 수 있으니
이게 작동하는 모습을 보여드리겠습니다
해싱이 작동하는 시범을 보여드리기 위해
Bcrypt-Generator.com이라는 웹사이트에 왔습니다
Bcrypt는 해싱 알고리즘입니다
여러분이 해싱을 개념으로 받아들인다면
Bcrypt는 구현체 또는 해싱 알고리즘이고
업계의 웹 애플리케이션 대부분이
사용하고 있습니다
그래서 이 Bcrypt 해싱 알고리즘을 가지고
해싱이 작동하는 방법을 보여드리려고 합니다
먼저 등록 절차 시나리오를
실행해보겠습니다
저의 엔드 유저처럼 생각해보면
유저는 저의 웹 애플리케이션에 등록하려 하고
이 과정에서 비밀번호를 입력합니다
비밀번호는 12345입니다
그래서 여기 12345를 입력하겠습니다
그리고 이 Encrypt 버튼을 클릭합니다
Encrypt라고 써있지만
우리가 암호화를 하고 있는 건 아닙니다
여기서의 encrypt는 해싱이라고 보시면 됩니다
여기에도 encrypted hash라고 언급해놨습니다
Encrypt는 우리가 문자열을 기밀 데이터로
변환하고자 할 때마다 사용할 수 있는 일반적인 용어입니다
그리고 여기서 보시다시피
기본 라운드 값은 12입니다
이 Bcrypt 알고리즘은 여러분이
해시값을 생성하기 위해서 이 알고리즘에 의해
몇 라운드를 고려할지도 수용합니다
이 라운드 값이 무엇인지는 추후 강의에서
Bcrypt Password Encoder를 다룰 때
이야기하겠습니다
일단은 값을 변경하지 않고
기본 값인 12로 가겠습니다
Encrypt를 클릭하자마자
해시값이 생성된 걸 볼 수 있습니다
이 해시값을 보기만 해서는
초기 텍스트 비밀번호가 뭔지 누구도 맞출 수 없습니다
해싱의 또 다른 이점은
동일한 일반 텍스트 비밀번호를 한 번 더 해싱하면
제 해시값의 다른 문자열 표현을
반환한다는 겁니다
지금 여러분이 보시는 문자열은 Bx6로 끝납니다
하지만 다시 해싱해보면
다른 해시를 얻었습니다
같은 걸 한 번 더 해보겠습니다
그래서 해싱을 시도할 때마다
같은 해시값을 반환하지 않습니다
하지만 내부적으로 이 문자열은 해시값을 가지기에
이 해시값은 항상 같습니다
이것이 또 하나의 이점입니다
이 이점이 없다면 무슨 일이 일어나냐면
12345와 같이 같은 비밀번호를 가진 사람들은
데이터베이스에 같은 해시 문자열을 저장할 것이고
이것은 또 보안 문제입니다
해커 본인의 비밀번호가 12345이고
해시 문자열을 알고 있다면
단순히 동일한 해시 문자열 값을 가지고 있는
데이터베이스를 쿼리할 수 있기 때문입니다
그래서 이런 시나리오를 방지하기 위해 해싱 알고리즘은
해싱을 반복해서
시도할 때마다 반드시
매번 다른 해시 문자열을 반환합니다
하지만 내부적으로 이 해싱 알고리즘들은
이 해시 문자열들이 내부적으로는 반드시
같은 해시값을 가지게 합니다
명확히 이해하셨으면 좋겠습니다
유저 등록은 성공적이었고
이 해시값은 데이터베이스 안에 저장했습니다
로그인 작업 도중에 일어날 일이 무엇이냐면
이 해시값을 가지고 복사해서
여기 Hash to Check 란에 입력하겠습니다
로그인 작업 도중에 일어날 일은
엔드 유저는 본인의 자격 증명을 입력해야 하고
해커가 등장했다고 해보면
hello라는 무작위 값을 입력하려 한다면
배경에서
이 로그인 작업이 해싱의
도움으로 실행되고 있을 때 먼저 이 hello는
특정 해시 문자열로 변환되고 내부적으로 Bcrypt 알고리즘은
이 두 개의 해시 문자열의 해시값이
일치하는지 아닌지 비교하려고 할 것입니다
아니라면 로그인 작업이 실패할 것입니다
여기 Check를 클릭하면
일치하지 않는 것을 명확히 보여줍니다
이번에는 유효한 비밀번호인
12345를 입력해보고
Check을 클릭하면 내부적으로
해싱 알고리즘은 이 12345에 대한
해시 문자열을 생성하고 이 해시 문자열과
12345에 생성된 새로운 해시값을
비교하려 할 겁니다
Check를 클릭하자마자
일치한다는 걸 볼 수 있습니다
Encrypt를 다시 클릭해
새로운 해시값을 받아도
이 값을 가져다 여기에 붙이면
기저의 해시값은 동일합니다
그래서 일치가 뜨는 것입니다
이로써 여러분이 아주 명확히 이해했다고 생각하고
여기서 명백한 승리자는 해싱입니다
단순히 비밀번호를 해싱하고
데이터베이스에 저장하기 위해
해싱 기술을 따를 수도 있고 어디에서도
일반 텍스트 비밀번호를 취급하지 않도록
로그인 작업에 해싱 기술을 활용할 수도 있습니다
이 인코딩, 암호화, 해싱을
시각적으로 표현해보면 어떻게 보일지
빠르게 보여드리겠습니다
보시다시피 첫 번째 작업은
인코딩과 디코딩이고 일반 텍스트 비밀번호에
인코딩을 적용하면 인코딩된 텍스트를 받습니다
하지만 안타깝게도 디코딩 작업을 적용함으로써
일반 텍스트 비밀번호를 손쉽게 돌려받을 수 있습니다
그렇기 때문에 비밀번호를 취급할 때는
인코딩과 디코딩이 절대 안 되는 것입니다
두 번째 작업으로 넘어와
암호화와 복호화입니다
이 시나리오에서
먼저 암호화 알고리즘과 비밀 키의 도움을 받아
일반 텍스트 비밀번호를
암호화된 텍스트로 암호화해야 합니다
그래서 누군가 예를 들어
로그인 작업 중에 비교를 위해
일반 텍스트 비밀번호가 무엇인지
알려고 한다면 복호화 절차를 따라야 하는데
이 복호화 절차에서는 동일한 알고리즘
동일한 비밀 키를 따라야 합니다
그래야만 일반 텍스트 비밀번호를 받을 수 있습니다
그러니 이 절차 또한
비밀번호 관리에 활용하면 안 되는데
암호화된 알고리즘과 비밀 키에
접근할 수 있는 누군가가 단순한 Java 프로그램을 작성해
손쉽게 비밀번호를 복호화할 수 있기 때문입니다
이로써 우리에게는 마지막 옵션인 해싱만 남았습니다
이 해싱 안에서 우리는 단순히
해싱 기능에게 일반 텍스트 비밀번호를 제공합니다
해싱 기능은 수학적 기능입니다
일반 텍스트 비밀번호를 이 해싱 기능에 적용하면
해시 텍스트를 출력 받는데
이 해시 텍스트는 내부적으로 해시값을 가집니다
이것을 일반 텍스트 패스워드로
되돌릴 수 없기 때문에
우리는 항상 유저가 입력한 비밀번호를
해시 문자열로 변환하고
이것을 저장소 내부에 이미 저장되어 있는
해시 문자열과 비교해야 합니다
두 개의 해시값이 같다면
그때만이 로그인 작업이 허용됩니다
해시값을 어떻게 생성하는지
어떻게 비교하는지 걱정하지 마십시오
이 모든 작업을 위해서 Spring Security 안에
비밀번호 인코더들이 있습니다
추후 강의에서 이들에 대해
심도 있게 다룰 것입니다
인코딩, 암호화, 해싱에 대해
그리고 우리가 비밀번호 관리에
해싱을 선택한 이유에 대해
명확히 이해하셔야 합니다
그럼 지금까지 다룬 내용을
잘 이해하셨을 거라고 생각합니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다