JavaScript/Nodejs

[NodeJS] 로그인/회원가입 구현하기 ( 회원가입편 )

반응형

2021.05.20 - [내가 공부하는것/JavaScript] - [NodeJS] 로그인/회원가입 구현하기 (로그인편)

>> 내용이 잘 보이지 않는다면 우측 하단의 달 모양을 클릭해주시기 바랍니다. <<

백엔드 작업을 하다보면 거의 필수로 작업하게 되는게 바로, 로그인 작업이다.

필자도 로그인작업을 여러번 해 보았지만 최근에 새로운 이슈가 생겨 이 이슈를 해결하는 과정을 적어보려고 한다.

 

기본적으로 아래 모듈들을 설치해두는것을 추천한다.

express / mysql / cors / body-parser / cookie-parser / express-session / bcrypt


우선, 로그인을 하기 위해서는 회원 정보가 필요하니 회원가입을 만든다고 가정하자.

클라이언트에서 POST 로 id 와 pw 를 받는다고 해보자

 

  클라이언트로부터 값을 받아오자

index.js

const bodyParser require('body-parser')

app.use(express.json())
app.use(bodyParser.urlencoded({ extended: true }))

router.js

router.post('/register', (req,res,next) =>{
	console.log(req.body)
    res.end()
})

 

이런식으로 작성을 해 준다면, 클라이언트에서 값을 받아올 수 있을것이다.

 

  데이터베이스와 연결을 하자

필자는 그래도 보안을 위해 파일을 분리해 두었다.

모듈을 분리하는 방법은 나중에 따로 다루도록 하겠다.

 

config.js

const mysql = require('mysql')

const db = mysql.createConnection({
    host : "localhost",
    user : 'root',
    password : 'root',
    port : 3306,
    database:'dbs'
})

db.connect();

module.exports = db;

 

router.js

const db = require('../db/config')

router.post('/register', (req,res,next) =>{
	console.log(req.body)
    res.end()
})

 

이런식으로 작성을 해준다면 연동이 잘 될것이다.

만약, 여기서 오류가 난다면 mysql.createConnection() 부분에서 정보 입력에 문제가 생긴것이니 잘 확인해보도록.

 

router.js 에서 이제 db에 값을 넣어줄것이다.

그 전에 sql 문을 어떻게 하는지 알아보자.

 

  SQL INSERT 문

입력받은 값을 db에 저장하기 위해서는 insert 문이 필요하다.

우선, 간단하게 db구성이 어떻게 되어있는지 알아보자.

 

member Table

id pw name
- - -

테이블이 이렇게 짜져있다고 가정을 해보자.

id 와 pw , name 에 insert 시켜야 하므로

INSERT INTO member(`id`,`pw`,`name`) VALUES ('ids','pws','ngyu');

이와같이 인서트문을 작성해준다면

 

member Table

id pw name
ids pws ngyu

 

이런식으로 들어갈 것이다.

자 이제 instert문을 알았으니 한번 코드를 적용해보자

 

router.js

const db = require('../db/config')

router.post('/register', (req,res,next) =>{
	const param = [req.body.id, req.body.pw, req.body.name]
    
	db.query('INSERT INTO member(`id`,`pw`,`name`) VALUES (?,?,?)' , param , (err, row) =>{
    	if(err) console.log(err)
    })
    res.end()
})

 

이렇게 작성을 해주면 db에 회원 정보가 업로드 될 것이다.

 

 

  비밀번호 보안

회원 정보를 저장할 때 관리자도 함부로 접근할 수 없도록 비밀번호를 저장하는것이 가장 현명한 보안이라고 생각한다.

관리자도 보기 힘든 조건을 만족하기 위하여 우리는 bcrypt 를 이용할 것이다.

 

router.js

const db = require('../db/config')

const bcrypt = require('bcrypt')
const saltRounds = 10

router.post('/register', (req,res,next) =>{
	const param = [req.body.id, req.body.pw, req.body.name]
    
	db.query('INSERT INTO member(`id`,`pw`,`name`) VALUES (?,?,?)' , param , (err, row) =>{
    	if(err) console.log(err)
    })
    res.end()
})

 

여기서 갑자기 보이는 saltRounds 는 무엇을 의미하는 것일까?

예상컨데 암호화를 몇번 진행할 것인지 정하는것 같다.

 

자 그럼 이 bcrypt를 적용해보자.

비밀번호를 암호화 하는 방법은 bcrypt에서 제공하는 hash 함수를 사용하면 된다.

 

router.js

const db = require('../db/config')

const bcrypt = require('bcrypt')
const saltRounds = 10

router.post('/register', (req,res,next) =>{
	const param = [req.body.id, req.body.pw, req.body.name]
    
	bcrypt.hash(param[1], saltRounds, (error , hash)=>{
    	param[1] = hash
    	db.query('INSERT INTO member(`id`,`pw`,`name`) VALUES (?,?,?)' , param , (err, row) =>{
    		if(err) console.log(err)
    	})
    })
    res.end()
})

 

이렇게 해주면 암호화된 비밀번호를 db에 저장시켜준다.

 

이렇게 회원가입 부분은 끝이 났다.

반응형