세션
기초/HTTP2021. 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번 포트에서 서버 대기 중입니다!");
});
단, 실 서버에서는 세션을 직접 구현하지 않는다. → express-session
'기초 > HTTP' 카테고리의 다른 글
https, http2 (0) | 2021.10.19 |
---|---|
쿠키 (0) | 2021.10.14 |
REST API (보충) (0) | 2021.10.12 |
댓글()