728x90

출처 : 인프런_따라하며 배우는 노드, 리액트 시리즈 — 기본 강의

 

소스 안의 비밀 정보를 보호해보자.

MONGO DB의 connection string 를 gitignore에 추가하여 github에 올라가지 않게 한다.

 

  • 두가지 개발환경을 따로 생각해야한다.

 

 

 

Step 1) config폴더 아래에 파일 생성

  • dev.js

  • prod.js

  • key.js

 

 

 

 

Step2) index.js 파일 수정

const config = require('./config/key');

추가하고

 

 

const mongoose = require('mongoose')
mongoose.connect(config.mongoURI,{
useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false
}).then(() => console.log('MongoDB Connected...'))
.catch(err => console.log(err))

에서 connect 함수의 첫번째 파라미터 값을 변경한다.

 

 

 

Step 3) Heroku 사이트 설정

Config Vars에 key는 MONGO_URI로 value는 connection string 으로 설정한다.

이후 ‘npm run start’로 실행하여 정상적으로 연결됨을 확인한다.

 

 

 

Step 4) dev.js 제외하고 git에 push 하기

.gitignore 에 dev.js를 추가하고

$ git commit -m "비밀 정보 보호"
$ git push origin main

으로 커밋과 푸시를 한다.

 

 

 

Step 5) Bcrpyt로 비밀번호 암호화하기

client가 입력한 비밀번호를 암호화한 뒤 DB에 저장해보자.

$ npm instll bcrypt --save

 

 

www.npmjs.com/package/bcrypt

 

bcrypt

A bcrypt library for NodeJS.

www.npmjs.com

 

에서 Technique1의 코드를 가져온다.

User.js에 아래와 같이 코드를 추가한다.

 

const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const saltRoudns = 10 //암호화하는데에 필요한 salt의 글자 수(길이)
const jwt = require('jsonwebtoken');
const userSchema = mongoose.Schema({
name:{
type: String,
maxLength: 50
},
email: {
type: String,
trim: true, //공백 없애줌
unique: 1
},
password: {
type: String,
maxLength: 50
},
lastname: {
type: String,
maxLength:50
},
role: {
type: Number,
default: 0
},
image: String,
token: { //유효성 관리
type: String
},
tokenExp: { //토큰 사용 가능한 유효기간
type: Number
}
})
//저장하기 전에 비밀번호를 암호화시킨다. index.js의 save 함수 실행 전에!
userSchema.pre('save', function(next){
var user = this;
if(user.isModified('password')){//비밀번호를 바꿀때만 암호화해야함. 이메일 바꿨는데 비밀번호가 암호화 되면 x
bcrypt.genSalt(saltRoudns, function(err,salt){
if(err) return next(err)
//user.password : client가 입력한 비밀번호
//hash : 암호화된 비밀번호
bcrypt.hash(user.password, salt, function(err, hash){
if(err) return next(err)
user.password = hash //해시된 비밀번호로 교체
next()
})
})
} else{ //다른거 바꿀때는 다음으로 넘어감
next()
}
})
//함수 정의
userSchema.methods.comparePassword = function(plainPassword, cb){ //cb : callback function
//암호화된 비밀번호 복호화 불가 -> plain password를 암호화해서 그 결과값 비교해봐야함
bcrypt.compare(plainPassword, this.password, function(err,isMatch){
if(err) return cb(err),
cb(null, isMatch)
})
}
userSchema.methods.generateToken = function(cb) {
var user = this;
//jsonwebtoken을 이용해서 token 생성하기
var token = jwt.sign(user._id, 'secretToken')
user.token - token
user.save(function(err,user){
if(err) return cb(err) //에러 발생시 콜백으로 에러 전달
cb(null, user) //에러 발생 안하면 err는 null이고 user 정보 전달
})
}
const User = mongoose.model('User', userSchema)
module.exports = {User} //이 스키마를 다른 파일에서도 쓸 수 있게 함

 

 

 

 

  • POSTMAN에서 다시 send 를 한 뒤 MongoDB에서 확인해보니 password가 암호화되어 저장된 것을 볼 수 있었다.

728x90

+ Recent posts