Node.js Cookie
서버는 누가 요청을 보냈는지 모름
따라서 로그인을 통해 누가 요청을 했는지 알아야 함
쿠키와 세션이 필요
쿠기
- 키=값의 쌍
- 매 요청마다 서버에 동봉해서 보냄
- 서버는 쿠키를 읽어 누구인지 파악
1. 서버 → 쿠키
const http = require('http')
http.createServe((req,res)=>{
console.log(req.url,req.headers.cookie);
res.writeHead(200,{'Set-cookie':'mycookie=test'});
res.end('Hello Cookie');
})
.listen(8083,()=>{
console.log('8083에서 대기중');
});
쿠키확인: Application → cookies에서 확인 가능
- 세션: 쿠키의 만료기간이 존재한다.
- 일반 웹사이트를 이용했을 때 며칠 뒤에 자동으로 로그아웃되어있는 것은 쿠키가 만료되었기 때문이다.
2. 쿠키 → js
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;
}, {});
http.createServer(async (req, res) => {
const cookies = parseCookies(req.headers.cookie); // { mycookie: 'test' }
// 주소가 /login으로 시작하는 경우
if (req.url.startsWith('/login')) {
const { query } = url.parse(req.url);
const { name } = qs.parse(query);
const expires = new Date();
// 쿠키 유효 시간을 현재시간 + 5분으로 설정
expires.setMinutes(expires.getMinutes() + 5);
res.writeHead(302, {
Location: '/',
'Set-Cookie': `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; HttpOnly; Path=/`,
});
res.end();
// name이라는 쿠키가 있는 경우
} else if (cookies.name) {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(`${cookies.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(8084, () => {
console.log('8084번 포트에서 서버 대기 중입니다!');
});
- 현재에는 5분으로 지정되어있다.
- 한글과 같은 경우 쿠키로 넘겼을 때 에러가 발생할 수 있기 때문에
encodeURIComponent
를 통해 변형시켜주어야 한다.