npm install --save express-session cookie-parser jsonwebtoken
const session = require('express-session');
app.use(session({
ket: 'sid' // 세션의 키 값
secret: 'keyboard cat', // 비밀키를 지정
resave: false, // 세션이 변경되지 않았어도 저장할 지 여부(false를 권장)
saveUninitialized: true, // 세션이 저장되기전에 uninitialize 상태로 만들어 저장
store: db, // 세션이 서버 메모리가 아닌 다른 저장소에 넣을지 설정
cookie: { // 자동으로 생성되는 쿠키 기본 설정
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}));
// 기본 쿠키 세팅값
Session Store
세션 스토어는 세션이 데이터를 저장하는 곳. 대표적으로 Memory Store, File Store, Mongo Store 가 있고 default값은 Memory Store이다. 메모리는 서버나 클라이언트를 껐다 키면 사라지는 휘발성 특성이 있어 기본적으로 세션은 브라우저를 종료하면 사라진다. npm 모듈인 File Store(설치필요)는 데이터를 파일로 저장한다.
npm install --save session-file-store
기본 저장소가 아닌 다른 저장소를 사용했을 때 폴더가 자동으로 생성된다.
const showSess = (req, res) => {
console.log(req.session)
}; // 정보 확인해서 사용!
session github
요것도 한 번 읽어보자
읽어보자2
세션이랑 쿠키랑 같이 해서 예제 잘 나온듯
const cookieParser = require("cookie-parser");
app.use(cookieParser());
cookie('key', 'value', option)
cookie('key2', 'value2', option)
// 옵션이 없을 경우 세션 쿠키 === 브라우저를 닫으면 사라진다.
option = {
secure: true or false, // 주소가 "https"로 시작하는 경우에만 쿠키 생성
httpOnly: true or false, // http에서만 쿠키활용 가능. defalt: true
path: '/' // 경로. 주어진 경로의 하위 디렉토리에 있는 경우에만 쿠키 설정. defalt: '/' 는 전체.
domain: ".cookie.com", // 하위 도메인을 제외한 도메인이 일치하는 경우에만 쿠키 설정. defalt: loaded
maxAge: null // 60 * 1000 = 60000 = 60초 // 쿠키가 만료되는 시간. 밀리초 단위. 0으로 설정하면 쿠키가 지워진다.
expires: null, // 쿠키의 만료 시간을 표준 시간으로 설정
signed: , // 쿠키의 서명 여부
sameSite: "Strict" or "Lax" or "None" // 서로 다른 도메인간의 쿠키 전송에 대한 보안을 설정. defalt: "Lax"
// "Strict" : 서로 다른 도메인에서 아예 전송 불가능. 보안성은 높으나 편의가 낮다.
// "Lax" : 서로 다른 도메인이지만 일부 예외( HTTP get method / a href / link href )에서는 전송 가능.
// "None" : 모든 도메인에서 전송 가능
// 좀더 자세히는 https://web.dev/samesite-cookies-explained/
}
// 쿠키 생성
cookie('key', 'value', { path: '/' });
// 쿠키 삭제 - 생성할 때와 똑같은 path를 사용
clearCookie('key', { path: '/' });
쿠키정책이란게 있다고 한다.
sameSite: "Lax" 일 경우 사이트 간 요청 위조 CSRF(Cross Site Request Forgery) 취약해질 가능성이 높다.
sameSite : 서로 다른 도메인간의 쿠키 전송에 대한 보안을 설정
mdn Cookies인데..프론트용인 것 같다
자동로그인을 구현하는 예제가 잘 나와있는듯
router.get('/', function(){}) 일 때, 로그인여부를 판단하는게 맞긴한데...
const jwt = require('jsonwebtoken');
const addToken = (result) => {
const { id, user_name } = result.dataValues;
const userInfo = {
user_id: id,
user_name: user_name,
};
userInfo.token = jwt.sign(userInfo, process.env.JWT_SECRET || 'forSecret', {
expiresIn: '1d',
issuer: 'goodthing',
subject: 'user_info'
});
return userInfo;
};
//
const checkToken = (req, res) => {
const token_info = jwt.verify(req.cookies.token, process.env.JWT_SECRET || 'forSecret', function(err, token) {
if (err) {
return res.sendStatus(400);
} else {
return token;
}
})
return token_info;
};
passport라는 것도 있나본데??