221122 Node.js #9

김혜진·2022년 11월 22일
0

Node.js

목록 보기
9/13

MongoDB Atlas


ejs

데이터를 받아올 때 띄어쓰기 된 데이터가 잘리는 오류

따옴표를 붙여주면 잘 불러온다.

회원가입

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');
    });
})

MySQL


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');
        }
    })
    

회원가입

회원가입 정보를 저장할 login 테이블 만들기

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 폴더 생성, 세션 생성 시 파일 생성
메모리에 세션을 저장하게 되면 서버를 껐을 때 날아가지만, 파일로 생성해두면 계속 남아있다.

세션을 DB로 관리 (MySQL)

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;


단방향 암호화 기법

MD5

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)

이처럼 비밀번호는 해킹할 수 없는 암호화 형태로 저장해야한다.

profile
알고 쓰자!

0개의 댓글