이번에는
우리의 Spring Boot 웹 애플리케이션에
Bcrypt PasswordEncoder를 구현하겠습니다
Bcrypt PasswordEncoder를 사용하기 위해서
우리가 새로운 섹션에 들어왔기 때문에
PasswordEncoder 관련
수정 사항 전부를 위해
이 섹션만을 다루는 별도의 Maven 프로젝트를
생성하겠습니다
그러기 위해서
이 springsecsection3 프로젝트를 복사하고
동일한 폴더 위치에 붙여넣은 다음
springsecsection4라고 이름을 바꾸겠습니다
pom.xml에도 똑같이 입력하겠습니다
여기 pom.xml을 열어보겠습니다
이 pom.xml 안에서는
artifactID와 name만을 업데이트하려고 합니다
그냥 이 3을 지우고 4로 바꿔서
springsecsection4라는 동일한 프로젝트 이름을
따르게 하겠습니다
이것들을 수정하면 pom.xml 측면에서는
다 됐습니다
이 수정 사항을 저장하고 pom.xml을 닫겠습니다
그 다음 이 타겟 폴더의
내용도 삭제할건데
이것들은 전부 이전 프로젝트인
섹션 3에서 컴파일된 클래스들이기 때문입니다
그러니 이것들을 사용하고 싶지 않아
백지에서 컴파일하고 싶습니다
이걸로 우리 워크스페이스에
이 프로젝트를 불러올 수 있을겁니다
이제 여기 있는 모든 클래스를 닫겠습니다
그 다음 File - New - Module from the Existing Sources
옵션을 선택합니다
여기서 springsecsection4 폴더 안에 존재하는
pom.xml을 선택하겠습니다
이것이 pom.xml입니다
열어보겠습니다
이로써 제가 생성한 새로운 Maven 프로젝트가
복사된 것을 볼 수 있습니다
저에게 보이는
이 Maven 탭을 클릭해보겠습니다
여기서 Reload All Maven projects 옵션을 선택합니다
이 옵션은 모든 Maven 의존성을 다운로드할겁니다
이제 저의 새 프로젝트인 springsecsection4에
다운로드가 완료되길 기다립니다
다운로드가 완료되면
이 springsecsection4 모듈에 우클릭하고
Build Module 옵션을 선택합니다
이건 제 프로젝트 전체를 컴파일할 것이고
빌드가 성공적이라면 우리가 생성한
이 새로운 프로젝트를 수정하기 시작할겁니다
우리가 불러온 이 신규 프로젝트를 열어보겠습니다
이 프로젝트에서는
우리가 지금까지 생성한 ProjectSecurityConfig
클래스를 열고 싶습니다
이 ProjectSecurityConfig 클래스 안에는
현재 주석 코드가 많은 것을 볼 수 있습니다
먼저 우리 코드가 깔끔해 보이도록
이 주석 코드를 삭제해봅시다
그러기 위해서
이 주석 코드를 전부 선택하고
이 코드를 삭제하고 있습니다
그 다음 NoOpPasswordEncoder와 관련된
이 코드도 삭제합니다
이로써 우리 코드는 간단하고 깔끔해 보입니다
여기서 보시다시피
현재 우리는 NoOpPasswordEncoder를 사용합니다
이 PasswordEncoder를 사용하면
우리의 모든 비밀번호는 Spring Security
프레임워크에 의해 일반 텍스트로 취급됩니다
하지만 우리가 얘기했던 것처럼 운영 애플리케이션에서는
Bcrypt PasswordEncoder와 같은
고급 PasswordEncoder를 사용해야 합니다
그러기 위해 우리가 할 수 있는 것은
NoOpPasswordEncoder의 자리에 단순히
BcryptPasswordEncoder의 새로운 객체를 생성하는 것입니다
이게 이 클래스에서 수정해야 할 유일한 사항입니다
이렇게 우리는 Spring Security 프레임워크에
우리 비밀번호를 검증하기 위해서는
Bcrypt 알고리즘을 사용해야 한다고
통신하고 있습니다
이것을 수정한 후 이 PasswordEncoder를
우리 웹 애플리케이션에 활용하기 시작해야 합니다
우리가 PasswordEncoder를
활용해야 할 가장 첫 지점은
등록 절차 도중입니다
왜냐하면 유저가 등록 절차에서
본인의 비밀번호를 입력할 때가
일반 텍스트 비밀번호를 해싱하고
데이터베이스에 저장해야 하는
첫 번째 지점이기 때문입니다
그러니 우리가 등록 절차를 위해 생성한
controller로 가봅시다
이 LoginController를 열어보면
보시다시피 이것은
우리가 등록 API를 REST서비스로
정의했던 클래스입니다
이 동일 클래스에
우리가 앞에서 생성한
PasswordEncoder bean을 삽입합니다
PasswordEncoder bean을
이 controller 클래스에 삽입하기 위해서는
Autowired 주석을 사용해야 합니다
그 다음 비밀번호 정보를 데이터베이스에
저장하기 직전에
해야 할 일은 엔드 유저가
입력한 비밀번호를 확실히 해싱하는 것입니다
그러기 위해 이 try 블록에서
어떻게 할 것이냐면
이 PasswordEncoder bean을 사용해
encode 메소드를 호출합니다
그리고 이 메소드에 저의 엔드 유저가 입력한
비밀번호를 전달합니다
이 값은 hashPwd라는 변수로 저장할 수 있습니다
이 hashPwd 값을 받으면
이것을 다시 customer 객체에 설정합니다
customer.setPwd를 사용하고 hashPwd를 설정합니다
이렇게 수정함으로써
우리 데이터베이스 내부의 해시값을 볼 수 있습니다
이 수정 사항을 저장하고 빌드하겠습니다
빌드가 끝나면
웹 애플리케이션을 시작할 수 있습니다
여기서 EasyBankBackendApplication 클래스에 들어가
이 Debug 옵션을 선택함으로써
웹 애플리케이션을 시작해보겠습니다
여러분의 웹 애플리케이션을 시작하기 전에
여러분의 MySQL 데이터베이스도 가동 중인 것을 확인하십시오
제 서버는 포트 8080에서 성공적으로 시작했습니다
신규 유저를 등록하게 해주는
이 REST APA를 호출하겠습니다
신규 유저를 등록하기 위해 Postman에 와서
HTTP POST 메소드로
/register API를 호출합니다
이것이 제가 전송하려는
요청인 게 보이십니까?
우리는 이미 sam@example.com 이메일을 가진 유저가 있습니다
그러니 이번에는
다른 이메일을 사용해보겠습니다
여기서 사용할 이메일은 john@example.com이고
비밀번호는 12345로 할 것이고
역할은 user로 기본 설정하겠습니다
이렇게 해서 이 Send 버튼을 클릭해
이것을 호출하면 주어진 유저 정보가
성공적으로 등록되었다는 응답을 받은 걸 볼 수 있습니다
이제 저의 해싱이 완벽하게
작동했는지 아닌지 검증하기 위해
데이터베이스로 가서 저의 비밀번호가 어떻게 저장되고 있는지 확인하겠습니다
여기 저의 Sqlectron에서
이 SELECT * FROM 'customer'
쿼리를 실행하려고 합니다
john@texample.com 고객에 대해서는
비밀번호가 현재 해시값으로 저장된 것을 볼수 있습니다
이것이 해시값입니다
첫 세 개의 철자를 보면
$2a인데 이것이 우리가 사용한 Bcrypt
버전을 알려줍니다
기본적으로 Spring Security는 이 버전을 사용합니다
다음 세 개의 철자는
여러분의 해싱 알고리즘에 설정한
작업량 변수 또는 라운드 수가
무엇인지 알려줍니다
기본적으로 저의 Spring Security는
해싱 과정에서 10을 작업량 변수
또는 라운드 수로 고려합니다
해커의 삶을 어렵게 만들려면
이 작업량 변수를 20이나
이 알고리즘에서 지원하는 가장 높은 값으로 증가시키면 됩니다
하지만 기본 값인 10으로도 괜찮을 겁니다
보이는 남은 값은
여러분이 입력한
비밀번호의 해시값입니다
이로써 우리는 Bcrypt 해싱 알고리즘의 도움으로
신규 유저를 성공적으로 등록했습니다
다음 강의에서는
Bcrypt PasswordEncoder의 도움을 받아
로그인 작업을 수행하겠습니다
전부 명확히 이해하셨으면 좋겠습니다
감사드리며 다음 강의에서 뵙겠습니다
수고하셨습니다