프로그래밍 공부방

[node.js] bcrypt를 이용한 패스워드 암호화 (회원가입 기능) 본문

백엔드/Node.js

[node.js] bcrypt를 이용한 패스워드 암호화 (회원가입 기능)

김갱갱 2022. 7. 28. 02:14

우선 회원가입을 할 때 입력받은 패스워드를 암호화해서 db에 넣어야겠죠?

그렇기 때문에 회원가입 코드에서 패스워드를 암호화하는 작업을 해줍니다.

 

사용한 패스워드 암호화 방식은 bcrypt 모듈을 이용한 단방향 암호화입니다.

단방향 암호화이기 때문에 복호화를 해서 원래의 패스워드는 확인이 불가능합니다!

원래는 아이디는 양방향 암호화를 해서 넣으려고 했지만 그렇게 되면 아이디 중복 등과 같이 비교를 할 때 힘들어질 것 같아서 따로 암호화는 하지 않았습니다.

 

단방향 암호화: 암호화를 한 후에 다시 복호화하는 것이 불가능하다.

양방향 암호화: 암호화를 한 후에 다시 복호화하는 것이 가능하다.


bcrypt로 패스워드 암호화

bcrypt.hashSync()

/* signup.js */

const express = require('express');
const router = express.Router();

const mysql = require('mysql'); // mysql 모듈
const dbconfig = require('../config/db.js'); // db 모듈 불러오기
const connection = mysql.createConnection(dbconfig); // db 연결

const bcrypt = require('bcrypt'); // 단방향 암호화를 위한 bcrypt 모듈

/* body parser의 두 번째 방법 */
router.use(express.json()); 

/* 회원가입 후 회원을 저장하는 과정 페이지 */
router.post('/process', function(req, res){ // 클라이언트에서 요청한 값
  u_id = req.body.id;
  u_pw = req.body.pw;

  const encryptedPw = bcrypt.hashSync(u_pw, 10); // 암호화된 비밀번호
 
  var insertValArr = [u_id, encryptedPw]; // mysql에 넣을 배열값 : [암호화되지 않은 아이디, 암호화된 비밀번호]
  sql = "INSERT INTO users (user_id, user_pw) VALUES (?, ?)";

  /* db에 암호화해서 아이디와 비밀번호 저장하는 작업 : mysql 사용 */
  connection.query(sql, insertValArr, function(error, rows){
    if (error) throw error;
    res.send(rows);
  });
  
})

require('bcrypt') 코드는 bcrypt 모듈을 추가하는 코드입니다.

bcrypt.hashSync(u_pw, 10) 코드는 salt 작업을 10번을 하겠다는 뜻인데요.

salt 횟수에 따라서 암호화가 더 복잡해집니다.

 

이제 아이디와 암호화된 패스워드를 db에 저장을 해줍니다.

INSERT 쿼리를 작성해서 users 테이블에 아이디와 암호화된 비밀번호를 저장합니다.

회원 DB

select로 users 테이블을 확인해보면 잘 저장이 된 것을 확인할 수 있습니다!

 


로그인 시 입력받는 패스워드와 bcrypt로 암호화된 패스워드 비교

bcrypt.compareSync()

const express = require('express');
const router = express.Router();

const mysql = require('mysql'); // mysql 모듈
const dbconfig = require('../config/db.js'); // db 모듈 불러오기
const connection = mysql.createConnection(dbconfig); // db 연결

const bcrypt = require('bcrypt');

router.use(express.json()); 

router.post('/process', function(req, res){ // 클라이언트에서 요청한 값
  input_id = req.body.id;
  input_pw = req.body.pw;

  sql = "SELECT * FROM users WHERE user_id = ?";

  connection.query(sql, input_id, function(error, rows){
    if (error) throw error;

    if (rows.length == 0) { // 아이디가 없을 때
      console.log("존재하지않는 회원입니다");
    } else { // 아이디가 존재할 때
      const same = bcrypt.compareSync(input_pw, rows[0].user_pw); // 패스워드 비교값
      if (same == true) { // 입력받은 패스워드와 db에 저장된 패스워드가 일치할 때
        console.log("회원입니다. 로그인에 성공하셨습니다");
        res.redirect("/");
      } else {
        console.log("패스워드가 틀렸습니다");
      }
    }
  });
})

bcrypt.compareSync 함수를 이용하면 암호화된 패스워드와 입력받은 패스워드를 비교할 수 있습니다.

이 코드에서는 rows[0].user_pw가 암호화된 패스워드입니다.

이 함수를 돌렸을 때의 결과값은 true거나 false입니다.

true일 때는 입력받은 패스워드와 암호화된 패스워드가 일치한다는 뜻이고

false일 때는 입력받은 패스워드와 암호화된 패스워드가 일치하지않는다는 뜻입니다,

 

이렇게 해서 로그인 시에는 패스워드를 비교해서 로그인이 가능합니다!!