오늘은 회원가입 api와 관련하여 기존에 작성한 회원가입을 토대로, 패키지 구조를 컨트롤러를 이용하여 분리하고, 비밀번호 암호화까지를 추가적으로 구현한다.
그전에 기존 프로젝트를 기반으로 회원가입 api를 만들어야한다.

위에서 특정 상황에 res.status(StatusCodes)와 같이 상태코드를 출력하는데, 매번 번호를 외우고 하드코딩 하는것 보다는 해당 모듈을 사용하면 조금 더 직관적으로 상태코드를 사용할 수 있다.
npm install http-status-codes --saveconst {StatusCodes} = require('http-status-codes');
//...
// 404 에러
return res.status(StatusCodes.NOT_FOUND).json({message:" 회원가입에 살패했습니다."})app.js는 메인 라우터 역할을 하며, /routes 디렉터리의 users.js, books.js... 등등은 하위 라우터라고 한다.
그런데 지금 해당 파일들을 보면 라우터의 기능뿐만 아니라, 그외에 로직들도 모두 들어있는 것을 확인할 수 있다.
이렇게 되면 나중에 유지보수하기에 아주 어려울 수 있다.
즉, 라우터는 경로를 찾아주는 역할까지 하고, 이외에 콜백에서 수행되는 다른 기능들은 따로 관리하는게 좋다. 이때 사용하는 것이 컨트롤러라는 파일이다.
라우터가 로직까지 다~ 수행할 때 단점
1) 프로젝트 규모가 커질수록, 코드가 엄청 복잡
2) 가독성이 안좋음
3) 트러블 슈팅을 하기 어려움
=> 이걸 한마디로 유지보수가 어렵다라고 한다.
컨트롤러는 말 그대로 무언가를 조종하는 것으로 프로젝트에서는 매니저 역할을 하며, 해당 API기능을 관리하는 파일이다.
컨트롤러라는 단어에 맞게, 직접 하는게 아니라 누군가에게 일을 어떻게 시켜야할 지가 적혀있는 파일인것이다.
로직의 전체적인 흐름
라우터를 통해서 "사용자의 요청(req)이" 길(url)을 찾아오면 매니저(콜백함수)가 환영해줄것! -> 알바생(서비스)에게 일을 시키고, 결과물을 매니저에게 전달
=> 그러면 결과물을 사용자에게 res로 돌려줌
이전에 회원가입을 만들면서 한번쯤은 이런생각을 했을 것이다.
비밀번호를 DB에 바로 저장하는건가?라는 의문을 해소시켜줄 것을 지금 구현할 것이다.
node.js에서는 암호화를 위해서 crypto라는 내장 라이브러리를 가지고 있다. 이걸 통해 다음과 같이 hashPassword라는걸 만들어줄 수 있다.
const salt = crypto.randomBytes(64).toString('base64');
const hashPassword = crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('base64');
이렇게만 하면 비밀번호가 암호화가 되지만 문제가 있다.
1. 매번 hashpassword가 바뀐다.
2. 암호화만 되고 복호화를 할 수 없다.
다음과 같은 문제는 salt가 있는 이유이기도 한데, hashPassword를 만들때, salt가 어떤게 들어오는지에 따라 값이 바뀌는 것은 위의 코드를 통해 알 수 있다. 즉, password와 salt를 함께 저장하여 유저가 로그인 할 때마다 salt를 통해 변환한 값이 password와 같은지를 확인하는 방법으로 암호화할 수 있다.
회원가입 할때는 [email, hashPassword, salt]를 db에 저장해줄거고
로그인 할때는 email을 통해 salt를 가져와 암호화한 것을 db에 저장된 hashPassword와 비교하는걸 각 코드에 추가해줄 것이다.
password가 만들어지는 곳이기에 위와 같이 코드를 작성하고 만들어진 hashPassword와 salt를 db에 저장한다.

body에서 들어오는 email을 통해 db에 아이디가 있는지를 확인한 후, body.password를 db에서 가져온 salt로 변환하여 저장된 password와 비교한다.

update를 이용해서 회원가입과 마찬가지로 hashPassword와 salt를 수정한다.

