Node.js mysql 로그인 - Node.js mysql logeu-in

로그인 구현하기(3)에서는 passport 를 사용하여 인증해보겠습니다.

예제를 위한 예제입니다.

이대로 쓰시면 안돼요.

회원가입 구현을 생략하고, 로그인만 간단히 짜기 위해 사전에 유저를 만들어 db 테이블에 넣어둡니다.

유저는 id, password, salt, name 값을 가지고 있습니다.

아래 코드처럼 랜덤하게 salt 값을 생성하고, password를 암호화합니다.

* 회원가입때 사용한 salt, iterations, keylen, digest 를 로그인할때 동일하게 사용해야합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

var express = require('express');

var mysql = require('mysql');

var bodyParser = require('body-parser');

var ejs = require('ejs');

var crypto = require('crypto');

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

var app = express();

var dbOptions = {

host: dbConfig.host,

port: dbConfig.port,

user: dbConfig.user,

password: dbConfig.password,

database: dbConfig.database

};

var conn = mysql.createConnection(dbOptions);

conn.connect();

app.set('view engine''ejs');

app.set('views''./views');

app.use(bodyParser.urlencoded({ extended: false }));

app.get('/'function (req, res) {

res.send('<a href="/login">login</a>');

});

app.get('/login'function(req, res){

res.render('login');

});

app.post('/login'function(req, res) {

var id = req.body.username;

var pw = req.body.password;

var sql = 'SELECT * FROM user WHERE id=?';

conn.query(sql, [id], function(err, results){

if(err)

console.log(err);

if(!results[0])

return res.send('please check your id.');

var user = results[0];

crypto.pbkdf2(pw, user.salt, 10000064'sha512'function(err, derivedKey){

if(err)

console.log(err);

if(derivedKey.toString('hex'=== user.password){

return res.send('login success');

}

else {

return res.send('please check your password.');

}

});//pbkdf2

});//query

}

);

app.listen(3000function () {

console.log('Example app listening on port 3000!');

});

cs

잘못된 id를 입력합니다.

id는 맞고, password 는 틀린 경우입니다.

id, password 를 맞게 입력합니다.

글이 잘 보이지 않는다면 우측 하단의 달 모양을 눌러 라이트모드로 변경해주시기 바랍니다.

해당 글은 MacOS 를 기준으로 작성이 되었음을 미리 알려드립니다. WindowOS  를 이용하시는 분은 추후 업로드될 게시글을 기다려주시거나 다른 작성자의 게시글을 확인해주시기 바랍니다.


  MySQL 설치하기 - Homebrew 설치

우선, Homebrew 를 설치해야 합니다.

위 링크에서 안내를 해 주는대로 homebrew 를 설치해주시기 바랍니다.

  MySQL 설치하기 - MySQL 설치

터미널을 열어줍니다.

Node.js mysql 로그인 - Node.js mysql logeu-in

터미널에 이와같이 brew update 를 입력하여 homebrew를 업데이트 해주시기 바랍니다. 

이 때 시간이 조금 걸리게 되는데 기달려주시면 아래와같이 나타나게 됩니다.

Node.js mysql 로그인 - Node.js mysql logeu-in

이와같이 나타나게 된다면 업데이트가 완료된 것 입니다.

이 후 아래 이미지처럼 작성을 해주세요.

원하는 버전이 있다면 맨 뒤에 @5.5 처럼 원하는 버전을 입력해주세요.

이렇게 작성을 하셧다면 설치가 될 것 입니다.

Node.js mysql 로그인 - Node.js mysql logeu-in

  MySQL 세팅

터미널에서 아래와같이 작성을 해 줍니다.

mysql -u root -p

위처럼 입력을 하시고 비밀번호를 입력하시면

MySQL [(none)]>  이라고 보이게되는데 이 때 이러면 접속이 된 것 입니다.

여기서 비밀번호 설정은 다른분들의 게시글 혹은 추후 업로드될 게시글을 확인해주시기 바랍니다.

이제 사용할 데이터베이스를 만들 것 입니다.

#이제 데이터베이스를 추가해보겠습니다
CREATE DATABASE authtest default CHARACTER SET UTF8;
show databases;
Node.js mysql 로그인 - Node.js mysql logeu-in

이렇게 나오게 됩니다. 이는 데이터베이스를 보여주는것으로, 추후에 데이터베이스가 어떤것이 있는지 확인하기 좋습니다.

#이제 authtest 를 선택하겠습니다
use authtest;
CREATE TABLE `authtest`.`user` (
	`id` int NOT NULL AUTO_INCREMENT,
    `userid` varchar(255) NOT NULL,
    `password` varchar(255) NOT NULL,
    `username` varchar(255) NOT NULL,
    `age` int NOT NULL,
    `created` timestamp NOT NULL,
    `modified` timestamp NOT NULL,
    PRIMARY KEY (id)
);

위처럼 코드를 작성해준다면 authtest 안에 user 테이블이 만들어집니다.

#테이블이 잘 추가되었는지 확인을 해 보겠습니다.
show tables;
Node.js mysql 로그인 - Node.js mysql logeu-in

여기까지 해준다면 로그인 / 회원가입을 위한 MySQL의 세팅은 끝이나게 됩니다.

  NodeJS - body-parser / cors 모듈설치 및 적용

현재 저는 ApiTestServer 프로젝트를 안에서 작성을 하고있습니다.

우선, 요청의 본문을 해석해주기위해 body-parser 를 사용하며,

Access-Control-Allow-Origin 을 위해 cors 도 설치하도록 하겠습니다.

yarn add body-parser
yarn add cors

이 두개의 모듈을 설치해주도록 합니다.

간혹, body-parser 대신 express 를 사용해도 된다는 말이 있습니다.

맞는말이지만, body-parser 가 express 에 비해 해석의 범위가 더 넓습니다.

body-parser의 경우 Raw, text 의 요청도 해석을 할 수 있습니다.

이제 두 모듈 설치가 완료되었다면 최 상위 파일에 아래 코드를 추가해줍니다.

저의 경우는 app.js 이니 app.js 에 추가를 하도록 하겠습니다.

// Modules
const bodyParser = require('body-parser');
const cors = require('cors');

......


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());

위와같이 작성을 해주면 적용이 완료가 됩니다.

  NodeJS - express-mysql-session 모듈설치 및 적용

또 두가지의 모듈을 설치해 주어야 합니다.

express-session 과 express-mysql-session 입니다.

yarn add express-session
yarn add express-mysql-session

이 후 이 두개의 모듈을 이용해서 mysql  연동을 해줄것 입니다.

const session = require('express-session')
const MySQLStore = require('express-mysql-session')(session)

......

const option = {
    host : 'localhost',
    port : 3306,
    user : 'root',
    password : 'root',
    database : 'authtest'
}
const sessionOption = {
    secret : 'YOUR_SECRET_KEY',
    resave : false,
    saveUninitialized : false,
    store : new MySQLStore(option)
}

app.use(session(sessionOption))

이처럼 작성을 해주고, app.js 를 실행해서

Node.js mysql 로그인 - Node.js mysql logeu-in

이처럼 나온다면 연동과 설치가 모두 끝난것 입니다.

추가로 굳이 저렇게 option 과 session 옵션을 나눈 이유는 추후에 다른곳으로 빼기 편하게 하기위함 입니다.

다음은 세션관리를 해보도록 하겠습니다.