공부하자
[Node] 로그인 구현하기(1) - mysql 연동하기 본문
로그인 구현하기(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, 100000, 64, '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, 100000, 64, '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(3000, function () { 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 (링크)
예제 코드 다운받기 (링크)
'공부 > Node.js' 카테고리의 다른 글
[Node] 로그인 구현하기(3) - passport.js 사용하기 (0) | 2018.05.14 |
---|---|
[Node] 로그인 구현하기(2) - session 사용하기 (0) | 2018.04.30 |
[Node] cookie 사용하기 (0) | 2018.04.23 |
[Node] File System (readFile, writeFile) (0) | 2018.04.19 |
[Node] express 실행하기 (0) | 2018.04.19 |
Comments