1. [클라이언트]로그인 버튼 클릭하면 서버로 로그인 요청
2. [서버] 요청 처리해 응답(쿠키 전달)
서버에서 쿠키를 만들어 클라이언트에 전송할 때는 res.cookie
메서드 사용한다
res.cookie
메서드는 전달인자로 쿠키 이름, 쿠키 값, 쿠키 옵션을 받습니다.
// 만들어줄 쿠키의 옵션
const cookiesOption = {
domain: 'localhost',
path: '/',
httpOnly: true,
sameSite: 'none',
secure: true,
};
if (userInfo.id === undefined) {
res.status(401).send('Not Authorized');
} else if (checkedKeepLogin) { // 쿠키 유효기간 옵션
// max-age 옵션으로 작성하는 경우
cookiesOption.maxAge = 1000 * 60 * 30;
// 단위는 ms(밀리세컨드 === 0.001초)이니 주의하세요! -> 이렇게 작성할 경우 30분동안 쿠키를 유지합니다.
// expires 옵션으로 작성하는 경우에는, 이렇게 작성하시면 됩니다.
// cookiesOption.expires = new Date(Date.now() + 1000 * 60 * 30);
// 지금 시간 + 30분 후에 쿠키를 삭제한다는 의미입니다.
// 쿠키 이름은 cookieId, 값은 userInfo.id, 옵션은 cookiesOption 헤더를 통해 클라이언트로 전달함
res.cookie('cookieId', userInfo.id, cookiesOption);
res.redirect("/userinfo");
} else {
// 로그인을 유지하고 싶지 않은 경우, max-age 또는 expires 옵션을 작성하지 않은 상태 그대로 쿠키를 설정합니다. 이젠 브라우저에 쿠키가 있다면 따로 코드를 작성해주지 않아도 요청을 보낼 때마다 자동으로 서버로 전달됩니다.
res.cookie('cookieId', userInfo.id, cookiesOption);
// 서버의 /useinfo 엔드포인트로 이동(리다이렉트)
res.redirect("/userinfo");
}
res.clearCookie
메서드를 사용한다.res.clearCookie
의 인자는 쿠키 이름, 쿠키 옵션이다.const cookiesOption = {
domain: 'localhost',
path: '/',
httpOnly: true,
sameSite: 'none',
secure: true,
}
res.status(205).clearCookie('cookieId', cookiesOption).send("logout")
Node.js에는 이런 세션을 대신 관리해 주는 express-session 이라는 모듈이 존재한다.
express-session은 세션을 위한 미들웨어로, express 서버에서 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어준다.
express-session를 사용해 위와 같이 세션의 옵션을 지정할 수 있다.
쿠키 옵션과 비슷해 보이지만, 세션의 경우 secret 옵션의 비밀키를 이용해 암호화해 세션 id라는 것을 생성한다. 그리고 암호화한 세션 id를 클라이언트에게 쿠키로 전송한다.
쿠키로 전송된 세션 id는 이에 종속되는 고유한 세션 객체를 가지며 이는 서버에 저장된다. 이때 세션 객체는 유저별로 독립적으로 생성된 객체이므로 유저별로 각각 다른 데이터를 저장할 수 있다.
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
secret: '@codestates',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);
쿠키를 사용해 로그인 구현하는 것과 비슷하나 실제 유저의 id를 사용하지 않고 유저의 id를 세션id로 저장해 사용한다.
req.session.sessionId = userInfo.id