관리자 글쓰기
[Node.js] 쿠키(Cookie), 세션(Session) Part 2
2021. 11. 2. 21:07 - 프론트맨

저번 포스팅에서는 쿠키와 세션의 개념 그리고 MongoDB에 연결하는 방법에 대해 정리했다.

이번 포스팅에는 세션을 사용하는 방법에 대해 구체적으로 알아보겠다.

2021.10.28 - [Programming/Node.js] - [Node.js] 쿠키(Cookie), 세션(Session) Part 1

 

 

쿠키와 세션에 대해 다시 정리해보자면 http는 Stateless(무상태 프로토콜)이다.

'브라우저의 요청과 서버의 응답'이라는 이벤트가 없을 시에 브라우저와 서버는 정보를 주고받지 않는다. 그러므로 사용자가 웹 페이지에서 나갔다 들어오면 서버는 사용자를 기억하지 못한다.

사용자에 대한 정보가 없기 때문이다.

만약 구글이나 네이버에 로그인하고 잠깐 창을 껐다 켰는데 다시 로그인해야 한다면 정말 불편할 것이다.

브라우저는 이러한 문제를 쿠키와 세션으로 해결했다.

 

 

쿠키에는 여러 가지 정보를 담을 수 있다. 서버는 사용자에게 쿠키에 정보를 담아서 줄 수 있다.

사용자가 브라우저를 통해 서버에 요청을 보내면 받은 쿠키도 함께 전송된다.

서버는 받은 쿠키로 사용자의 정보를 읽은 뒤 다시 쿠키를 전송한다.

 

 

쿠키가 사용자의 PC 메모리에 저장된다면 세션은 서버에 저장된다.

서버가 사용자의 세션을 생성하면 세션 ID도 같이 생성된다.

세션은 쿠키에 담겨 서버에 보내지는데 서버는 사용자의 세션 ID와

데이터베이스에 저장된 ID를 비교해서 유저를 인증한다.

 

 

여기까지 PART1에서 다뤘던 세션과 쿠키에 대해 간단히 정리해보았다.

그렇다면 서버는 언제, 누구에게 사용자의 쿠키, 세션을 생성해야 할까?

만약 로그인한 유저를 인증하기 위해 세션을 생성한다고 할 때 웹 페이지에

방문한 모든 사용자의 쿠키를 만든다면 그만큼 데이터베이스에도 저장해야 하고

결국 용량이 부담될 것이다.

이 때는 로그인 승인과 동시에 세션을 제공하면 로그인한 사용자에게만 전달될 것이다.

저번 포스팅에서처럼 express-session을 세팅했다면 그다음부터는 어렵지 않다.

 

import express from "express";
import session from "express-session";
import MongoStore from "connect-mongo";

const app = express();

app.use(
  session({
    secret: "asdfasfsdf",
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: 14 * 24 * 60 * 60 * 1000,
    },
    store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:48945/project" }),
  })
);

app.listen(4000, () => {});

 

위의 코드처럼 saveUninitialized false로 지정하면 세션이 자동으로 생성되지 않는다.

세션을 생성하려면 데이터베이스에 유저의 정보가 저장될 때 세션의 값을 지정해야 된다.

 

import mongoose from "mongoose";

const accountSchema = new mongoose.Schema({
  id: { type: String, required: true },
  password: { type: String, required: true },
});

const Account = mongoose.model("Account", accountSchema);

export default Account;

 

유저의 아이디와 패스워드를 생성하는 데이터베이스 모델이다.

유저가 회원가입을 하면 위의 모델처럼 id, password가 생긴다.

 

로그인은 get이 아닌 post 방식으로 요청이 들어온다.

그러므로 controller를 post로 지정해야 한다.

 

app.post("/login", (req, res) => {
  req.session.loggedin = true;
  return res.redirect("/");
});

 

session은 req에서 접근할 수 있다.

위처럼 req.session의 요소를 직접 초기화하면 유저에게 세션을 줄 수 있다.

만약 유저가 로그인 여부에 따라 제공하는 기능을 다르게 하려면 아래의 코드로 간단하게 확인할 수 있다.

 

if(req.session.loggedIn){   # 로그인 되어있을 때
	} else{             # 비로그인 상태일 때
    }