이번에는 이전 게시글에서 '쿠키'를 통해 로그인한 사용자 이름을 저장하는 것을 구현했다면 이번에는 '세션'을 이용해 본다.
- 쿠키 : 클라이언트쪽에 저장되어 보안성이 좋지 않음, 데이터의 수정이 될 수 있음
- 세션 : 서버쪽에 저장되어 쿠키보다 보안이 좋음
> 세션으로 구현하기 위해 랜덤 세션 id를 생성하고 세션 객체에 해당 랜덤 id를 키값으로 필요한 데이터를 담아두고
> 쿠키에 해당 랜덤 세션 키를 저장하는 방식으로 구현한다.
EX)
<app.js>
const http = require('http');
const fs = require('fs');
const url = require('url');
const qs = require('querystring');
const parseCookie = (cookie = '') => {
// name=hyr;expires=ggg
// [ name=hyr, expires=ggg]
return cookie.split(';')
// [ [name, hyr], [expires, ggg] ]
.map(e => e.split('='))
.reduce((acc, [key, val]) => {
acc[key] = decodeURIComponent(val);
return acc;
}, {});
}
// 세션 객체 생성(서버 메모리에 기억)
let session = {
}
const server = http.createServer((req, res) => {
let cookieStr = req.headers.cookie;
let cookies = parseCookie(cookieStr);
if(req.url.startsWith('/login')){
let { query } = url.parse(req.url);
let reqParams = qs.parse(query);
// random int 값 생성
let randomInt = +new Date();
let expires = new Date();
expires.setMinutes(expires.getMinutes() + 5);
// randomInt 키값을 갖는 데이터를 session 객체에 동적 추가해줌
session[randomInt] = {
name : reqParams.name,
expires
};
res.writeHead(302, {
Location : '/',
// session 키값을 쿠키에 저장해 놓는다.
'Set-Cookie' : `sessionId=${randomInt}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`
});
res.end();
} else if(cookies.sessionId && session[cookies.sessionId].expires > new Date()) {
// 쿠키에 저장한 랜덤세션id가 존재하면서 유효시간이 남아있는 경우 접근
res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
res.end(`<h1>${session[cookies.sessionId].name}님 환영합니다.`);
} else { // login page
fs.readFile('./server2.html', (err, data) => {
res.end(data);
});
}
});
server.listen(8082, () => {
console.log('8082 server is listening');
});
server.on('error', (error) => {
console.error(error);
});
'스터디 > Node.js' 카테고리의 다른 글
2. 쿠키와 세션에 서버 데이터 담아 전달하기-쿠키(Cookie)편 (0) | 2020.09.14 |
---|---|
1. util모듈을 이용한 node.js 서버 구성하기(1) (0) | 2020.09.14 |