▽ 쿠키와 세션의 차이

https://hahahoho5915.tistory.com/32

Session

쿠키와 달리 웹서버에 데이터들이 객체 형식으로 저장된다.
브라우저를 닫거나, 서버에서 세션을 삭제했을때만 삭제가 되므로,쿠키보다 비교적 보안이 좋다.
저장 데이터에 제한이 없다.(서버 용량이 허용하는 한...)
각 클라이언트 고유 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+'번 포트에 연결되었습니다!');
})

mysql을 session 저장소로 사용하는 방법

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!!!');
});
profile
공부한 것들을 정리하기 위한 용도입니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN