프로젝트를 진행하던 중.. MongoDB에 이렇게 사용자의 비밀번호가 뜨는 것을 발견했다.
이렇게 되면 보안상의 문제가 있을 수도 있고 개발하는 입장에서도 사용자의 비번이 DB쿼리 결과에 다 뜨는게 좀 거슬리니 보완해주기로 했다.
그러기 위해 Bcrypt를 사용해 비밀번호를 암호화 하여 데이터 베이스에 저장해 주기로 했다.

여기서 Bcrypt에 대해 잠깐 알고 넘어가면..
bcrypt(비크립트)
bcrypt 블로피시 암호에 기반을 둔 password-hash-function으로 레인보우 테이블 공격 방지를 위해 Salt를 통합한 적응형 함수의 하나라고 한다. 암호화의 종류에는 SHA 방식을 비롯한 여러가지가 있는데 그중에서 패스워드 암호화로 추천되어지는 것이 bcrypt였다.
이것은 SHA가 보안에 결함이 있어서 안전하지 않기 때문이 아니라, SHA는 일반적으로 GPU연산에 유리한 32비트 논리 및 산술 연산만 사용하기 때문에, 공격자가 빠른연산으로 공격할 수 있기 때문이다.
그렇다면 이제 bcrypt를 사용해보자.
나는 현재 node.js를 활용하여 프로젝트를 진행중이므로 간단하게 터미널 창에 다음과 같이 입력해주었다.
Node.js에서 Bcrypt 사용
출처 입력
1. bcrypt 모듈 설치
npm install bcrypt
2. bcrypt 모듈 요청
const bcrypt = require('bcrypt');
const saltRounds=10 //salt를 이용해서 비밀번호를 암호화 해야 함
const saltRounds=10 를 통해서 10자리의 솔트(salt)를 생성 하고 생성된 솔트(salt)로 비밀번호를 암호화한다.
3. bcrypt 사용
현재 mongoDB를 이용하고 있고 회원 가입에 있어 저장기능을 구현했었다. 그러나 bcrypt는 저장 전에 적용이 되어야 하고 비크립트 구현 전에 저장된 계정은 몽고디비 내에서 암호화가 자동으로 되지 않는다.
//user.js
userSchema.pre('save', function (next) {
var user = this;
if (user.isModified('password')) {
//비밀번호를 암호화 시킨다.
bcrypt.genSalt(saltRounds, function (err, salt) {
if (err) return next(err)
bcrypt.hash(user.password, salt, function (err, hash) {
if (err) return next(err)
user.password = hash
next()
})
})
} else {
next() // 암호화 실패이유 : 암호화 이후 새로 생성된 계정 한정 암호
}
})
원활하게 구현하기 위해서는 userSchema를 저장하기 전에 작업이 이루어져야 한다.
그 부분이 userSchema.pre('save', function (next) { 부분이다.
에러가 발생하면 바로 에러를 리턴하고 에러가 발생하지 않는다면(솔트를 생성했다면) bcrypt를 가져오고 비밀번호를 암호화 작업으로 이어진다.
암호화에 실패하면 마찬가지로 반환되고 성공했다면 유저의 비밀번호는 next()를 통해 넘어가 DB저장 전에 암호화된다.
이전 계정은 암호화 적용이 안되니 Postman으로 새로운 계정을 생성해주었고 mongoDB에서 그 내역을 확인해 보았다. 그 결과 DB내역에서 password 가 암호화 된 것이 확인되었음.

그리고 다시 기억하고 있던 패스워드로 로그인을 해보면

로그인이 정상적으로 수행되고 유저 아이디도 mongoDB와 일치함으로써 bcrypt가 비번에도 영향을 주지 않은채 암호화 된 것을 확인할 수 있다.