데이터를 받아올 때 띄어쓰기 된 데이터가 잘리는 오류
따옴표를 붙여주면 잘 불러온다.
app.get('/signup', (req, res) => {
res.render('signup.ejs');
})
app.post('/signup', (req, res) => {
// insertOne
db.collection('login').insertOne({
id: req.body.id,
pw: req.body.pw,
mobile: req.body.mobile,
country: req.body.country
},
function(err, result) {
if(err) return console.log(err);
console.log('저장완료');
console.log(result);
res.redirect('/login');
});
})
npm install node-mysql
const mysql = require('mysql');
const conn = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '970604',
database : 'node_db',
});
conn.connect();
console.log('접속완료');
app.listen(8080, function() { // 8080 포트에 서버를 띄워라
console.log('listening on 8080');
})
app.post('/add', (req, res) => { // 화살표 함수
// console.log(req.body.title)
// console.log(req.body.date)
let sql = `insert into todo (title, curdate) values ( "${req.body.title}", "${req.body.date}" )`;
conn.query(sql, function(err, rows, fields) {
if(err) {
console.log(err);
} else {
res.redirect('/list');
}
})
mysql> create table login(
-> id int(11) not null auto_increment,
-> userid varchar(100) not null,
-> userpw varchar(100) not null,
-> mobile varchar(100) null,
-> country varchar(100) null,
-> primary key(id));
app.post('/signup', (req, res) => {
// console.log(req.body.id);
// console.log(req.body.pw);
// console.log(req.body.mobile);
// console.log(req.body.country);
let sql = `insert into login (userid, userpw, mobile, country) values ( "${req.body.id}", "${req.body.pw}", "${req.body.mobile}", "${req.body.country}" )`;
conn.query(sql, function(err, rows, fields) {
if(err) {
console.log(err);
} else {
res.redirect('/login');
}
})
})
id는 auto_increment로 만들어주어서 같이 전송할 필요 없음.
app.post('/login', (req, res) => {
let userid = req.body.id;
let userpw = req.body.pw;
console.log(userid)
console.log(userpw)
let sql = "select * from login";
conn.query(sql, function(err, rows, fields) {
if (err) {
console.log(err);
}
for (let i = 0; i < rows.length; i++) {
if(rows[i].userid == userid) {
if(rows[i].userpw == userpw) {
res.redirect('/');
}
else {
res.send('비밀번호가 틀렸습니다.')
}
}
}
})
})
비밀번호를 숫자 그대로 노출한채로 데이터베이스에 저장하면 안되기 때문에 암호화를 시켜야한다.
세션
내 정보를 암호화 시켜서 저장
// 세션
app.get('/count', function(req, res) {
if(req.session.count) {
req.session.count++;
} else {
req.session.count = 1;
}
res.send('count : ' + req.session.count);
})
app.get('/temp', function(req, res) {
res.send('result : ' + req.session.count);
})
localhost:8080/count
에 접속하면 count라는 이름으로 값이 저장된다. /temp
로 접속하면 현재 count의 값이 얼마인지 확인할 수 있다. (세션유지)
app.get("/logout", (req, res) => {
delete req.session.count;
res.redirect("/");
})
localhost:8080/logout
에 접속하면 세션을 삭제한다.
다시 temp에 들어가보면 count의 값이 사라진 것을 확인할 수 있다.
npm install session-file-store
const session = require('express-session');
const FileStore = require('session-file-store')(session);
app.use(session({
secret : '1111',
resave : false,
saveUninitialized : true,
store : new FileStore()
}))
실행하면 sessions 폴더 생성, 세션 생성 시 파일 생성
메모리에 세션을 저장하게 되면 서버를 껐을 때 날아가지만, 파일로 생성해두면 계속 남아있다.
npm install express-mysql-session
const MySQLStore = require('express-mysql-session')(session);
app.use(session({
secret : '1111',
resave : false,
saveUninitialized : true,
store : new MySQLStore({
host : 'localhost',
port : 3306,
user : 'root',
password : '970604',
database : 'node_db'
})
}))
select * from sessions;
npm install md5
복호화가 불가능하기 때문에 입력한 값도 복호화해서 저장된 복호화 값과 비교해 일치여부를 확인한다.
let md5 = require('md5');
md5(rows[i].userpw) == md5(userpw)
하지만 요즘 mp5 복호화 방법이 많아져서 해킹에 노출되기가 쉽다.
따라서 임의의 변수를 만들어 합치기도 한다.
let salt = 'kfs28da6ksa'
md5(rows[i].userpw + salt) == md5(userpw + salt)
이처럼 비밀번호는 해킹할 수 없는 암호화 형태로 저장해야한다.