Programming/Node.js

Node.js + express-session + db(MariaDB/MySQL) 연동 예제 :: 로그인 구현

고고마코드 2022. 7. 11. 16:01
반응형

1. 기본 시작 소스 안내

기본 소스는 branch::ex-auth 에서 시작하며, 완성된 소스는 branch::ex-auth-mysql 입니다.

https://github.com/gogoma-code/node-express-auth.git


node와 express-session을 활용하는 기본(branch::ex-auth가 만들어지는 과정)은 아래 글을 참고해 주세요.

Node.js + express-session :: 프로젝트 생성부터 로그인 구현하기


2. MySQL 예제 테이블 생성

기본적으로 MySQL은 설치가 되어 있다는 가정 하에 진행합니다.

SQL 예제 테이블 생성문

/* 만약 test 데이터베이스가 이미 있다면 다른 이름을 사용하세요. */
CREATE DATABASE `test`;

USE `test`;

/* 만약 user 테이블이 이미 있다면 다른 이름을 사용하세요 */
CREATE TABLE `user` (
  `no` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(128) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `status` int(11) DEFAULT 1,
  `create_time` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`no`),
  UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


INSERT INTO `user` (email, PASSWORD, NAME, STATUS) VALUES ('goma@gmail.com', PASSWORD('1111'), 'goma', 1);

3. 패키지 설치

mysql, mysql-password 설치

$ npm install mysql mysql-password
  • mysql
    MySQL을 위한 Node.JS 드라이버입니다.

  • mysql-password
    mysql에서 password('example')과 같은 값을 반환할 수 있습니다.

  • mysql-ssh
    mysql-ssh를 통해 ssh로도 접속할 수 있습니다.
    본 예제에서는 ssh는 다루지 않습니다.


4. connection 구성 설정

var mysql = require('mysql');

var pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: 'test',
    database: 'test',
    connectionLimit: 1000,
    waitForConnections: false
});

exports.pool = pool;

파일 생성 후 MySQL 계정 정보를 입력합니다.


5. 로그인 쿼리 설정

var mysqlPassword = require('mysql-password');

var db = require('./db');

exports.auth = function(email, password, callback) {
    db.pool.getConnection(function(err, conn) {
        if (err) callback(err);
        else {
            var sql = 'SELECT no, email, name FROM test.user WHERE email = ? and password = ? and status = 1';
            var hashPass = mysqlPassword(password);
            conn.query(sql, [email, hashPass], function(err, rows) {
                if (err) callback(err);
                else {
                    if (rows.length == 0)
                        callback(new Error('not exist rows'));
                    else {
                        callback(null, rows[0]);
                    }
                }
                conn.release();
            });
        }
    });
}
  • mysqlPassword(password)
    MySQL 쿼리 중 password(password) 와 같습니다.
    단순 파라미터의 경우 ? 로 표현할 수 있으며 백틱\ 으로 감싸 값을 전달할 수 있습니다.
    간혹 백틱이 쓰이는 테이블명을 파라미터로 넘겨야 할 경우에는 ?? 를 사용하면 됩니다.

  • not exist rows
    DB에서 입력한 정보와 일치하는 계정을 찾지 못했을 경우
    예제 테이블에서는 email을 id개념과 같은 의미로 사용하기 때문에 email, password를 파라미터로 사용하지만, 본인의 환경에 맞게 수정해서 사용하면 됩니다.


6. 로그인 처리 부분에 DB 연결

...
var userDB = require('../db/user');
...

기존 소스에 userDB 객체를 연결합니다.

routes/user.js (login_process 수정)

router.post('/login_process', (req, res, next) => {
  let post = req.body;

  let email = post.email;
  let password = post.password;

  userDB.auth(email, password, function (err, user) {
    if (err) {
      if (err.message == 'not exist rows') { // login failed
        res.status(401).send("login failed");
      } else { // another error
        res.status(400).send("error !!");
      }
    } else {
      req.session.is_logined = true;
      req.session.ss_email = email;

      req.session.save(function () {
        res.redirect(`/`);
      });
    }
  });
});
  • userDB.auth() 를 통해 DB에서 로그인 여부 체크

7. 로그인 테스트

Node 서버를 키고 테스트를 진행합니다.

  • localhost:3000 (로그인 테스트)

8. 전체 소스 코드

https://github.com/gogoma-code/node-express-auth.git (branch::ex-auth-mysql)

  • db/db.js는 .gitignore에 포함되어 Git소스에 푸쉬되지 않습니다.

참고자료

  1. mysql

  2. mysql-password


반응형