웹 브라우저(클라이언트)에 저장되는 키와 값이 들어있는 작은 데이터 파일
이름, 값, 만료일, 경로 정보로 구성되어 있다.
HTTP 프로토콜은 비연결성(connectionless), 무상태성(stateless)라는 특징을 가지고 있다. 따라서 클라이언트에 대한 이전의 상태 정보 및 현재 통신의 상태가 남아있지 않게 된다.

서버는 다수의 클라이언트와 연결을 계속 유지하기 위한 자원 낭비가 뒤따르고, 비연결성 및 무상태성의 특징을 가진다면 불필요한 자원 낭비를 줄일 수 있다는 장점이 있다. 반면 서버는 클라이언트를 식별할 수 없게 된다는 단점이 있다. 이러한 단점을 보완하기위해 쿠키 및 세션이 사용된다.

npm install cookie-parser
const cookieParser = require("cookie-parser");
// 쿠키 미들웨어
// ver1. 암호화 되지 않은 쿠키
// app.use(cookieParser());
// ver2. 암호화된 쿠키
app.use(cookieParser("secretKey"));
const cookieConfig = {
maxAge: 60 * 1000,
httpOnly: true,
signed: true, // 암호화 된 쿠키 사용시 설정
};
maxAge : 쿠키의 수명, 1000 = 1ms
expires : 만료날짜 GMT 시간 설정 (21 Feb 2024 /12:00 GMT)
path : '/abc' //쿠키가 해당 경로와 그 하위 경로에서만 활성화
secure : https로 통신시에만 쿠키 전송, true/false
signed : 쿠키의 암호화 설정 true/false
httpOnly : http 통신만 접근 허용, true 설정시 document.cookie api에 접근이 불가능하다. Cross-site 스크립팅 공격등을 방지하기 위한 목적으로 사용
// res.cookie(쿠키이름,쿠키값,옵션)
app.get("/setCookie", (req, res) => {
res.cookie("myCookie", "cookie~~", cookieConfig);
res.end();
});

// req.cookies 에 쿠키 정보가 담겨있다.
app.get("/getCookie", (req, res) => {
// console.log(req.cookies); // ver1. 암호화 되지 않은 쿠키일 때
// res.send(req.cookies);
console.log(req.signedCookies); // ver2. 암호화된 쿠키
res.send(req.signedCookies);
});
app.get("/clearCookie", (req, res) => {
res.clearCookie("myCookie", "cookie~~", cookieConfig);
//res.cookie 로 설정했던 인자와 똑같이 써줘야 찾아서 지울 수 있다.
//expires, maxAge 옵션은 일치하지 않아도 삭제 가능
res.send("쿠키 삭제");
});
웹 서버에 저장되는 쿠키
사용자가 웹 브라우저를 통해 접속한 시점부터 연결을 끝내는 시점(브라우저를 종료하거나, 만료시)까지의 시간 동안 일련의 요구를 하나의 상태로 보고 그 상태를 유지 시킨다.
쿠키는 브라우저에 저장되어 유출되거나 암호화 하더라도 복호화가 가능하므로 보안상 결함이 존재한다. 세션은 비밀번호를 비롯한 인증 정보를 쿠키가 아닌 서버 측에서 저장하고 관리하는 방식으로 쿠키에 비해 보안상 안전한 방법이라고 할 수 있다.

npm install express-session
const session = require("express-session");
const sessionConfig = {
secret: "secretKey",
resave: false,
saveUnintialized: false,
cookie: {
httpOnly: true,
},
};
app.use(session(sessionConfig));
secret : 안전한 쿠키 전송을 위한 서명값 (필수)
resave : 세션 수정사항 생기지 않더라도 매 요청마다 세션을 다시 저장할지 (false 권장)
saveUnintialized : 세션에 저장할 내용이 없더라도 처음부터 세션을 생성할지 (false 권장)
cookie : 세션 쿠키에 대한 설정 (cookieConfig 참고)
secure : https에 대한 세션을 주고 받을지 (true,false)
name : 세션쿠키의 이름 (default connect.sid)
// 세션 설정하기
app.get("/set", (req, res) => {
// req.session.키이름="값"
req.session.name = "eic2021";
res.send("세션 설정 완료");
});
// 세션 확인하기
app.get("/name", (req, res) => {
console.log(req.sessionID);
// 9k-7vxFMnq0HfHabbnCzkT-UyA6FTvU2
//세션 정보 확인
console.log(req.session);
// Session {
// cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
// name: 'eic2021'
// }
console.log(req.session.name);
// eic2021
// res.send("서버에서 확인됨");
res.json({ id: req.sessionID, name: req.session.name });
});
// 세션 삭제하기
app.get("/destroy", (req, res) => {
req.session.destroy((err) => {
if (err) {
res.status(500).send("server error");
throw err;
}
res.send("세션 삭제 완료");
});
});
https://velog.io/@neity16/NodeJS-%EC%9D%B8%EC%A6%9D%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-%ED%86%A0%ED%81%B0
https://dream-and-develop.tistory.com/196
https://velog.io/@vagabondms/Cors%EC%99%80-Cookie-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Session-%EA%B8%B0%EB%B0%98-%EC%9D%B8%EC%A6%9D