공부하자

[Node] 로그인 구현하기(1) - mysql 연동하기 본문

공부/Node.js

[Node] 로그인 구현하기(1) - mysql 연동하기

strongstar 2018.04.25 15:43

로그인 구현하기(2)에서는 로그인한 사용자를 session에 저장할겁니다.

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


예제를 위한 예제입니다.

이대로 쓰시면 안돼요.




- 사전작업


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

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

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


1
2
3
4
5
6
7
8
9
10
11
12
var crypto = require('crypto');
var salt = '';
var pw = '';
crypto.randomBytes(64, (err, buf) => {
  if (err) throw err;
  salt = buf.toString('hex');
});
crypto.pbkdf2('password', salt, 10000064'sha512', (err, derivedKey) => {
  if (err) throw err;
  pw = derivedKey.toString('hex');
});
 
cs


* crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)

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


- dbConfig.js


1
2
3
4
5
6
7
8
9
10
var dbConfig = {
  host: 'localhost',
  port: 3306,
  user     : 'user',
  password : 'password',
  database : 'database'
};
 
module.exports = dbConfig;
 
cs


- app_mysql.js


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


- views/login.ejs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Login Page</title>
  </head>
  <body>
    <form action="/login" method="post">
      <input type="text" name="username" placeholder="id" /><br />
      <input type="password" name="password" placeholder="password" /><br />
      <input type="submit" />
    </form>
  </body>
</html>
 
cs


- 실행결과




잘못된 id를 입력합니다.




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




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





* 참고

ejs (링크)

mysql (링크)

crypto (링크)

body-parser (링크)


예제 코드 다운받기 (링크)


0 Comments
댓글쓰기 폼