본문 바로가기
STUDY/NodeJS

비밀번호 해싱 처리를 위한 Mongoose 미들웨어 설정

by Y.Choi 2024. 3. 27.
728x90
반응형

 

로그인 및 사용자 인증을 안전하게 하기 위해 비밀번호를 암호화하고 검증하는데에는 bcrypt가 필요하다.

이를 Mongoose 미들웨어를 이용하여 더 간편하게 구현할 수 있다.

const mongoose = require('mongoose');
const bcrypt = require('bcrypt')

const saltRounds = 10;

//스키마 정의

const UserSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    },
    role: {
        type: Number,
        default: 0
    },
    token: {
        type: String
    },
    tokenExp: {
        type: Number
    },
    createdAt: {
        type: Date,
        default: Date.now,
    },
});

// 비밀번호 해싱 처리를 위한 Mongoose 미들웨어 설정
UserSchema.pre('save', async function(next){
    if(!this.isModified('password')) return next();
    try {
        const salt = await bcrypt.genSalt(saltRounds);
        const hash = await bcrypt.hash(this.password, salt);
        this.password = hash;
        next();
    } catch (err) {
        return next(err); 
    }
})

// 비교
UserSchema.methods.comparePassword = async function(candidatePassword){
    return await bcrypt.compare(candidatePassword, this.password)
}

// 모델 생성
const User = mongoose.model('User', UserSchema);

// 모듈 내보내기
module.exports = User;

 

 

 

/ 비밀번호 해싱

UserSchema.pre('save', async function(next)){ }

Mongoose의 미들웨어로서, 사용자 모델의 저장 작업이 실행되기 전에 실행되며 비밀번호 저장 전에 비밀번호를 해싱하여 저장하는 데 사용된다. 

 

● if(!this.isModified('password')) return next();

비밀번호가 변경되었는지 여부를 확인한다. 비밀번호가 변경된것이 아니라면 다음 미들웨어로 진행된다.

 

● bcrypt.genSalt(saltRounds) 비밀번호 해싱에 사용될 salt을 생성
● bcrypt.hash(this.password, salt) 생성된 salt를 사용하여 비밀번호를 해싱


-정리-

사용자가 새롭게 등록하거나 비밀번호를 수정했을 경우, isModified('password)가 true가 되어 새로운 비밀번호를 해싱해 저장하게 된다. 즉 try문이 실행되는 것인데, 비밀번호 변경일 경우에는 이미 해싱된 비밀번호가 있는 상태 이므로 salt를 다시 생성하지 않고 이미 해싱된 비밀번호를 새로운 해싱된 비밀번호로 대체된다.

 

 

 

/ 해싱된 비밀번호 비교

UserSchema.methods.comparePassword 

사용자 모델의 메서드로서, 주어진 비밀번호와 저장된 해시된 비밀번호를 비교해 로그인 또는 인증 과정에서 사용된다.

 

● bcrypt.compare(candidatePassword, this.password)

저장된 해시된 비밀번호와 주어진 후보 비밀번호를 비교하여 일치 여부를 확인한다.
일치하는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환한다.

 

사용자가 새로운 비밀번호를 설정하거나 기존 비밀번호를 변경할 때마다 호출된다. 이때 사용자가 제공한 비밀번호를 해싱하여 안전하게 저장할 수 있고 데이터베이스에 저장된 비밀번호가 실제로 사용자가 입력한 비밀번호와 일치하는지 검증할 수 있다.

728x90
반응형