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 사이트 설정
- Heroku : 헤로쿠(Heroku)는 웹 애플리케이션 배치 모델로 사용되는 여러 프로그래밍 언어를 지원하는 클라우드 PaaS이다. 최초의 클라우드 플랫폼들 가운데 하나인 헤로쿠는 2007년 6월 개발이 시작되었고 당시에는 루비 프로그래밍 언어만 지원하였으나 지금은 자바, Node.js, 스칼라, 클로저, 파이썬, PHP, 고를 지원한다. (출처 : https://ko.wikipedia.org/wiki/%ED%97%A4%EB%A1%9C%EC%BF%A0)
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
에서 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
'Node & React > Basic Study' 카테고리의 다른 글
[MAC] Node/React 기초 — Authentication 기능 구현하기 (0) | 2021.01.14 |
---|---|
[MAC] Node/React 기초 - 로그인 기능 (0) | 2021.01.14 |
[MAC] Node/React 기초 — Body Parser, POSTMAN,Register Router, NODEMON 설정하기 (0) | 2021.01.14 |
[MAC] Node/React 기초 — Model Schema 작성과 SSH설정 및 GITHUB에 Push하기 (0) | 2021.01.14 |
[MAC] Node/React 기초 — MongoDB 설치 및 기본 셋팅 (0) | 2021.01.14 |