쿠키와 세션은 사용자 정보를 저장하고 관리하는 데 사용되는 두 가지 주요 메커니즘입니다.
개발자 Lou Montulli가 웹 쿠키를 개발하던 중 데이터를 저장하는 방식에 대해 고민하다가 그 당시 사용되었던 특정 데이터를 담고있는 작은 조각이라는 뜻을 지닌 magic cookie라는 용어를 떠올렸고 그렇게 cookie라고 불렸다합니다.
클라이언트 측에 저장되며, 사용자가 삭제하면 관련 정보가 삭제됩니다.
데이터를 여러 사이트에 공유할 수 있기 때문에 보안에 취약할 수 있습니다.
우리가 쇼핑몰에서 뭐 하나 보면, 광고가 따라 다니는 이유도 쿠키때문이죠.
세션은 서버측에서 사용자의 상태를 저장하는 메커니즘입니다. 사용자가 접속하면 서버는 고유 세션 ID를 생성하여 클라이언트에게 전달하고 이 세션ID를 통하여 서버는 해당 사용자 정보를 추적합니다.
쿠키보다 안전하겠죠.
2가지의 방법이 있습니다.
set-cookie
res.cookie()
set-cookie 의 경우 아래와 같이 작성합니다.
let expire = new Date();
expire.setMinutes(expire.getMinutes() + 60);
res.writeHead(200, {
'Set-Cookie': `name=sparta; Expires=${expire.toGMTString()}; HttpOnly; Path=/`,
});
return res.end();
현재 시간 + 쿠키를 유지할 시간을 expire 변수에 담고,
respon의 헤드부분에 Set-Cookie 안 데이터와 만료시간, args를 담아서 내보냅니다.
res.cookie()는 더 간편합니다.
let expires = new Date();
expires.setMinutes(expires.getMinutes() + 60);
res.cookie('name', 'sparta', {
expires: expires
});
return res.end();
기본적으로 쿠키는 Request의 헤드부분에 담겨져있습니다.
const cookie = req.headers.cookie;
console.log(cookie);
return res.status(200).json({ cookie });
헤더부분에 있는 쿠키를 변수에 담고
그대로 json으로 응답해주면 됩니다.
cookie-parser 미들웨어를 사용하면, 더 간단하게 접근하고 쿠키의 내용을 json 객체로 받을 수 있습니다.
import cookieParser from 'cookie-parser';
app.use(cookieParser());
app.get('/get-cookie', (req, res) => {
const cookies = req.cookies;
console.log(cookies);
return res.status(200).json({ cookie: cookies });
});
req.headers.cookie 부분이 req.cookies 로 바뀐 것을 알 수 있고, 조회되는 쿠키 정보도 json 객체인 것을 알 수 있습니다.
let session = {};
app.get('/set-session', function (req, res, next) {
const name = 'sparta';
const uniqueInt = Date.now();
session[uniqueInt] = { name };
res.cookie('sessionKey', uniqueInt);
return res.status(200).end();
});
set-session이 호출되면 name='sparta' 의 정보를 세션에 삽입하고 해당 정보를 검색하기 위한 시간정보를 쿠키로 전달합니다.
app.get('/get-session', function (req, res, next) {
const { sessionKey } = req.cookies;
const name = session[sessionKey];
return res.status(200).json({ name });
});
쿠키에 담긴 sessionKey를 변수에 담아주고 그걸 토대로 세션 객체에서 조회 후 변수에 저장하여 json으로 응답합니다.