세션

기초/HTTP|2021. 10. 19. 21:45

무엇인가? 

개발자 도구로 쿠키를 들여다보거나 수정이 가능하기 때문에,

쿠키에 직접적인 데이터를 넣지는 않는다. → 암호화한 값을 넣어 두는 곳이 필요함. = 세션(Session)

 

어떻게 쓰는가?

중요한 정보는 서버에서만 들고 있고, 그 정보에 접속할 수 있는 세션 키만 클라이언트에 제공한다.

암호화된 정보만 브라우저에서 볼 수 있게 하는 것.

→ 서버에 세션 객체(session) 생성 후, uniqueInt(키)를 만들어 속성명으로 사용한다.

→ 속성 값에 정보를 저장하고 uniqueInt를 클라이언트로 보내 준다.

될 수 있는 한 여러 유저끼리 겹치지 않는 값으로 키를 지정한다.(서로 다른 계정으로 로그인될수도 있음)

 

const http = require("http");
const fs = require("fs").promises;
const url = require("url");
const qs = require("querystring");

const parseCookies = (cookie = "") =>
  cookie
    .split(";")
    .map((v) => v.split("="))
    .reduce((acc, [k, v]) => {
      acc[k.trim()] = decodeURIComponent(v);
      return acc;
    }, {});

const session = {};

http
  .createServer(async (req, res) => {
    const cookies = parseCookies(req.headers.cookie);
    if (req.url.startsWith("/login")) {
      const { query } = url.parse(req.url);
      const { name } = qs.parse(query);
      const expires = new Date();
      expires.setMinutes(expires.getMinutes() + 5);
      const uniqueInt = Date.now();
      session[uniqueInt] = {
        name,
        expires,
      };
      res.writeHead(302, {
        Location: "/",
        "Set-Cookie": `session=${uniqueInt}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
      });
      res.end();
      // 세션쿠키가 존재하고, 만료 기간이 지나지 않았다면
    } else if (
      cookies.session &&
      session[cookies.session].expires > new Date()
    ) {
      res.writeHead(200, { "Content-Type": "text/plain; charset=utf-8" });
      res.end(`${session[cookies.session].name}님 안녕하세요`);
    } else {
      try {
        const data = await fs.readFile("./cookie2.html");
        res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
        res.end(data);
      } catch (err) {
        res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
        res.end(err.message);
      }
    }
  })
  .listen(8085, () => {
    console.log("8085번 포트에서 서버 대기 중입니다!");
  });

참고 : zerocho님 github

 

단, 실 서버에서는 세션을 직접 구현하지 않는다. → express-session

'기초 > HTTP' 카테고리의 다른 글

https, http2  (0) 2021.10.19
쿠키  (0) 2021.10.14
REST API (보충)  (0) 2021.10.12

댓글()