공부하자

[Node] 로그인 구현하기(2) - session 사용하기 본문

공부/Node.js

[Node] 로그인 구현하기(2) - session 사용하기

strongstar 2018.04.30 17:20

로그인 구현하기(1)에서는 사용자가 입력한 값을 DB(mysql)에 저장된 값과 비교했습니다.

로그인 구현하기(2)에서는 로그인한 사용자의 정보를 세션에 저장합니다.

로그인 구현하기(3)에서는 passport-local 인증을 사용할겁니다.


예제를 위한 예제입니다.

이대로 쓰시면 안돼요.




- app_session.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var express = require('express');
var mysql = require('mysql');
var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session);
var bodyParser = require('body-parser');
var ejs = require('ejs');
var crypto = require('crypto');
var dbConfig = require('./dbConfig');
 
var app = express();
var dbOptions = dbConfig;
var conn = mysql.createConnection(dbOptions);
conn.connect();
app.set('view engine''ejs');
app.set('views''./views');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
    secret: '!@#$%^&*',
    store: new MySQLStore(dbOptions),
    resave: false,
    saveUninitialized: false
}));
 
app.get('/'function (req, res) {
  if(!req.session.name)
    res.redirect('/login');
  else
    res.redirect('/welcome');
});
app.get('/login'function(req, res){
  if(!req.session.name)
    res.render('login', {message:'input your id and password.'});
  else
    res.redirect('/welcome');
});
app.get('/welcome'function(req, res){
  if(!req.session.name)
    return res.redirect('/login');
  else
    res.render('welcome', {name:req.session.name});
});
app.get('/logout'function(req, res){
  req.session.destroy(function(err){
    res.redirect('/');
  });
});
 
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.render('login', {message:'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){
        req.session.name = user.name;
        req.session.save(function(){
          return res.redirect('/welcome');
        });
      }
      else {
        return res.render('login', {message:'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
16
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Login Page</title>
  </head>
  <body>
    <h1><%message %></h1>
    <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


- views/welcome.ejs


1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Welcome Page</title>
  </head>
  <body>
    <h1>Hello, <%name %></h1>
    <h2><a href="/logout">logout</a></h2>
  </body>
</html>
 
cs


- 실행결과







로그아웃하고, url로 접속을 시도합니다.



login 페이지로 redirect 되는 것을 확인할 수 있습니다.




* 참고

express-session (링크)

express-mysql-session (링크)


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


0 Comments
댓글쓰기 폼