[12.11] 설계한 API를 구현해보자(회원가입,로그인)😀
node.js 패키지(파일) 구조는 아래와 같다.
app.js : 프로젝트의 메인 라우터 역할
/user.js : 하위 라우터 역할
....
...
이런 식으로 라우터는 경로를 찾아주는 역할을 한다.
근데 지금까지 프로젝트는 router와 연결하여 로직을 짰었다.
그렇게 되면 라우터가 로직까지 다~ 수행을 하기 때문에 코드가 복잡해지고 가독성이 떨어져서 유지보수에 어려움이 있다.
그래서 오늘부턴 좀 다르게 해보려고 한다!
UserController 라는 js 파일을 새로 생성하고 controller 라는 폴더안에 넣어서 사용할 것이다.
UserController 파일에 실질적인 로직이 들어가는 것이다. 이렇게 되면 지난 번의 프로젝트와는 다르게
라우터가 로직까지 수행하지 않아도 되고 경로만 찾아주기 때문에 관리에도 굉장히 편리하다는 장점이 있다.
💥 회원가입 API
회원가입 API 는 이전과 조금 다르게 만들었다. 바로 암호화를 사용한다는 것인데
Node.js에 있는 기본 모듈 중 하나인 crypto 를 사용하였다.
crypto 는 단방향이기 때문에 암호화는 가능하지만 복호화가 불가능한 단점이 있기 때문에 따로 DB에 저장해야했다.
const salt = crypto.randomBytes(10).toString('base64');
const hashPassword = crypto.pbkdf2Sync(password, salt, 10000, 10, 'sha512').toString('base64');
이렇게 회원가입 시 입력한 비밀번호를 암호화해서 비밀번호와 salt 값을 같이 DB에 저장하는 것이다.
POSTMAN 으로 확인하면 더 편리하게 확인이 가능하다.
email과 password로 회원가입을 하였고, 201 Created와 affectedRows:1 을 확인하였다면
워크벤치에서 값이 잘 들어갔는 지 확인해보겠다.
사용자는 5555 라는 비밀번호로 가입했지만 데이터베이스에는 암호화된 값으로 저장된 것을 확인할 수 있다.
그럼, 로그인은 어떻게 할까?
💥 로그인 API
로그인에서도 역시 crypto를 사용했다.
const loginUser = results[0];
const hashPassword = crypto.pbkdf2Sync(password, loginUser.salt, 10000, 10, 'sha512').toString('base64');
if(loginUser && loginUser.password == hashPassword){
이렇게 hashPassword 라는 변수에 salt값을 꺼내서 사용자가 입력한 비밀번호를 암호화 해보고 그 이후에 DB 비밀번호와 비교할 수 있는 로직을 짰다.
loginUser의 password와 암호화된 패스워드인 hashPassword가 같다면~ 이라는 if 문을 사용하였다.
그럼 이렇게 POSTMAN에서도 로그인이 잘 되는 걸 볼 수 있다.
