express-session
Web/Node.js

express-session

이러한 문제때문에 세션을 사용함.

세션은 상태정보가 서버에 저장되지 않는 한계를 극복하기 위해 만들어짐.

- express-session : express 환경에서 session을 쉽게 적용하기 위한 패키지임.

npm install express-session

 

/* ./app.js */

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

// express-session 코드
const session = require("express-session");

var app = express();

// express-session 코드
app.use(session({
  // secret 속성은 암호화 하기 위해 사용
  secret: "first project", 
  // resave는 세션이 변경되지 않았을 때는 저장되지 않도록 false 설정
  resave: false,
  // 세션이 저장되기 전에 초기화할지 여부를 정해주는 속성
  saveUninitialized: true,
  })
);

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// // 어떤 요청이 들어와도 해당 미들웨어 함수를 한 번은 실행하게 됨
// app.use((req, res, next) => {
//   console.log("middleware!!");
//   next();
// });



app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
/* ./routes/users.js */

var express = require('express');
const { route } = require('.');
var router = express.Router();

// DB 내의 PW와 일치하는지 여부를 확인하는 코드
const userInfo = {
  lee: {
    password: "123123"
  },
  kim: {
    password: "456456",
  },
};

router.get("/", (req, res) => {
  // session을 받아와서
  const session = req.session;
  // ./views/index.ejs를 클라이언트에 username의 키값과 세션의 username 정보를 렌더함
  res.render('index', {
    username: session.username,
  });
});

// express-session 로그인 기능
router.get("/login/:username/:password", (req, res) => {
  // 세션 사용 준비
  const session = req.session;
  const { username, password } = req.params;
});

// express-session 로그아웃 기능
router.get("/logout", (req, res) => {
  const session = req.session;
  // 세션에 username이 있다면
  if (session.username) {
    // 세션을 삭제하고, 에러가 발생하면 에러로그 출력
    req.session.destroy((err) => {
      if (err) {
        console.log(err);
        // 정상적으로 로그아웃 했다면 users로 리다이렉트
      } else {
        // redirect는 해당 라우터로 보내주는 역할
        res.redirect("/users");
      }
    });
    // 세션에 username이 없다면 users로 리다이렉트
  } else {
    res.redirect("/users");
  }
});


module.exports = router;
/* ./views/index.ejs */

<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <% if(username){ %>
      <div><%= username %>님 환영합니다.</div>
    <% } else{ %>
      <div>로그인이 필요합니다.</div>
    <% } %>
  </body>
</html>

주소창에 바로 /users를 입력하면 로그인이 되어있지 않기 때문에 로그인이 필요하다는 메시지가 잘 표시된다.

위 소스코드에서 사전에 정의한대로 주소창에 GET 요청을 보내면 로그인이 되었다는 메시지가 표시된다.

 

다시 주소창에 /users를 입력하면 로그인한 사용자 이름도 함께 출력된다.

 

 

 

/users/logout을 입력하면 세션정보가 삭제되고 /users로 리다이렉트되어 로그인이 필요하다는 메시지가 출력된다.

'Web > Node.js' 카테고리의 다른 글

mongoose schema  (0) 2022.01.10
mongoose  (0) 2022.01.10
미들웨어  (0) 2022.01.04
express - HTTP method  (0) 2022.01.04
Routing  (0) 2022.01.04