Session

자세한 내용은 생활코딩 Javascript(nodejs)강좌를 참고하세요.

Session이란

쿠키를 개선한 방식으로 쿠키보다 좀더 안전하게 방대한 데이터를 저장가능하게 합니다.
즉, 사용자의 컴퓨터와 서버가 통신하는 과정에서 아이디나 비밀번호와 같은 중요한 정보가 오고 간다는 것은 굉장히 위험한 일이므로 이러한 문제를 개선하기 위해서 쿠키가 가지고 있는 기능과 서버쪽에서 데이터를 저장할 수 있는 공간을 잘 결합한 세션을 사용하는 것이 더 안전합니다.

Session의 동작 방식

사용자가 서버에 접속을 하면 서버는 클라이언트(사용자의 컴퓨터)에 데이터를 저장할 때 쿠키 방식과는 다르게 사용자의 식별자(id) 값 만을 저장합니다. 사용자의 컴퓨터에는 오직 식별자 값만 저장되어있고 해당 식별자 값에 해당하는 실제 데이터는 서버의 데이터베이스에 저장 되어있는 것입니다. 사용자가 서버에 접속하여 요청으로 식별자를 전송하면 그 식별자에 해당하는 실제 데이터를 서버의 데이터베이스에서 읽어와 사용할 수 있는 것 입니다.

Express에 Session 패키지 설치

npm install express-session --save
var express = require('express');
var session = require('express-session');
var app = express();

app.use(session({
	secret: '12sdfwerwersdfserwerwef', //keboard cat (랜덤한 값)
	resave: false,
	saveUninitialized: true
}));

app.listen(3000, function(){
	console.log('Connected 3000 port!!!');		
});

Mysql을 Express의 Session store로 사용

npm install express-mysql-session --save
var express = require('express');
var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session);
var mysql = require('mysql');
var conn = mysql.createConnection({
	host     : 'localhost',
	user     : 'root',
	password : 'password',
	database : 'test'
});
conn.connect();

//POST 방식을 이용한 정보 전달을 가능하게 함(req.body.###)
var bodyParser = require('body-parser');
var app = express();

var options = {
	host	: 'localhost',
	port	: 3306,
	user	: 'root',
	password: 'password',		//데이터베이스 접근 비밀번호
	database: 'test'		//데이터베이스의 이름
};
var sessionStore = new MySQLStore(options);

app.use(session({
	secret: '12sdfwerwersdfserwerwef', //keboard cat (랜덤한 값)
	resave: false,
	saveUninitialized: true,
	store: sessionStore
}));

app.listen(3000, function(){
	console.log('Connected 3000 port!!!');		
});

사용 예

//세션 저장 여부에 따라 로그인 결정
app.get('/', function(req, res){
	if(req.session.authId)
		res.send(authId+'님 로그인되었습니다');
	else
		res.send('로그인하세요!');
});

// 유저가 가입하면 사용자 아이디를 세션데이터로 저장하여 자동 로그인
app.post('/auth/register', function(req, res){
	var user={
		AuthId: req.body.authId,
		Password: req.body.password
	};
	var sql = 'INSERT INTO users SET ?';
	conn.query(sql, user, function(err, results){
		if(err){
			console.log(err);
		}else{
			//사용자 아이디를 세션 데이터로 저장
			req.session.authId = req.body.authId;
			req.session.save(function(){
				res.redirect('/');		
			});
		}		
	})
});

//유저의 세션데이터를 삭제하여 로그아웃
app.get('/logout', function(req, res){
	delete req.session.authId;
	req.session.save(function(){
		res.redirect('/');
	});
});