이러한 문제때문에 세션을 사용함.
세션은 상태정보가 서버에 저장되지 않는 한계를 극복하기 위해 만들어짐.
- 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 |