241206 노드 (세션)

241206 에이콘 아카데미 수업에 기반하여 작성되었음을 알립니다.


노드 실습 (세션)

환경 설정

mkdir project06
npm init -y
npm i express
npm i nodemon
npm i express-session
npm i body-parser

server.mjs

import express from "express";
import session from "express-session";
import bodyParser from "body-parser";
import path from "path";
import { fileURLToPath } from "url";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const app = express();

// app.use(bodyParser.json()) // 요청을 JSON으로 파싱
// app.use(bodyParser.urlencoded({extended: false}))
app.use(express.urlencoded({extended: false})); // 위의 코드를 한번에 써준 것

app.use(
  session({
    secret: "secret-key", // 세션 암호화를 위한 비밀키 설정
    resave: false, // 세션이 수정되지 않았다면 저장을 할지 말지 정함
    saveUninitialized: true, // 초기화되지 않은 세션에 대한 저장 여부 결정
    cookie: { maxAge: 30 * 60 * 1000 }, // 세션 유효기간 설정, 설정해주지 않으면 기본 30분
  })
);

app.set("view engine", "ejs"); // ejs를 템플릿 엔진으로 설정 (자바의 경우 jsp와 같다.)
app.set("views", path.join(__dirname, "views"));

const auth = {
  id: "yyummmmmmmm",
  password: "1111",
};

app.get("/", (req, res) => {
  res.sendFile(path.join(__dirname, "login.html"));
});

app.post("/login", (req, res) => {
  const { id, password } = req.body;

  if (id === auth.id && password === auth.password) {
    req.session.user = id; // session에 사용자 id를 저장
    res.redirect("/main");
  } else {
    res.send('로그인 실패 <a href="/">다시!</a>');
  }
});

app.get("/main", (req, res) => {
  if (req.session.user) {
    res.render("main", { sessionID: req.sessionID }); // 로그인 성공시 sessionID를 가지고 main.ejs 호출
  } else {
    res.send('접근 권한 없어 <a href="/">다시!</a>');
  }
});

app.get("/logout", (req, res) => {
  req.session.destroy((err) => {
    if (err) {
      return res.redirect("/main");
    }
    res.clearCookie("connect.sid"); // 세션을 저장했던 쿠키 삭제
    res.redirect("/");
  });
});

app.set("port", process.env.PORT || 3000);
app.listen(app.get("port"), () => {
  console.log(app.get("port"), "번 포트에서 웹 서버 서비스 시작!");
});
💡 Body-parser
body-parser는 Node.JS의 모듈 중 하나로, 클라이언트가 보내는 Request Data의 Body로부터 파라미터를 편리하게 추출 할 수 있다.

app.use(bodyParser.json()) // 요청을 JSON으로 파싱
app.use(bodyParser.urlencoded({extended: false}))
🔽
app.use(express.json()); // 위의 코드를 한번에 써준 것

출처 : https://pinomaker.com/89
💡 node.js의 template engine (ejs)
ejs : https://github.com/visionmedia/ejs <- JSP와 유사한 형태로 구성되어 있다.

EJS (Embedded JavaScript Templates)는 Node.js에서 사용되는 템플릿 엔진으로, HTML 파일 내에서 JavaScript 코드를 삽입하여 동적인 웹 페이지를 생성할 수 있다. 주로 Express와 함께 사용된다.

주요 특징 - 템플릿 엔진: HTML과 JavaScript를 혼합하여 동적인 콘텐츠를 생성. - 간단한 문법: <% %> 및 <%= %>와 같은 태그를 사용. - 빠른 렌더링: 빠르고 경량화된 엔진. - 서버 사이드 렌더링: 서버에서 데이터를 HTML로 렌더링하여 클라이언트에 전달.

설치 : npm install ejs

출처 : https://cafe.daum.net/flowlife/RM66/12

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>로그인</h2>
    <form action="/login" method="post">
        ID : <input type="text" name="id" />
        PW : <input type="password" name="password" />
        <button type="submit">로그인</button>
    </form>
</body>
</html>

로그인 화면

로그인 실패

main.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>로그인 성공 후 메인 페이지</h2>
    <p>세션 ID : <%= sessionID %></p>
    <form action="/logout" method="get">
        <button type="submit">로그아웃</button>
    </form>
</body>
</html>

로그인 성공