▽ 쿠키와 세션의 차이
https://hahahoho5915.tistory.com/32
쿠키와 달리 웹서버에 데이터들이 객체 형식으로 저장된다.
브라우저를 닫거나, 서버에서 세션을 삭제했을때만 삭제가 되므로,쿠키보다 비교적 보안이 좋다.
저장 데이터에 제한이 없다.(서버 용량이 허용하는 한...)
각 클라이언트 고유 Session ID(식별자)를 부여한다.
Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공한다.
⇒ 사용자의 컴퓨터에는 session ID만 저장되고 나머지는 서버에 저장된다.
session 사용 방법
express 에서 세션 사용 방법 : express-session 미들웨어 사용
다운로드 방법 : npm install express-session —save
기본 세팅 :
var session = require('express-session');
app.use(session({
secret: 'any', // 보안을 위한 키
resave: false, //권장값
saveUninitialized: true //권장값
}))
기본 문법 :
req.session.count++; // req의 session 객체의 '데이터 count' 에 접근하는 형식
// session을 사용했으므로 클라이언트에 자동으로 connect.sid(session id) 값 부여됨
session 예제 - count
var express = require('express');
var session = require('express-session');
var app = express();
var port = 3000;
app.use(session({
secret: 'any', // 보안을 위한 키
resave: false, //권장값
saveUninitialized: true //권장값
}))
app.get('/count', function(req,res){
if(req.session.count){
req.session.count++;
} else {
req.session.count=1; // session 객체에 새로운 데이터 추가
}
res.send('count : '+req.session.count);
})
app.listen(port,function(){
console.log(port+'번 포트에 연결되었습니다!');
})
session 예제 - login , logout
로그인 진행시 session으로 displayName 저장됨
로그인 후 welcome 페이지에서 session.displayName 유무에 따라 다른 페이지 보여줌
이렇게 저장된 session은 일반적으로 브라우저가 닫히면 소멸됨
or 로그아웃 버튼 클릭시 delete 명령어로 소멸됨 → 리다이렉트로 welcome 페이지 가면
session이 삭제된 것 확인 가능
var express = require('express');
var session = require('express-session');
var bodyParser = require('body-parser'); // post 방식의 데이터 받기 위함
var app = express();
var port = 3000;
app.use(bodyParser.urlencoded({extended: false})); // post 방식 설정
app.use(session({
secret: 'any', // 보안을 위한 키
resave: false, //권장값
saveUninitialized: true //권장값
}))
app.get('/auth/login', function(req,res){
var output = `
<h1>Login</h1>
<form action="/auth/login" method = "post">
<p>
<input type="text" name="username" placeholder="username">
</p>
<p>
<input type="password" name="password" placeholder="password">
</p>
<p>
<input type="submit" value = "로그인">
</p>
</form>`;
res.send(output);
})
// 아래 방법은 데이터베이스를 사용하지 않는 안좋은 방법!
app.post('/auth/login', function(req,res){
var user={
username:'yonso',
password:'123',
displayName:'nayonsoso'
};
var uname = req.body.username;
var pwd = req.body.password;
if (uname===user.username && pwd===user.password){
req.session.displayName = user.displayName; // 서버에 session으로 displayName 값이 저장됨
res.redirect('/welcome');
} else{
res.send('who are u <br><a href="/auth/login">login</a>')
}
})
app.get('/welcome',function(req,res){
if (req.session.displayName){ // 서버에 session으로 저장된 displayname을 불러옴
res.send(`<h1>Hello, ${req.session.displayName}</h1>
<a href="auth/logout">logout`);
}else{
res.send('<h1>Welcome</h1> <a href="/auth/login"> Login');
}
})
app.get('/auth/logout',function(req,res){
delete req.session.displayName; //delete는 js의 명령어
res.redirect('/welcome');
})
app.listen(port,function(){
console.log(port+'번 포트에 연결되었습니다!');
})
npm 다운로드 : npm install express-mysql-session --save
app.use(session)에 store 옵션 추가
store에 들어가는 옵션은 mysql 정보
(mysql을 저장소로 사용하려면 일단 연결해야 하므로)
mysql 정보를 new MySQLStore를 통해 전달
session 예제 - mysql을 session-store로 활용하기
var express = require('express');
var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session); // 필요 모듈
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
secret: 'any', // 보안을 위한 키
resave: false, // 권장값
saveUninitialized: true, // 권장값
store:new MySQLStore({
host:'localhost',
port:3306,
user:'root',
password:'129329aa',
database:'o2'
}) // 저장소가 될 mysql database 정보
// 실행되면 자동으로 sessions 라는 테이블 생성됨
}));
app.get('/auth/logout', function(req, res){
delete req.session.displayName;
req.session.save(function(){
res.redirect('/welcome');
}) // redirect 가 있는경우, 저장하기 전에 redirect가 되는걸 방지
});
app.get('/welcome', function(req, res){
if(req.session.displayName) {
res.send(`
<h1>Hello, ${req.session.displayName}</h1>
<a href="/auth/logout">logout</a>
`);
} else {
res.send(`
<h1>Welcome</h1>
<a href="/auth/login">Login</a>
`);
}
});
app.post('/auth/login', function(req, res){
var user = {
username:'yonso',
password:'123',
displayName:'nayonsoso'
};
var uname = req.body.username;
var pwd = req.body.password;
if(uname === user.username && pwd === user.password){
req.session.displayName = user.displayName;
req.session.save(function(){
res.redirect('/welcome');
})
} else {
res.send('Who are you? <a href="/auth/login">login</a>');
}
});
app.get('/auth/login', function(req, res){
var output = `
<h1>Login</h1>
<form action="/auth/login" method="post">
<p>
<input type="text" name="username" placeholder="username">
</p>
<p>
<input type="password" name="password" placeholder="password">
</p>
<p>
<input type="submit">
</p>
</form>
`;
res.send(output);
});
app.listen(3003, function(){
console.log('Connected 3003 port!!!');
});