회원가입과 로그인, 사용자 인증 미들웨어를 구현했다. 여기까지는 지난 번 프로젝트랑 큰 차이가 없어서 발전된 기능을 추가하고 싶었다.
비밀번호를 입력한 그대로 DB에 저장하는 것은 의미가 없기에 비밀번호 암호화를 하기로 했다. bcrpyt
모듈을 사용해본 팀원들이 있어서 당연히 bcrypt를 먼저 찾아보다가 node.js 내장 모듈 중 crypto
라는 게 있는 것을 알게 됐다.
bcrypt와 crypto 모두 해시 함수를 활용한 암호화 기능을 제공한다.
다만 crypto는 암호화 알고리즘을 묶어놓은 모듈이고 bcrypt는 해시 알고리즘만 제공한다는 것에 차이가 있다.
bcrypt는 강력한 보안을 제공하지만 해싱이 느리고 비용이 많이 드는 Blowfish 알고리즘으로 구현이 되었다고 한다.
둘 다 사용해보지 않았기 때문에 어떤 걸 써도 의미 있겠다 싶었다.
이번에는 crypto 모듈로 구현을 해보기로 했다.
crypto 모듈로 회원가입을 구현할 때 흥미로웠던 것은 DB에 salt
라는 컬럼을 추가해야 한다는 점이었다.
해싱 알고리즘의 특징은 같은 값을 넣으면 항상 같은 값으로 암호화된다는 것이데,
암호화를 해도 만약 다른 유저가 같은 비밀번호로 회원가입을 하면 같은 문자열을 가지게 된다는 문제점이 있다.
이런 문제점 때문에 salt라는 일종의 랜덤한 수를 더해줘서 보안을 강화하는 것이라고 볼 수 있다.
(어떤 블로거는 음식에 살짝 간을 치는 것과 같다고 표현했다. 이해하기 쉬운 비유인 것 같다.)
salt의 데이터 타입을 어떻게 해야 되나 고민이었는데, stackOverflow에서 binary로 지정하라는 답변을 봤다. sequelize로 지정해보니 안돼서 string으로 했더니 우선은 작동했다.
하나 더 중요한 것은 salt 컬럼을 추가해서 값을 DB에 저장해야만 로그인을 할 때 salt를 불러와서 입력된 비밀번호와 DB에 저장된 비밀번호가 같은지 비교를 할 수 있다는 점이다.
여차저차 구현하긴 했는데 과연 나중에 문제가 안 생길까...? 프로젝트 진행 중이라 추후에 발생한 문제에 대해서는 또 기록해나가야겠다.